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

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

3天内不再提示

实战经验 | 一个 Flash 编程错误标志的探析

STM32单片机 来源:未知 2023-11-10 17:45 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群


关键词:Flash, 编程错误


目录预览

1、问题现象与分析

2、小结

3、后记


01

问题现象与分析


客户项目中使用的 MCU 型号是 STM32G0B1, 他们反馈在代码中尝试擦除并编程 FLASH时, 发现 FLASH 的状态寄存器显示编程错误(如图 1 所示). 问题是当前代码还没有开始擦除和编程, 怎么就有了编程错误标志了呢 ? 如果不将此错误标志清除, 后续的编程操作无法继续.客户对于每次想要操作 FLASH 之前这个清除动作既感觉多余也感觉别扭, 且还不得不做, 且做了也不知对整个产品的稳定性会有什么样的影响 ?


图1.Flash 编程错误标志


访问客户时, 客户也曾私下里反馈, 经常在网络论坛上获取类似这种问题, 客户怀疑是不是STM32 本身就存在某些未曾公开的问题 ? 其实, STM32 的所有问题都已公开在勘误手册中, 如果客户的问题在勘误手册中没找到, 那么极有可能是自己代码哪里出了问题。


问题分析及测试


查看客户的工程, 由于客户的工程相当庞大, 各个模块和任务相互交叉, 一时半刻是很难从如此庞大的工程中找出问题, 更麻烦地是, 客户的电脑是有加密系统的, 导致在工程内查找任何字符和函数都相当痛苦. 好在是, 问题能够稳定地复现。


于是尽量精简客户的代码, 将所有不相关的任务,模块统统移除掉, 并且保持问题能够重现. 并使其能够在 ST 官方的 NUCLEO 板上重现. 这样一来, 就完全可以脱离客户原来的硬件环境进行测试. 由于客户的环境非常不利于查找问题, 效率事倍功半. 于是, 将客户的最小化工程提取出来(与软件泄密无关), 并拿到办公室进行测试. 很快就找到了问题所在。


原来客户的工程中有用到两个串口, 串口 2 和串口 3, 都是使用的 DMA 模式。客户不同的软件人员负责不同的模块, 最终在整合代码时, 串口 2 并没有使用, 所以串口 2 对应的初始化代码是删除掉的, 但由于串口 2 和串口 3 的 DMA 中断是共用一条中断线, 是相同的中断入口, 在中断处理时,串口 2 的 DMA 处理函数和串口 3 的处理函数都会一起处理. 问题就出在串口 2 的 DMA 中断处理并没有移除 。如 stm32g0xx_it.c 文件 :



如上图,DMA 的通道 4~7 以及 DAM2 的通道 1~5 都是共用一个中断入口的。在这个中断处理函数内, 串口 2 并没有使用到, 但其对应处理代码由于疏忽仍然保留了下来。句柄hdma_usart2_rx, 和 hdma_usart2_tx 内的数据成员很多都是不定内容或为 0. 当代码运行到函数内部, 如下图所示出问题的代码行:



如上面代码所示, 代码运行到上图 866 行代码 hdma->DmaBaseAddress->IFCR = (DMA_ISR_GIF1 << (hdma->ChannelIndex & 0x1CU));时, 实际上是给错误地址 0x0800 4109 赋值了, 此地址是内部 FLASH 地址, 这样相当于直接写 FLASH, 肯定会出错, 这也是为什么FLASH->SR.PGSERR 置位的原因. 我们都知道, 写内部 FLASH, 必须先擦除, 才可以写入, 而且写也是调用对应的 HAL API 函数, 且还需要先写 key 解锁 FLASH 等操作, 有一套写操作流程. 并不是直接用赋值语句, 这样操作出现问题一点也不奇怪。


当在中断中将串口 2 的 DMA 对应处理函数移除掉后功能就恢复正常, 这也佐证了结论的准确性。


另外, 客户反映, 这个最小化工程, 相同的代码, 使用 IAR 时测试会出错, 但使用 KEIL 时并没有出错. 这个很奇怪. 这就引出的另外一个问题. 相同代码, 不同编译器运行结果不一致的问题。于是继续找原因, 对比 IAR 和 KEIL 的调试情况, 发现当代码运行到图 2 中 857 行代码 if 语句时其判断结果不相同. IAR 调试环境会进入到 if 语句内容, 从而导致错误的给内部 FLASH 地址赋值, 进行导致问题. 而 KEIL 调试环境并没有进入到 if 语句内部, 因此并没有触发问题. 那么为什么if 语句的判断结果不一样呢?


为了方便并避免不同编译器对长语句的执行顺序的差异, 将这个 if 长语句拆开:



如上红色代码, 用它替换原来的 if 判断语句. 结果发现 tmp1 在 IAR 和 KEIL 两个编译器环境中的值是一样的, 但是 tmp2 的值却不一样, 正是由于 tmp2 值的不一样, 导致 if 语句的最终判断结果不同。进一步发现, tmp2 的值主要是由于 flag_it 的值在两种编译器环境不一样所致。



如上 IAR 编译器环境, flag_it 的值为 0x2000 10f8。



如上 KEIL 编译器环境, flag_it 的值却是 0x2000 14F0。


那么 flag_it 的值又是如何来的呢? 从如下代码:



如上所示, flag_it 的值来自 hdma->DmaBaseAddress->ISR, 原来是 DMA 相关 ISR 寄存器的值, 但实际调试如下:



如上 IAR 调试环境下, 出错时, hdma->DmaBaseAddress 实际指向的是地址 0, 其成员 ISR为其第一个成员, 实际也就是地址 0 上的数据. 我们都知道, 在默认情况下, MCU 的地址 0 默认是映射到内部 FLASH 的首地址 0x0800 0000 上的, 而此地址一般保存的是栈顶.。也就是说, IAR 编译环境下, 地址 0 指向栈顶地址 0x2000 10f8。


对应地, 在 KEIL 调试环境下:



如上 KEIL 调试环境, hdma->DmaBaseAddress 同样地实际指向的是地址 0, 而地址 0 的上对应的数据为栈顶地址: 0x2000 14F0。


也就是说, 在不同的 编译器 IAR 和 KEIL 环境下, 地址 0 指向栈顶地址是未必相同的, 进而导致两种编译环境下运行相同的代码结果不一样。


我们知道, 通常栈地址是由编译器来指定的, 在默认情况下, IAR 和 KEIL 都会将栈放在内存的所有静态变量之后来分配. 其具体的分配地址这两个编译器都会默认按自动填充地方式来. 实际分配的地址具有不确定性, 当然, 我们也可以通过链接配置文件(IAR 的.icf 文件, KEIL 的.sct 文件)来将栈地址指定某一固定地址, 但我们通常不会这么做, 且完全没有必要.


02

小结


至此,将问题稍作小结。给变量 flag_it 实际赋值栈顶地址, 不同的编译器环境下, 此栈顶地址的不一致导致变量 flag_it 的值不一致, 进而导致 if 语句的判断结果不同, 最终导致 IAR 和 KEIL 这两个编译器环境下运行相同代码而结果不一样的情形。


03

后记


有时会听到某某客户反馈说, 在网络上看到 STM32 某款 MCU 存在某某问题, 然后问是不是 ST 故意隐瞒 ?


不存在故意隐瞒的说法,芯片终究是要经过终端验证的。


正常来讲, 任何芯片存在应用局限是正常的。对于 ST,一方面会正式地将所有已知 bug或应用局限放入到勘误手册中公示, 大家需要注意使用最新版勘误手册;另一方面,对于 ST 量产芯片,因本身缺陷导致的问题的概率非常低。事实上,绝大多数问题都来自我们自身的应用,遇到问题若简单的基于芯片品质来回猜疑非常不利于开发者静下心来查找问题原因。其实,面对问题时,我们很多人欠缺的并不是多么高深的水平,而是一颗冷静、自信并富有条理的心。



完整内容请点击“阅读原文”下载原文档。




原文标题:实战经验 | 一个 Flash 编程错误标志的探析

文章出处:【微信公众号:STM32单片机】欢迎添加关注!文章转载请注明出处。

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

    关注

    6074

    文章

    45347

    浏览量

    663824
  • STM32
    +关注

    关注

    2305

    文章

    11123

    浏览量

    371214

原文标题:实战经验 | 一个 Flash 编程错误标志的探析

