0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

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

3天内不再提示

分享两个STM32应用中的实战案例

茶话MCU 来源:茶话MCU 2023-01-11 09:13 次阅读

前不久,几乎举国上下在同一时间段内整齐划一地被感染了新冠。

很多人感染后都不同程度地出现味觉、嗅觉失灵的情形。本人也有相同经历。这几天,味觉恢复,嗅觉也在慢慢恢复中。既能闻到诱人的煎饼香,也能闻到清新的花香了。

今天在此分享两个STM32应用中的实战案例,权作提醒,以免重蹈覆辙。

案例1:

系统联机工作时,Flash编程偶发性失败

有人使用STM32F4系列芯片做开发,代码里涉及到FLASH编程。他发现FLASH编程过程中时不时地出现编程错误,即提示HAL_FLASH_ERROR_PGP错误。

他的产品系统有用到CAN通信。当他不将芯片做系统联机工作时不会发生该错误,只有在做整体联机测试时才可能发生编程异常。

起初,客户使用4字节编程模式,平常单独就flash编程功能测试也正常,整体联机运行时才可能出问题。后来,无意中尝试将FLASH单次编程宽度调整为1个字节后则异常消失。

那是为什么呢?

09eb3f0c-9135-11ed-bfe3-dac502259ad0.png

其实,在做FLASH编程时,选择不同的编程宽度所需的芯片供电电压是不一样的。上面截图来自STM32F4系列参考手册。从图中不难看出,选择的编程宽度越宽,芯片所需供电电压越高。

若不运行其它功能,只是单独就芯片做flash编程,功耗需求相对较小、电源波动也小。当联机工作时,系统功耗、串扰都有所增大,电源波动也可能加剧,这时很可能出现电源难以保证支持4字节编程方式的稳定需求。由于单字节编程模式所需电源电压相对较低,在系统联机工作时,相同的电源条件下,即使电源有所波动,但完全可能依旧能提供满足单字节编程的稳定电压需求,因而不会出现因供电问题导致的编程异常。

案例 2:

芯片工作时偶发性出现死机现象

有人在做STM32芯片做产品开发,会偶发性地出现芯片进入死机状态的现象。

代码里有做FLASH编程操作,有UART的收发动作及相关中断,另外还开启了某定时器更新中断。经过测试发现,如果关闭定时器中断,FLASH编程、UART收发动作保持的情况下,则不会出现死机的现象。可是定时器中断怎么会导致芯片死机呢?感觉没有找到根本原因。后来,进一步跟踪调试发现,芯片出现死机,实际上是程序不停地进入UART接收中断。

用户代码里的确使能了UART收发中断,但在中断代码里程序实实在在有对接收非空标志【RXNE】做清零处理,不应该没完没了地进接收中断啊!经进一步确认,发生死机现象时总是对应着UART接收溢出事件【ORE】。哦,如果这样,当UART接收发生溢出时的确也会产生接收非空中断。下图为STM32USART的各个中断请求事件及中断使能控制位。从下图可以看出,当使能RXNEIE时,RXNE和ORE事件都可产生接收中断。

09fab90a-9135-11ed-bfe3-dac502259ad0.png

用户虽然在UART接收中断里有对RXNE标志清零,但当发生溢出事件而进入中断时,他并没有对ORE标志做检测及相应的清零操作。

0a0b927a-9135-11ed-bfe3-dac502259ad0.png

实际上,用户根本就没有意识到发生ORE事件时也可以产生接收中断,在其代码里根本没有对ORE标志进行检测,更没有对ORE标志做清零,导致UART接收中断没完没了的进入,感觉芯片犹如死机一般。

为什么关闭定时器中断能防止死机现象发生呢? 我们知道,UART接收产生溢出是因为数据接收到后不能及时取走才产生的,而定时器中断的存在,因为中断竞争的原因导致了UART接收中断的及时性受到影响,进而容易发生溢出。如果关闭定时器中断或或将UART接收中断的优先级配置成可以抢占定时器中断就可以避免UART接收不及时的问题,也就不会发生溢出。这样的话,即使用户的UART接收中断里没有对ORE事件的处理也无所谓。

当然,我们做UART的中断接收时,中断代码里最好加上对ORE事件的检测处理,当发生溢出事件时,及时对ORE事件标志清零。否则,万一发生溢出,就可能因ORE事件而发生没完没了进中断的问题,进而导致功能异常。

具体到本案例,再顺便提醒一点,除非片内FLASH采用双BANK结构,FLASH编程也是会影响中断响应的。即该操作也可能让UART的接收中断的响应因临时堵塞而发生接收溢出。

好,今天的分享到此打住。也愿这里的分享能给有需要的人带来一些帮助。

目前尚是冬季,大家注意防寒保暖并保证休息,以利新冠康复。如有咳嗽,除了使用适当药剂外,尽量避免说话,尤其是高声说话。

