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