你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32串口溢出中断问题

[复制链接]
STMCU小助手 发布时间:2021-1-21 12:51
STM32串口溢出中断问题
    之前调试程序,遇到了串口溢出中断的问题,导致主程序被卡死。这里总结分享一下经验,希望对读者有用。
   
    对于STM32F103系列单片机,使能接收中断后,溢出中断就会自动被使能。那什么时候会发生溢出中断呢?在RXNE=1 的的条件下(也就是上次数据还没有读走),串口接收寄存器又接收好了一个字节的数据并准备往RDR 寄存器去转移的时候,会产生溢出中断。
    产生溢出中断典型的情况有:
    1.串口接收中断被更高优先级的中断打断,且打断时间比较长。
    2.擦写单片机内部flash时,耗时较长,导致串口中断无法响应。
    串口接收的数据越频繁,发生溢出中断的概率越大,如果程序中没有对溢出中断进行处理,就会导致程序死机等情况。
    解决办法:
    1.判断并清除溢出中断标志。清除溢出标志只需要依次读取SR和DR寄存器即可。在串口中断中添加如下程序:
  1. if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_ORE))//溢出标志8 j( B, r; N7 M; z8 n5 p
  2. {
    * d6 x* p7 R. r* X
  3.   uint32_t temp = USART1->SR;- @$ O/ Q7 y/ b5 ~
  4.   temp = USART1->DR;4 j9 b0 ~/ Y( Z' B5 I, g( j- d
  5. }
复制代码
0 g9 ]8 X; v; f: q' D( `4 T
    对于使用STM32CubeMX生成的程序,编写串口错误回调函数即可。
  1. void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart); l8 W( E1 i" v
  2. {) y4 \9 N9 V# P! G
  3.   if(huart->ErrorCode & HAL_UART_ERROR_ORE)//溢出错误
    3 l2 p! J2 }" n# ?- D, U. P4 f
  4.   {2 \6 R# Q3 [- j* e1 a
  5.     uint32_t temp = huart->Instance->SR;
    & \2 n3 {; m& W# J' y
  6.     temp = huart->Instance->DR;
    6 g0 l) S6 U, s- ?
  7.   }/ u0 Q6 Q8 f! O+ A* L0 ]4 C6 |
  8. }
复制代码

+ ~9 p" n3 E: u: |( l
        2.另外一种方法就是不使能接收中断,比如采用DMA+空闲中断的方式。可以参考之前的文章《STM32CubeMX之串口通信》
文章出处: 嵌入式技术开发

) z3 ?* k5 b- g5 k" ~  j
8 r- y* w. o: n
赞 收藏 1 评论0 发布时间:2021-1-21 12:51

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版