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;
}
}
本文详细介绍了STM32F0中USART发送数据的中断处理,特别是发送完成(TC)标志的使用。在STM32F0中,USART的TC标志在没有数据发送时可能无法正常清除,因此需要在中断处理程序中特别处理。文章通过示例代码展示了如何正确配置和响应USART的TXE和TC中断,确保数据的顺利发送和中断的及时响应。
http://www.chipart.cn/ar_list.asp?id=185
1019

被折叠的 条评论
为什么被折叠?