文章出处:【微信号:STM32_STM8_MCU,微信公众号:STM32单片机】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    智能破局焊接痛点!连接器 PIN 脚零缺陷检测方案,3C &amp; 汽车电子质控利器

    本期我们将聚焦 连接器 PIN 脚焊接环节的质量管控难点,结合近期成功交付的实战经验,详细解读智能视觉检测方案的落地实践经验,为您提供视觉智能化升级的参考范例。
    的头像 发表于 12-08 15:14 95次阅读

    车载音频功放芯片实战经验与深度疑问

    100mV),需在芯片电源输入端增加二级滤波电路(如并联 2200μF 电解电容与 1μF 陶瓷电容组合),同时串联小型共模电感,减少纹波对音频信号的干扰;而新车型电源纹波较小(通常低于 50mV
    发表于 12-05 09:53

    使用J-Flash编程CW32 MCU

    闪存内容。J-Flash提供了擦除整个闪存或特定扇区的选项。 7.编程闪存: 在J-Flash中,选择“编程”选项开始将固件编程到CW32
    发表于 11-25 07:00

    UART、SPI、I2C 实战对比:哪个更适合你的项目?

    在嵌入式开发中,设备之间的通信是绕不开的话题。常见的三种总线接口——UART、SPI、I2C——各有优缺点。不同项目需求决定了选择哪种协议最合适。本文结合实战经验,逐项对比三者,并附带实战代码
    的头像 发表于 11-24 19:04 341次阅读
    UART、SPI、I2C <b class='flag-5'>实战</b>对比:哪个更适合你的项目?

    解锁物联网摄像头潜力:低成本低功耗硬件设计实战技巧!

    摄像头是物联网视觉感知的关键,但高成本与高功耗常成落地阻碍。本文基于实战经验,提炼硬件设计实用技巧——从简化外围电路到动态功耗管理,助您以更低成本、更低功耗打造物联网摄像头,适配智能家居、安防监控等场景。
    的头像 发表于 09-20 15:22 917次阅读
    解锁物联网摄像头潜力:低成本低功耗硬件设计<b class='flag-5'>实战</b>技巧!

    淘宝商品详情 API 实战:5 大策略提升店铺转化率(附签名优化代码 + 避坑指南)

    ”“差评失控” 等转化率杀手。本文结合我对接 300 + 淘宝店铺的实战经验,拆解 API 如何落地到动态定价、库存预警等 5 大场景,代码做了签名优化和错误处理,新手也能直接复用,避开 90% 的调用坑。 、淘宝商品详情 A
    的头像 发表于 09-15 10:53 723次阅读

    数据库慢查询分析与SQL优化实战技巧

    今天,我将分享我在处理数千次数据库性能问题中积累的实战经验,帮助你系统掌握慢查询分析与SQL优化的核心技巧。无论你是刚入门的运维新手,还是有经验的工程师,这篇文章都将为你提供实用的解决方案。
    的头像 发表于 09-08 09:34 636次阅读

    Linux服务器性能调优的核心技巧和实战经验

    如果你正在为这些问题头疼,那么这篇文章就是为你准备的!作为名拥有10年经验的运维工程师,我将毫无保留地分享Linux服务器性能调优的核心技巧和实战经验
    的头像 发表于 08-27 14:36 728次阅读

    FLASH烧写/编程白皮书

    白皮书:如何烧写Flash——不同场景不同需求下的选择认识Flash NAND vs. NOR如何烧写/编程不同方案比较
    发表于 07-28 16:05 0次下载

    移动电源EMC整改:认证失败到次通过的实战经验

    深圳南柯电子|移动电源EMC整改:认证失败到次通过的实战经验
    的头像 发表于 05-26 11:25 579次阅读
    移动电源EMC整改:认证失败到<b class='flag-5'>一</b>次通过的<b class='flag-5'>实战经验</b>

    如何通过SFL为设备添加Flash编程支持

    SEGGER Flash Loader(SFL)是J-Link设备支持套件(DSK)的部分,通过SFL,用户可以为自己的新设备添加Flash编程支持。
    的头像 发表于 05-19 16:35 1127次阅读
    如何通过SFL为设备添加<b class='flag-5'>Flash</b><b class='flag-5'>编程</b>支持

    锡膏使用避坑指南:50 实战问答帮你解决 99% 的焊接难题(全流程解析)

    问题包含“原因分析 + 解决措施”,结合行业标准与实战经验,为电子工程师、产线技术人员、营销工程师提供 “站式” 缺陷解决方案,助力提升焊接良率与产品可靠性。了解完5
    的头像 发表于 04-14 09:45 1184次阅读
    锡膏使用避坑指南:50 <b class='flag-5'>个</b><b class='flag-5'>实战</b>问答帮你解决 99% 的焊接难题(全流程解析)

    提升开关电源效率的理论分析与实战经验

    在这里有电源技术干货、电源行业发展趋势分析、最新电源产品介绍、众多电源达人与您分享电源技术经验,关注我们,与中国电源行业共成长! 提升开关电源效率的理论分析与实战经验 引言 开关电源设计中,为获得
    的头像 发表于 01-09 10:04 1823次阅读
    提升开关电源效率的理论分析与<b class='flag-5'>实战经验</b>

    使用MCUXpresso for VS Code插件开发Zephyr的hello world

    本期来到Zephyr实战经验演练,小编带着大家起使用MCUXpresso for VS Code插件来开发属于Zephyr的hello world。
    的头像 发表于 01-03 09:21 1788次阅读
    使用MCUXpresso for VS Code插件开发Zephyr的hello world

    EEPROM编程常见错误及解决方案

    EEPROM(电可擦可编程只读存储器)在编程过程中可能会遇到多种错误。以下是些常见的EEPROM编程
    的头像 发表于 12-16 17:08 6627次阅读