历史上的今天
返回首页

历史上的今天

今天是:2025年12月08日(星期一)

正在发生

2022年12月08日 | STM32L0 系列 EEPROM 读写,程序卡死?

2022-12-08 来源:zhihu

前言

使用 STM32L051 和 STM32L071 替换 STM32 有一年多了,替换完成以后还根据自己产品的需求写了几篇记录博文:

STM32L0 系列产品都自带了 EEPROM ,使用保存数据起来特别方便,因为写 EEPROM 并不需要删除一篇扇区,可以直接在指定地址写入。

但是最近有某个产品反馈,有时候会莫名其妙的“死机”,这是最直观的现象:

如果在初次配置完成(配置需要对 EEPROM 进行读写)后上电没问题,那么就一直没问题,如果断电重启,有可能遇到问题,遇到问题也是可以靠多重启几次解决(上电会读取 EEPROM 的数据)。

这个问题花了一些时间,其实就是 EEPROM 的读写问题。

我更新了好多次可以看出来,EEPROM 不止出了一次的问题。

所以本文的目的就在于,把 STM32L0 系列 EEPROM 读写使用注意事项说明清楚,供大家参考!

一、写入地址问题

在STM32L0 系列读取 EEPROM 的时候,需要注意:

字节操作,传入合理范围内的任何地址参数都可以;

半字操作,地址需要 2 字节对齐,就是 2的倍数;

全字操作,地址需要 4 字节对齐,就是 4 的倍数;

这个在以前的测试文章《STM32L051测试 (四、Flash和EEPROM的读写)》中已经做过测试和总结。

二、写入时候容易死机问题

上面的地址写入问题,通过自己的测试可以很容的一发现,但是接下来的这个莫名其妙程序卡死的问题,花了好一阵子功夫。

2.1 问题的原因

这里我就不一步一步的说明我遇到的各种莫名其妙的程序卡死问题,当时虽然基本上猜测是 EEPROM 的写入有问题,因为读取直接取某个指针的值,速度快,也没有什么特别需要注意的,写 EEPROM 的时候需要时间,这个时间是必须等待的,所以基本上确定出问题就是在写入的时候。

虽然中间“优化”维护过程序好几次,但是莫名卡死的问题依然存在。。。。。

这里我直接说明最终原因,就是 在写入EEPROM 的时候,如果发生了串口中断,那么就很容易出问题。

这里非常感谢 ST 社区一篇文章:STM32L0擦写EEPROM,然后宕机了?

我在自己有限的范围搜索这个问题,有且只有这一篇文章真正的说到了电子上,给了极大的参考价值:

出问题之后,我并没有单步调试,因为我虽然知道写 EEPROM 的时候会出问题,但也发现不是每次都会出这个问题,而且问题不一定能够复现,对于这个问题,上文说到:

2.2 问题的解决

2.2.1 不同的 Bank

在上面推荐文章中,给了一个很好的解决办法:在有的芯片中,有 2 块NVM (non-volatile memory 非易失性存储器),分为 Bank1 和 Bank2 ,两个区域都有 Flash 与 EEPROM区域, 对 Bank1 的读写操作并不会影响对 Bank2 的读写操作,说直白点,就是 CPU 不用再挂起等待了。

那么我们我们可以做到使得对 EEPROM 的操作的地址区域 与 我们存放程序的 Flash 地址区域处于不同的 Bank 就可以。

那么这个怎么做到呢?首先,你得明白我们程序存放于 Flash 中一般都是从 0x0800 0000 开始存放,也就是 Bank1,除非你自己修改了偏移地址。

那么我们只要保证我们的 EEPROM 的读写地址为 Bank2 即可:

于是,在程序中,我简单做了修改:

那么有的小伙伴会说,如果我的程序特别大,超过了 Bank1 怎么办?

1、首先如果是使用的有2个Bank的芯片, Bank1有 64k 大小,一般来说程序足够了;

2、个人认为,对于中断程序来说,他们存在的位置一定是程序的前面,即便程序超过大小,存放在 Bank2 中的也是用户自己的一些程序,不可能回事中断响应程序。即便中断发生了,也是在 Bank1 中运行,无影响;

3、再者,即便不分 Bank ,我们可以屏蔽中断。下面我将介绍在没有两个 Bank 的芯片上的处理方式。

2.2.2 临界区的保护

临界区的保护,是不是特别熟悉了, 我们在讲 FreeRTOS 或者 RT-Thread 的时候都讲到过 临界区保护。

上面我们介绍了直接把 EEPROM 的操作地址与程序地址区分开的解决方式,但是对于大部分产品上我使用的 STM32L051C8 来说,没有两块 NVM ,那么只能是做临界区保护了。

查看自己的 STM32L0 系列芯片有没有两块 NVM, 可以通过 J-Flash 工具查看他们的内存情况:

那知道了原因,我们只要在程序有 EEPROM 写的位置加上临界区保护即可,比如:

