STM32
回帖(1)
2021-12-7 11:11:05
之前调试程序,遇到了串口溢出中断的问题,导致主程序被卡死。这里总结分享一下经验,希望对读者有用。
对于STM32F103系列单片机,使能接收中断后,溢出中断就会自动被使能。那什么时候会发生溢出中断呢?在RXNE=1 的的条件下(也就是上次数据还没有读走),串口接收寄存器又接收好了一个字节的数据并准备往RDR 寄存器去转移的时候,会产生溢出中断。 产生溢出中断典型的情况有:
1.串口接收中断被更高优先级的中断打断,且打断时间比较长。 2.擦写单片机内部flash时,耗时较长,导致串口中断无法响应。
串口接收的数据越频繁,发生溢出中断的概率越大,如果程序中没有对溢出中断进行处理,就会导致程序死机等情况。
解决办法:
1.判断并清除溢出中断标志。清除溢出标志只需要依次读取SR和DR寄存器即可。在串口中断中添加如下程序:
- if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_ORE))//溢出标志
- {
- uint32_t temp = USART1->SR;
- temp = USART1->DR;
- }
复制代码
对于使用STM32CubeMX生成的程序,编写串口错误回调函数即可。
- void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
- {
- if(huart->ErrorCode & HAL_UART_ERROR_ORE)//溢出错误
- {
- uint32_t temp = huart->Instance->SR;
- temp = huart->Instance->DR;
- }
- }
复制代码
2.另外一种方法就是不使能接收中断,比如采用DMA+空闲中断的方式。可以参考之前的文章《STM32CubeMX之串口通信》
之前调试程序,遇到了串口溢出中断的问题,导致主程序被卡死。这里总结分享一下经验,希望对读者有用。
对于STM32F103系列单片机,使能接收中断后,溢出中断就会自动被使能。那什么时候会发生溢出中断呢?在RXNE=1 的的条件下(也就是上次数据还没有读走),串口接收寄存器又接收好了一个字节的数据并准备往RDR 寄存器去转移的时候,会产生溢出中断。 产生溢出中断典型的情况有:
1.串口接收中断被更高优先级的中断打断,且打断时间比较长。 2.擦写单片机内部flash时,耗时较长,导致串口中断无法响应。
串口接收的数据越频繁,发生溢出中断的概率越大,如果程序中没有对溢出中断进行处理,就会导致程序死机等情况。
解决办法:
1.判断并清除溢出中断标志。清除溢出标志只需要依次读取SR和DR寄存器即可。在串口中断中添加如下程序:
- if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_ORE))//溢出标志
- {
- uint32_t temp = USART1->SR;
- temp = USART1->DR;
- }
复制代码
对于使用STM32CubeMX生成的程序,编写串口错误回调函数即可。
- void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
- {
- if(huart->ErrorCode & HAL_UART_ERROR_ORE)//溢出错误
- {
- uint32_t temp = huart->Instance->SR;
- temp = huart->Instance->DR;
- }
- }
复制代码
2.另外一种方法就是不使能接收中断,比如采用DMA+空闲中断的方式。可以参考之前的文章《STM32CubeMX之串口通信》
举报
更多回帖