在使用USART通信的时候,发现老是卡在USART中断里。我使能了发送完成中断(USART_IT_TC)和空闲中断(USART_IT_IDLE),并且调用了官方函数库清中断标志位的函数,发现无法清除标志位。
官方函数库中有两条语句都可以清除标志位,
1.
/**
* @brief Clears the USARTx's pending flags.
* @param usart: Select the USART or the USART peripheral.
* @param usart_flag: specifies the flag to clear.
* This parameter can be any combination of the following values:
* @ARG USART_FLAG_RXNE
* @retval : None
*/
void USART_ClearFlag(USART_TypeDef *usart, uint32_t usart_flag)
{
usart->SR = ~(usart_flag);
}
2.
/**
* @brief Clears the USARTx interrupt pending bits.
* @param usart: Select the USART or the USART peripheral.
* This parameter can be one of the following values:
* USART1.
* @param usart_it: specifies the interrupt pending bit to clear.
* This parameter can be one of the following values:
* @arg USART_IT_RXNE
* @retval : None
*/
void USART_ClearITPendingBit(USART_TypeDef *usart, uint32_t usart_it)
{
usart->SR = ~(usart_it);
}
但是看他的注释,这两条语句只对 USART_IT_RXNE 这个标志位起作用,这个可能是想对标STM32的库函数,单只对这一个标志位有效,属实是有些鸡肋了。
而真正想要清除上面的两个标志位需要使用他数据手册中提供的方法:
1. 清除 USART_IT_TC 标志位有且只有一种方法,就是在使能USART的发送的情况下,向数据寄存器写入数据。如果不想一直卡在发送完成中断里的话,就只能在发送完最后一个字节后关闭发送完成中断。(对于USART_IT_TXE标志位也是差不多的逻辑)
2. 而对于清除 USART_IT_IDLE 标志位,则又有不同的方法,如手册中所示,需要先读取状态寄存器,然后再对USART_DR执行读访问才能清除该标志位。
只能说,开发的时候还是得仔细阅读数据手册和用户手册。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/joseph_liang/article/details/146328152
|