待到山花烂漫、绿柳如烟时,魑魅魍魉尽遁去。九州华夏重抖擞,东方旭日耀寰宇。~~~~~~一起加油!~~~~~

审核编辑:汤梓红

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

    关注

    10

    文章

    1621

    浏览量

    147736
  • STM32
    +关注

    关注

    2266

    文章

    10870

    浏览量

    354743
  • 编程
    +关注

    关注

    88

    文章

    3591

    浏览量

    93588
  • 定时器
    +关注

    关注

    23

    文章

    3237

    浏览量

    114445

原文标题:又能闻花香了

文章出处:【微信号:stmcu832,微信公众号:茶话MCU】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    STM32移植而引发的两个小疑问

    STM32用户将基于STM32F0芯片的代码移植到STM32F4系列时遇到了些麻烦。其中有问题跟中断处理有关。有个中断服务程序代码在STM32
    的头像 发表于 11-18 14:12 1098次阅读
    因<b class='flag-5'>STM32</b>移植而引发的<b class='flag-5'>两个</b>小疑问

    如何在两个程序交换变量值?

    的扇区 0 上运行。)作为参考,我使用 STM32CubeIDE 1.3.0 作为编译工具。以前用IAR的时候,程序两个变量放在noinit区的同一地址,把编译工具改成
    发表于 02-08 08:38

    Obtain_Studio自带两个STM32_GUI实例使用说明

    Obtain_Studio自带两个STM32_GUI实例使用说明
    发表于 07-15 16:03 25次下载

    合并两个排序的链表

    结点; 2、依次比较两个链表节点的大小,将一链表合并到另一链表; 3、合并完之后,剩余部分合并到新链表最后; 我的代码 /*struct ListNode {int val;st
    发表于 01-16 22:02 575次阅读

    新建STM32工程全局声明两个宏的原因

    在uVision中新建STM32工程后,需要从STM32标准库拷贝标准外设驱动到自己的工程目录,此时需要在工程设置->C/C++选项卡下的Define文本框中键入这
    发表于 08-10 10:25 1943次阅读

    基于KEIL MDK环境调试STM32两个误会

    曾有两个不同的STM32用户反馈了相似的问题,他们在对STM32F7Cube库里的工程例程进行编译时,发现了一令人很不解的事。编译的结果提示芯片内的RAM几乎都耗光了。
    发表于 02-08 16:06 0次下载
    基于KEIL MDK环境调试<b class='flag-5'>STM32</b>的<b class='flag-5'>两个</b>误会

    Linux如何比较两个文件的差异?

    Linux 如何比较两个文件的差异?答案是使用 diff 命令。
    的头像 发表于 01-17 17:30 5163次阅读
    Linux<b class='flag-5'>中</b>如何比较<b class='flag-5'>两个</b>文件的差异?

    冷链运输两个重要环节

    冷链运输两个重要环节
    的头像 发表于 01-28 17:13 1124次阅读
    冷链运输<b class='flag-5'>中</b>的<b class='flag-5'>两个</b>重要环节

    两个LED和两个按钮的使用

    电子发烧友网站提供《两个LED和两个按钮的使用.zip》资料免费下载
    发表于 01-30 16:04 1次下载
    <b class='flag-5'>两个</b>LED和<b class='flag-5'>两个</b>按钮的使用

    Linux如何比较两个文件的差异?

    Linux 如何比较两个文件的差异?答案是使用 diff 命令。
    的头像 发表于 01-30 16:04 1.2w次阅读
    Linux<b class='flag-5'>中</b>如何比较<b class='flag-5'>两个</b>文件的差异?

    STM32F1两个USB中断入口详解

    STM32断入口有两个,分别是USB_HP_CAN1_TX_IRQHandler和USB_LP_CAN1_RX0_IRQHandler。
    的头像 发表于 07-24 11:12 4529次阅读

    stm32单片机如何实现一按键切换两个程序?

    stm32单片机如何实现一按键切换两个程序? 作为一款功能强大的微控制器,STM32单片机可以支持多种应用场景,其中一实用的功能是按键切
    的头像 发表于 09-14 14:22 5944次阅读

    电子设计两个不同概念:pcb与pcb封装

    电子设计两个不同概念:pcb与pcb封装
    的头像 发表于 12-11 15:49 812次阅读

    stm32定时器能同时控制两个灯以不同频率闪烁吗?

    STM32的定时器功能强大,**STM32的定时器可以同时控制两个灯以不同频率闪烁** 。
    的头像 发表于 12-13 10:43 1987次阅读

    arcgis如何关联两个属性表

    在ArcGIS,关联两个属性表是一重要的操作,可以通过此操作将两个的数据关联起来,以便进行分析和查询。下面是详细介绍如何在ArcGI
    的头像 发表于 02-25 11:01 3986次阅读