STM32F0 USART中断方式收发时注意事项
来源: 芯艺
本站广告
  ENC28J60+uIP 基于TCP的MODBUS IO示例
  ENC28J60+uIP HTTP GET方式将温度数据上传到web服务器
  FM1702读写S50(也叫M1)卡相关资料
  ENC28J60+uIP DHCP动态获取IP及UDP广播服务端示例
  SYN480R+C720实现遥控开关示例

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;
  }    
}



声明:芯艺工作室(http://www.chipart.cn)保留所有权力,转载请注明出处!

芯艺工作室    蒙ICP备06005492号

Copyright© 2004-2020 ChipArt Studio All Rights Reserved