关于两个STM32F103主控板实现串口通信的接收中断函数问题

2019-07-20 15:27发布

两块STM32F103主控板,用各自的USART1 通信收发数据,(都是通过外部中断触发)一块能收能发,一块只能发送数据不能接收数据,硬件经过排查没有问题,想问问前辈们我的代码是否有误。(其他配置经过验证是没问题的,现在排查之后觉得最有可能的就是接收函数问题)以下是串口配置和中断服务函数代码:
我发送的数组为  u8 Work_CH2[10] ={0x31,0x31,0x0d,0x0a};

外部中断服务函数为:
void EXTI4_IRQHandler(void)                                           {
  int i ;
  if(EXTI_GetITStatus(EXTI_Line4)!=RESET)                              
        {               
         EXTI_ClearITPendingBit(EXTI_Line4);                             
        TIM_SetCompare1(TIM3,6000);                                                  
         for(i=0;i<4;i++)                                                   
          {
           USART_SendData(USART1, Work_CH2);
           while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);             
          }
         }
}

void usart1_init(u32 bound)                                                
{
  GPIO_InitTypeDef GPIO_InitStructure;
  USART_InitTypeDef USART_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
         
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);
  USART_DeInit(USART1);                                                   
         
    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);                              

    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);                                 
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;                  
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                                      
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                      
    NVIC_Init(&NVIC_InitStructure);                                                 

    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);                           
    USART_Cmd(USART1, ENABLE);                                                

}
       

void USART1_IRQHandler(void)                                                   
          {
            u8 Res;       
            if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)        
                {
                 Res =USART_ReceiveData(USART1);                                    
                        if((USART_RX_STA&0x8000)==0)                                       
                  {
                    if(USART_RX_STA&0x4000)                                          
                     {
                      if(Res!=0x0a)USART_RX_STA=0;                                      
                  else
                     {
                        USART_RX_STA|=0x8000;                                          
                     }                                                       
                     }
            else                                                              
                 {       
                  if(Res==0x0d)  USART_RX_STA|=0x4000;
                  else
                   {
                     USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
                     USART_RX_STA++;
                    if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;               
                   }                 
                   }
          }                         
      }
   }





友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。