文章
博客 网店

 STM32F0 USART中断方式收发时注意事项


STM32F0的USART发送数据的标志位TC貌似和F1不太一样,在没有数据发送的情况下无法清除掉。
所以中断处理程序应如下:

//USART1中断处理
void USART1_IRQHandler(void)
{
  uint16_t isr=USART1->ISR;
  uint8_t c;
  
  //接收到一个字节
  if((isr & USART_FLAG_RXNE) == USART_FLAG_RXNE)
  {
    c=(uint8_t)(USART1->RDR);
    USART_ClearITPendingBit(USART1,USART_FLAG_RXNE);
    if(g_RxFlag==0)//没有接收数据包
    {
      g_RxBuffer[g_RxIndex++]=c;
      UartTimerEnable();
    }
    return ;
  }
  
  //发送处理
  if((isr & USART_FLAG_TXE) == USART_FLAG_TXE)//发送寄存器空
  {
    if(g_TxSize > g_TxIndex)
       USART_SendData(USART1, g_TxBuffer[g_TxIndex++]);
    else
    {
      USART_ITConfig( USART1, USART_IT_TXE, DISABLE );//发送寄存器空中断禁止
      USART_ITConfig( USART1, USART_IT_TC, ENABLE );  //发送完成中断使能
    }
  }

  //发送完成处理
  isr=USART1->ISR;//重新读标志位
  if((isr & USART_FLAG_TC) == USART_FLAG_TC)//发送完成
  {
    USART_ITConfig( USART1, USART_IT_TC, DISABLE );  //发送完成中断使能
    RS485_RX_SEL;
    USART_ClearITPendingBit(USART1,USART_FLAG_TC);
    g_TxFlag=0;
  }    
}

芯艺工作室    蒙ICP备06005492号
Copyright© 2004-2023 ChipArt Studio All Rights Reserved