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

审核编辑:汤梓红

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

    关注

    5068

    文章

    19008

    浏览量

    302900
  • 中断
    +关注

    关注

    5

    文章

    895

    浏览量

    41382
  • 串口
    +关注

    关注

    14

    文章

    1543

    浏览量

    76156
  • 函数
    +关注

    关注

    3

    文章

    4303

    浏览量

    62408
  • BUG
    BUG
    +关注

    关注

    0

    文章

    155

    浏览量

    15649
收藏 人收藏

    评论

    相关推荐

    用stm32cubemx的串口中断接收时,过段时间串口中断不进了怎么解决?

    小时多串口中断进不去了,我用两根线挂在总线上在电脑上用串口助手监听收发的数据,发送和应答的过程还在持续,其他功能也都正常只是cubemx的程序认为没有收到数据。很难定位是哪里的问题。
    发表于 04-17 06:48

    外部中断串口中断问题

    目标 :今天试着编写了 两外部中断 分别往串口发a和b串口接收
    发表于 04-28 09:59

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

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

    串口中断丢失数据问题

    关于51单片机,串口中断发送与接收出现数据丢失问题串口中断的接收器具有双缓冲结构,即在从接收寄存器中读出前已收到的字节之前,便能接收第2
    发表于 02-17 00:13 3536次阅读

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

    本文档的主要内容详细介绍的是单片机学习教程之外部中断和定时器及串口中断的资料和程序说明。CPU收到中断请求,停下正在处理的工作A,去处理事件B,处理完后继续回到中断的地方继续执行事件A
    发表于 04-18 17:27 5次下载
    单片机学习教程之外部<b class='flag-5'>中断</b>和定时器及<b class='flag-5'>串口中断</b>的资料和程序说明

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

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

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

    本文档的主要内容详细介绍的是Arduino的实验例程之串口中断的程序免费下载。
    发表于 02-25 17:39 13次下载

    IAP15F2K61S2串口中断快速编程问题

    在讲串口中断问题之前,需要明白串口中断内容包括哪些部分,我概括为主要3部分:串口中断的初始化,串口
    发表于 11-23 17:36 10次下载
    IAP15F2K61S2<b class='flag-5'>串口中断</b>快速编程问题

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

    STM32使用CubeMAX配置的串口中断接收方法目录1.定位串口中断发生的地方2.处理串口中断接收的流程是:(1)初始化串口(2)在main中第
    发表于 12-14 18:45 28次下载
    STM32使用CubeMAX配置的<b class='flag-5'>串口中断</b>接收方法

    STM32F407串口中断配置

    花费了很久,发现用库函数去访问发送完成和接收完成的标志位会出问题,改成了直接访问寄存器对应的位,终于实现串口中断的通信。至于为什么库函数不行,lz还没有发现原因。 串口中断适合用于发送数据较少的情况
    发表于 12-24 18:48 1次下载
    STM32F407<b class='flag-5'>串口中断</b>配置

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

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档STM32f103------串口中断及其配置使能串口时钟和GPIO时钟配置GPIO(TX、RX)配置串口开启中断,初始
    发表于 12-27 19:30 22次下载
    STM32f103------<b class='flag-5'>串口中断</b>及其配置

    串口中断服务函数的触发

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

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

    使用Platformio平台的libopencm3开发框架来开发STM32G0,以下为串口中断的使用。
    的头像 发表于 01-17 10:46 2273次阅读

    STM32串口中断应用实例

    本文将介绍如何使用STM32F4的串口接收中断,通过串口助手模拟上位机发送指令、STM32F4串口中断接收到指令后根据指令选择开关LED小灯。
    的头像 发表于 04-20 11:45 2267次阅读
    STM32<b class='flag-5'>串口中断</b>应用实例

    STM32串口中断及DMA接收常见的几个问题

    STM32串口中断及DMA接收常见的几个问题
    的头像 发表于 10-26 16:41 3391次阅读
    STM32<b class='flag-5'>串口中断</b>及DMA接收常见的几个问题