如果使用裸机操作,我们可以直接在写 EEPROM 的时候屏蔽中断,使用下面2个函数:

如图:

虽然写需要花时间,但是该等还是得等。

因为我使用的串口通讯是收无线的报文,虽然在屏蔽中断的时候有一定的概率丢数据,但是偶尔丢数据是可以接收的,至少比写数据的时候发生中断程序卡死来得好。

而且,EEPROM 虽然写方便,也不建议频繁的写入,往往需要写的时候都是第一次设置或者特殊情况设置的时候才用到。

2.2.3 关键程序放到 RAM 中执行

除了上面 2 种比较简单的解决办法,还有一种。

在网上看到有提问者说过,官方曾有过建议,把关键程序 放到 RAM 中执行,避免冲突。

把程序放到 RAM 中执行,如果有时间,我会单独写一篇博文说明,这里只是提一下解决这种问题的可行办法。

三、官方文档

这个问题告诉我们,要想真正用好一个芯片不出问题,还是得了解好对应的芯片文档。

即便我们已经很熟悉同类型的 STM32F103 系列,使用 STM32CUbeMX 可以快速简单的上手类似系列的芯片产品,但是在有些细节问题的处理上还是容易存在问题,此时官方的文档应该是首要想到的参考文档。

那么文档资料哪里下载,在 ST 社区可以通过站内搜索,关于 STM32L0 系列(后缀 1 ,3在这里应该都可以)有关的文档:RM0377文档,关如下图:

在文档中有一整个章节单独介绍存储设备 Flash 和 EEPROM:

其实对于产品遇到的这些问题,文档里面其实有详细的说明以及解决方式,当然,即便是到现在,我也没有 详细的全部看完,因为知道了一些注意事项,还是偷懒,文档没看那么仔细= =!

但是这里比必须强调一次官方文档的重要性。

因为在网上我找了很久这个问题,在 ST 社区也找了很久,除了上面给出的链接那篇文章,再也没有第二篇 有问题也有解决办法的文章,那么这时候,我们就只能自己去啃官方文档了!

结语

一个简单的芯片,一个方便使用的 EEPROM ,前前后后出了这么多问题,也不得不感叹,细节问题还真是不能偷一点懒 = =!


推荐阅读

史海拾趣

Amptek Inc公司的发展小趣事

Amptek Inc 是一家专注于放射性测量和分析仪器的公司,提供各种 X 射线和伽马射线探测器以及相关的测试设备和软件。以下是 Amptek 公司发展的五个相关故事:

  1. 公司成立与早期发展:Amptek 公司于1987年成立,总部位于美国马萨诸塞州贝弗利市。公司成立初期,主要从事于放射性测量仪器的研发和生产。创始人团队在核物理和仪器设计领域拥有丰富的经验,致力于提供高性能、高精度的测量和分析解决方案。

  2. 技术创新与产品升级:随着技术的不断进步,Amptek 公司持续进行技术创新和产品升级。公司引入先进的探测器技术和数据处理算法,不断提升产品的性能和精度。公司的 X 射线和伽马射线探测器在放射性测量和分析领域具有很高的声誉,被广泛应用于科学研究、医学诊断、工业检测等领域。

  3. 全球市场拓展:Amptek 公司在全球范围内建立了广泛的销售网络和服务体系。除了在美国设立销售和服务中心外,公司还在欧洲、亚洲等地设立了分支机构和代理商,为全球客户提供及时的技术支持和售后服务。公司的产品远销全球,赢得了国内外客户的信赖和好评。

  4. 科研合作与应用推广:Amptek 公司与世界各地的科研机构、大学和实验室保持着紧密的合作关系,共同开展科研项目和应用研究。公司的产品被广泛应用于粒子物理、天体物理、材料科学、核医学等领域的实验和研究中,为科学家和研究人员提供了强大的实验工具和数据支持。

  5. 持续发展与未来展望:Amptek 公司将继续致力于技术创新和产品研发,不断提升产品的性能和功能,满足客户不断增长的需求。公司将继续拓展国际市场,加强与客户的合作关系,进一步巩固在放射性测量和分析领域的领先地位。同时,公司还将关注新兴市场和新技术的发展趋势,积极布局未来的发展方向。

ALLTHREAD公司的发展小趣事

ALLTHREAD深知品牌建设的重要性。他们注重提升品牌形象和知名度,积极参加各类行业展会和论坛,与业界同仁交流学习。同时,他们还建立了完善的客户服务体系,为客户提供及时、专业的技术支持和售后服务。这些举措有效提升了ALLTHREAD的品牌影响力和客户满意度。

普芯达电子(Chipswinner)公司的发展小趣事

企业文化和团队建设是企业持续发展的基石。普芯达电子注重企业文化建设和团队建设,倡导“诚信、创新、协作、共赢”的价值观,营造了一个积极向上、团结和谐的工作氛围。公司注重员工的培训和发展,为员工提供了广阔的发展空间和良好的福利待遇。同时,普芯达电子还建立了完善的激励机制和绩效考核体系,激发了员工的工作积极性和创造力。这些措施的实施为公司的持续发展提供了有力的保障。

