• <table id="eeggg"><source id="eeggg"></source></table>
  • <li id="eeggg"><option id="eeggg"></option></li>
  • <td id="eeggg"></td>
    0
    • 聊天消息
    • 系统消息
    • 评论与回复
    登录后你可以
    • 下载海量资料
    • 学习在线课程
    • 观看技术视频
    • 写文章/发帖/加入社区
    创作中心

    完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

    3天内不再提示

    一个隐秘的串口中断BUG案例分享

    嵌入式USB开发 ? 来源:嵌入式USB开发 ? 作者:嵌入式USB开发 ? 2023-09-19 14:05 ? 次阅读

    本文转自公众号,欢迎关注
    https://mp.weixin.qq.com/s/uzaGLFTDBAn8wyR84yaiIw

    一. 前言

    本文分享一个STM32L4平台串口驱动比较隐秘的BUG,分享的目的不在结论本身,而在于问题的分析过程,和如何形成标准,形成checklist,避免类似问题,以及在嵌入式开发中的思想。

    二.问题描述

    在某个项目代码时发现以下问题, 串口中断处理函数中,只对IDLE和RXNE标志进行了处理,而对溢出标志没有处理。 根据手册描述如果使能接收非空中断即RXNEIE=1时,则有ORE标识溢出时也会进入中断,该标志需要手动清除,如果不清除则会反复进入中断。项目中是使能接收非空中断的即RXNEIE=1。

    图片

    图片

    三.问题验证

    在中断服务函数中打断点,然后串口调试助手输入1个字符,进入中断处理函数

    图片

    此时ORE为0,RXN=1表示收到数据无溢出。

    然后串口调试助手中输入多个数据,然后再运行程序。

    图片

    再次进入中断,此时ORE置位,由于没有对ORE标志清除,所以会一直进中断,导致程序运行异常。

    四.修改

    对ORE标志进行清除,一般的清除时序是读SR再读DR 再写1清除ORE标志。

    图片

    再进行上述测试,ORE在每次中断后都会清除,不再会出现该情况。

    图片

    图片

    正确的处理应该如下:即只要有任何标志则清除相应的标志。

    图片

    五.总结

    1.中断服务函数一般要清除所有的标志,而不是只清除自己关心的标志。但是要考虑可能会清掉别人没有处理掉的标志,所以具体问题具体分析。

    2.中断服务函数清标志一定要按照手册要求时序,有些是写0清除,有些是写1清除,有些是先读状态寄存器再读数据寄存器清除等等。

    3.一定要考虑异常,一般情况下没有异常不代表任何情况没有异常,温度等环境改变则可能偶然的异常变为必然的错误。

    4.一定要测试异常,实际该问题可以测试。比如结合仿真器白盒测试,也可以比如模拟RX引脚一直拉低模拟异常,生成任意PWM波形到RX引脚模拟干扰数据,模拟大负载等进行黑盒测试。

    5.如果串口是先初始化使能,然后启动Freertos时才使能中断,那么使能中断前可能就已经有溢出ORE错误了。这个问题是随机的,出现概率小,一出现就会导致系统不能启动的假象,如果RX引脚浮空,或者上电瞬间有干扰,或者高低温等环境因素改变导致RX引脚出现干扰数据的概率增加,则可能导致每次启动都失败原项目从代码注释来看初始化位置修改过了,应该就是遇到过这个问题改的,但是系统启动前还进行了一大段外设初始化也需要考虑除了串口外其他外设是否有该问题。

    6.不排除该问题与之前的接上串口导致不能启动等问题相关,并且有高温等可能更容易出现的情况,实际高温应该跟波特率无关,而可能是高温更容易产生干扰数据等。

    7.对于使用RTOS的系统,不要在OsStart之前初始化驱动使能外设,因为一般OsStart之前都是不使能中断的,OsStart之前使能外设则再使能中断的一刹那可能会出现未预料的中断导致异常。

    从原项目代码注释来看应该是遇到过这个问题后面改了,使能接收改到了初始化任务中。

    图片

    但是从原项目代码来看main函数之后,系统启动之前还是进行了太多的处理,甚至进行了文件系统的操作等,这种处理比较危险,建议除了系统启动必要的初始化其他的都放在初始化任务重初始化。

    图片

    如系统启动前只进行底层系统必要初始化然后创建shell任务,其他初始化都在shell任务中进行。

    图片

    7.解决问题一定要找到根本原因而不是消除现象,比如上述问题原来项目其实发现有问题但是都是在修改串口初始化位置消除现象,而没有去找根本原因。这在嵌入式开发中是大忌。

    审核编辑:汤梓红

    声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
    • 嵌入式
      +关注

      关注

      4767

      文章

      17264

      浏览量

      277683
    • 中断
      +关注

      关注

      5

      文章

      807

      浏览量

      40745
    • 串口
      +关注

      关注

      14

      文章

      1329

      浏览量

      73286
    • 函数
      +关注

      关注

      3

      文章

      3220

      浏览量

      60661
    • BUG
      BUG
      +关注

      关注

      0

      文章

      150

      浏览量

      15495
    收藏 人收藏

      评论

      相关推荐

      外部中断串口中断问题

      外部中断 分别往串口发a和b串口接收中断 接到什么数据就发什么数据问题:程序烧写后 复位运行后 分别轮流触发 EINT0 EINT2 能够发出相应的数据 正常串口接收
      发表于 04-28 09:59

      51单片机串口中断使用总结

      串口中断使用总结,有程序,可以参考。
      发表于 03-28 10:00 ?13次下载

      单片机学习教程之外部中断和定时器及串口中断的资料和程序说明

      中断和定时器及串口中断的资料和程序说明。CPU收到中断请求,停下正在处理的工作A,去处理事件B,处理完后继续回到中断的地方继续执行事件A的过程,称为中断 51有5
      发表于 04-18 17:27 ?5次下载
      单片机学习教程之外部<b>中断</b>和定时器及<b>串口中断</b>的资料和程序说明

      Arduino的实验例程之串口中断的程序免费下载

      串口中断的程序免费下载。
      发表于 02-25 17:39 ?13次下载

      IAP15F2K61S2串口中断快速编程问题

      串口中断问题之前,需要明白串口中断内容包括哪些部分,我概括为主要3部分:串口中断的初始化,串口中断函数入口函数设置,串口中断的发送函数设置。.大意讲解,例程为例我先以第十届国赛的程序题为例
      发表于 11-23 17:36 ?10次下载
      IAP15F2K61S2<b>串口中断</b>快速编程问题

      STM32使用CubeMAX配置的串口中断接收方法

      串口中断接收方法目录1.定位串口中断发生的地方2.处理串口中断接收的流程是:(1)初始化串口(2)在main中第次调用接收中断函数(这个也是比较关键的)(3)重写
      发表于 12-14 18:45 ?25次下载
      STM32使用CubeMAX配置的<b>串口中断</b>接收方法

      STM32F407串口中断配置

      串口中断的通信。至于为什么库函数不行,lz还没有发现原因。 串口中断适合用于发送数据较少的情况
      发表于 12-24 18:48 ?1次下载
      STM32F407<b>串口中断</b>配置

      STM8S串口中断卡死调试记录

      直在响应UART1接收中断。调试步骤如下:怀疑是串口中断里做了数据解析工作,导致在解析途中又收到了第二串口接收中断,然后发生异常。解决办法是在串口接收中断中关闭串口接收中断,数...
      发表于 12-27 18:51 ?3次下载
      STM8S<b>串口中断</b>卡死调试记录

      STM32f103------串口中断及其配置

      串口中断及其配置使能串口时钟和GPIO时钟配置GPIO(TX、RX)配置串口开启中断,初始化NVIC
      发表于 12-27 19:30 ?21次下载
      STM32f103------<b>串口中断</b>及其配置

      串口中断服务函数的触发

      串口中断服务函数的触发USART1_IRQHandler(void)1. 串口发送中断下图为状态寄存器(USART_SR)中的位7、位6说明,发送完帧并且发送数据寄存器为空时,位6置1。下图为控制
      发表于 12-28 19:01 ?19次下载
      <b>串口中断</b>服务函数的触发

      串口中断丢失数据问题

      串口中断发送与接收出现数据丢失问题串口中断的接收器具有双缓冲结构,即在从接收寄存器中读出前已收到的字节之前,便能接收第2字节,如果第2字节已经接收完毕,第1字节还没有被读出
      发表于 02-17 00:13 ?2858次阅读

      STM32串口中断 DMA接收的几点注意地方

      串口中断、DMA接收的几点注意地方
      的头像 发表于 03-04 13:57 ?2w次阅读

      STM32G0开发笔记:串口中断的使用

      串口中断的使用。
      的头像 发表于 01-17 10:46 ?1157次阅读

      STM32串口中断应用实例

      串口接收中断,通过串口助手模拟上位机发送指令、STM32F4串口中断接收到指令后根据指令选择开关LED小灯。
      的头像 发表于 04-20 11:45 ?1093次阅读
      STM32<b>串口中断</b>应用实例

      CW32L083串口中断+定时器实现不定长数据接收

      串口中断加定时器中断实现串口的不定长数据的接收,特别适用于AT指令的接收。
      的头像 发表于 07-12 09:00 ?449次阅读
      CW32L083<b>串口中断</b>+定时器实现不定长数据接收
      新精品国偷自产在线
    • <table id="eeggg"><source id="eeggg"></source></table>
    • <li id="eeggg"><option id="eeggg"></option></li>
    • <td id="eeggg"></td>