STM32F407串口发送中断与接收中断的问题

2019-07-20 23:38发布

本帖最后由 cjlong 于 2016-2-29 10:36 编辑

在做一个与电机驱动器通讯的项目的时候需要用到串口再通过485发送数据和接收数据
遇到的问题是,用串口循环发送数据的时候,可以用串口接收中断接收到数据,但是用串口发送中断发送数据的时候,串口就不能接收到数据,TC中断和TXE中断都试过了,都不能行
调试了好几天都找不到问题在哪儿,大家帮忙看看,到底是哪里有什么问题,谢谢大家!

串口配置代码如下:

      
void RS485_Init(u32 bound)
{           
        
       GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
        
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
        
  //′®¿ú2òy½Å¸′óÃó3éä
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_USART2); //GPIOA2
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_USART2); //GPIOA3
        
        //USART2   
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; //
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;      
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_Init(GPIOA,&GPIO_InitStructure); //
        
        //PG8íÆíìêä3ö£¬485Ä£꽿ØÖÆ  
       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //GPIOG8
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;      
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_Init(GPIOG,&GPIO_InitStructure); //
        

   //USART2
        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(USART2, &USART_InitStructure);
        
  USART_Cmd(USART2, ENABLE);  //ê1Äü′®¿ú 2
        
        USART_ITConfig(USART2, USART_IT_TC, ENABLE);
        
#if EN_USART2_RX        
        USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);

        //Usart2 NVIC ÅäÖÃ
  NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority =2;               
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        
        NVIC_Init(&NVIC_InitStructure);        

#endif        
        
        RS485_TX_EN=0;                                
}




数据发送函数://分割线上面注释的使用循环发送的方式,下部试图用中断发送的方式
void RS485_Send_Data(u8 *buf,u8 len)
{
//        u8 t;
//        RS485_TX_EN=1;                        
//          for(t=0;t<len;t++)               
//        {
//          while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET);            
//    USART_SendData(USART2,buf[t]); //
//        }         
//        while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET);
//        
//        TIM7_ENABLE();        
//        receCount = 0;         
//        RS485_TX_EN=0;                                 
        
/*******************************************************/        
        RS485_TX_EN=1;
        sendPos = 0;
        USART_SendData(USART2,sendBuf[sendPos++]);
        
}



串口中断函数:
void USART2_IRQHandler(void)
{
        u8 res;            
        if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
        {                 

                USART_ClearFlag(USART2, USART_FLAG_RXNE);        
                if(USART_GetFlagStatus(USART2,USART_FLAG_PE)==RESET)
                {
                        receBuf[receCount]= USART_ReceiveData(USART2);
            receCount++;         
                }        
        }  

  if(USART_GetITStatus(USART2, USART_IT_TC) != RESET)        
        {
                if(firstTime == 1)
                {
                                USART_ClearFlag(USART2, USART_FLAG_TC);
                                firstTime = 0;
                                printf("first time of TC ");
               
                }
                else if(sendPos < sendCount)
                                {
                                                USART_SendData(USART2,sendBuf[sendPos++]);
                                                printf("send %dth data ",sendPos);
                                }
                                else
                                {        
                                                USART_ClearFlag(USART2, USART_FLAG_TC);
                                                TIM7_ENABLE();        
                                                receCount = 0;         
                                                RS485_TX_EN=0;                                   
                                }
        
        }
}



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