找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2984|回复: 0
打印 上一主题 下一主题
收起左侧

STM32串口3与串口1传数据只能传一半就不能呢个传了怎么回事

[复制链接]
跳转到指定楼层
楼主
ID:262045 发表于 2018-3-7 18:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
定时器
extern u8 flag_200ms,timex;
extern vu16 USART3_RX_STA;
extern vu16 USART1_RX_STA;
void TIM3_IRQHandler(void)
{  
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
{        
  flag_200ms++;
  timex=1;
  TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );   
  
}     
}
      
void TIM2_IRQHandler(void)
{  
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{  

  USART3_RX_STA|=1<<15;
  TIM_ClearITPendingBit(TIM2, TIM_IT_Update  );     
  TIM_Cmd(TIM2, DISABLE);   
}     
}
void TIM4_IRQHandler(void)
{  
if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)
{  

  USART1_RX_STA|=1<<15;
  TIM_ClearITPendingBit(TIM4, TIM_IT_Update  );      
  TIM_Cmd(TIM4, DISABLE);  
}     
}

   
void TIM2_Int_Init(u16 arr,u16 psc)
{
NVIC_InitTypeDef NVIC_InitStructure;
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_TimeBaseStructure.TIM_Period = arr;
TIM_TimeBaseStructure.TIM_Prescaler =psc;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE );

TIM_Cmd(TIM1,ENABLE);

NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0 ;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;  
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   
NVIC_Init(&NVIC_InitStructure);

}
void TIM3_Int_Init(u16 arr,u16 psc)
{
NVIC_InitTypeDef NVIC_InitStructure;
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_TimeBaseStructure.TIM_Period = arr;
TIM_TimeBaseStructure.TIM_Prescaler =psc;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE );

TIM_Cmd(TIM3,ENABLE);

NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;  
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   
NVIC_Init(&NVIC_InitStructure);

}  
void TIM4_Int_Init(u16 arr,u16 psc)
{
NVIC_InitTypeDef NVIC_InitStructure;
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
TIM_TimeBaseStructure.TIM_Period = arr;
TIM_TimeBaseStructure.TIM_Prescaler =psc;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE );

TIM_Cmd(TIM4,ENABLE);

NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;  
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   
NVIC_Init(&NVIC_InitStructure);

}  

串口1的配置
u8 USART1_RX_BUF[USART1_MAX_RECV_LEN];     
u8  USART1_TX_BUF[USART1_MAX_SEND_LEN];   
vu16 USART1_RX_STA=0;   
void USART1_IRQHandler(void)
{
u8 Res;      
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{  
  Res =USART_ReceiveData(USART1);   
   while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET);
  USART_SendData(USART3,Res);   
  
  
  if((USART1_RX_STA&(1<<15))==0)
  {
   if(USART1_RX_STA<USART1_MAX_RECV_LEN)
   {
    TIM_SetCounter(TIM2,0);
    if(USART1_RX_STA==0)   
    {
     TIM_Cmd(TIM2,ENABLE);
    }
    USART1_RX_BUF[USART1_RX_STA++]=Res;   
   }else
   {
    USART1_RX_STA|=1<<15;   
   }
  }
}                  
}   

void usart_init(u32 bound)
{  
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);


  USART_DeInit(USART1);
   //USART1_TX   PA9
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
   
    //USART1_RX   PA10
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//????ê?è?
  GPIO_Init(GPIOA, &GPIO_InitStructure);  

USART_InitStructure.USART_BaudRate = bound;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  
USART_Init(USART1, &USART_InitStructure);
  
USART_Cmd(USART1, ENABLE);                    


  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);  

//éè???D??ó??è??
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   
NVIC_Init(&NVIC_InitStructure);


TIM4_Int_Init(2000-1,7200-1);  
USART1_RX_STA=0;  
TIM_Cmd(TIM4,DISABLE);   
}
串口3的配置
u8 USART3_RX_BUF[USART3_MAX_RECV_LEN];     
u8  USART3_TX_BUF[USART3_MAX_SEND_LEN];   

vu16 USART3_RX_STA=0;   
void USART3_IRQHandler(void)
{
u8 res;      
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
{  
  res =USART_ReceiveData(USART3);

  
   while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
  USART_SendData(USART1,res);
  
  if((USART3_RX_STA&(1<<15))==0)
  {
   if(USART3_RX_STA<USART3_MAX_RECV_LEN)
   {
    TIM_SetCounter(TIM2,0);              
    if(USART3_RX_STA==0)     
    {
     TIM_Cmd(TIM2,ENABLE);
    }
    USART3_RX_BUF[USART3_RX_STA++]=res;   
   }else
   {
    USART3_RX_STA|=1<<15;
   }
  }
}                  
}   

void usart3_init(u32 bound)
{  
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);


  USART_DeInit(USART3);
   //USART3_TX   PB10
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB10
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOB, &GPIO_InitStructure); //3?ê??ˉPB10
   
    //USART3_RX   PB11
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOB, &GPIO_InitStructure);  

USART_InitStructure.USART_BaudRate = bound;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  
USART_Init(USART3, &USART_InitStructure); /
  
USART_Cmd(USART3, ENABLE);                  


  USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);


NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   
NVIC_Init(&NVIC_InitStructure);


  TIM2_Int_Init(2000-1,7200-1);  
USART3_RX_STA=0;  
  TIM_Cmd(TIM2,DISABLE);   
}
int main(void)
{      

delay_init();      
LED_Init();  
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

  TIM3_Int_Init(2000,7200);//200ms
  usart_init(115200);      
usart3_init(115200);
while(1)
{
        }


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表