请注意,以上仅为故事框架的概述,你可以根据这些框架进一步扩展和详细化每个故事的内容。

珠海艾派克(APEXMIC)公司的发展小趣事

成立于2004年的珠海艾派克微电子有限公司,在创业初期便致力于集成电路芯片设计领域的探索。公司凭借着对CPU设计技术、多核SoC专用芯片设计技术、安全芯片设计技术等核心技术的深入研究,逐步在行业内积累了良好的口碑。这一时期,艾派克坚持以市场需求为导向,不断优化产品性能,为公司的长远发展奠定了坚实的基础。

Crowd_Supply__Inc.公司的发展小趣事

在国内市场取得一定成绩后,Crowd Supply Inc.开始将目光投向更广阔的国际市场。公司通过与国外合作伙伴建立战略合作关系、参加国际电子展会等方式,积极拓展海外市场。同时,公司还针对不同国家和地区的市场需求,定制化开发符合当地需求的产品和服务。这些举措不仅为公司带来了新的增长点,也进一步提升了公司在国际电子行业的知名度和影响力。

请注意,以上故事是基于一般性的电子行业公司发展历程和模式进行构想的,并非针对Crowd Supply Inc.的实际情况。如果您需要关于Crowd Supply Inc.的具体故事,建议您查阅相关新闻报道、公司官网或行业分析报告等权威渠道获取更准确的信息。

创基(CBI)公司的发展小趣事

品质是电子行业的生命线。CBI公司始终将品质管理放在首位,通过引进先进的生产设备和检测仪器,建立严格的质量控制体系,确保产品的品质稳定可靠。此外,公司还注重员工的培训和教育,提高员工的品质意识和操作技能。这些措施使CBI的产品在品质上赢得了消费者的信赖和认可。

问答坊 | AI 解惑

使DC/DC变换器限流特性线性化的热敏电阻器网络

核心器件: MAX1714 最近推出的各种集成式降压   DC/DC变换器均已采取对外接低侧MOSFET同步整流器的电压降采样的方法,无需高侧电流检测电阻器。这种拓扑节省了检测电阻器的成本和印制电路板的空间,也适当提高了电路效率。但是,MOS ...…

查看全部问答>

镜面旋转LED屏(含C源码、原理图全部资料)

网上有老外做的LED旋转显示屏,在技术上软硬件都不难,只需要花些时间慢慢调就能出来。关键是,给旋转的LED供电,对电子爱好者来说,是个麻烦事。 这里,给出一个不需要给LED电路供电的方法。即让LED和单片机电路固定不动,而是旋转一面镜子。 原 ...…

查看全部问答>

电子系统设计基本知识

本文有模拟电路、数字电路、单片机电路、ARM硬件、ARM编程等基础知识,里面还有电阻、电容、半导体二级管三极管等元器件的介绍,还有电源电路、电路设计、通信系统等。欢迎想学电子基础知识的人下载。…

查看全部问答>

大家A有整体方案了没有

本帖最后由 paulhyde 于 2014-9-15 09:04 编辑 大家A有整体方案了没有  …

查看全部问答>

DO-254中的高设计可靠性的逻辑综合(二)

书接上文 https://bbs.eeworld.com.cn/thread-92283-1-1.html 逻辑综合 如图中所示,逻辑综合是PLD,FPGA,ASIC设计的中心环节。在数十年中,逻辑综合工具把高级语言转换为门级电路,使设计师能够在更高的抽象层次上进行硬件设计,极大的提高 ...…

查看全部问答>

防水鞋套

现在已经很少有人因为下雨而穿雨靴了,但是真碰上雨下大的时候,普通的鞋子还真是不堪一击,很快就会被湿透。这个时候,你或许需要这样一款独特的“雨衣”。它并不是给身体挡雨的,而是用来保护鞋子的。这其实就是一双防水鞋套,可以跟雨衣和雨伞放 ...…

查看全部问答>

单片机实现液晶显示的开发方案

我们的产品希望用液晶屏显示,不知各位高人有什么比较好的实现方法吗?(接口可以是232或者485)…

查看全部问答>

请问哪里有无线协议的详细文档下载?

刚学GPRS开发,想找些无线通讯协议看看,google了一下,没找到,所以想请教一下,哪里有这一类的完整文档下载,谢谢!…

查看全部问答>

求助。。。。

用iar for msp430怎么下载程序到430里? 求具体过程,最好能有×××××× 还有就是怎么看程序是否在下载?单片机是否在运行? 本人初学,只有一点51的基础,还请各位多多指教…

查看全部问答>

请各位朋友来帮小弟看看这段代码

代码如下: /  UART初始化 void uartInit(void) {     SysCtlPeriEnable(SYSCTL_PERIPH_UART1);                  //  使能UART模块   &nbs ...…

查看全部问答>