STM32L0 系列 EEPROM 读写,程序卡死?_stm32l0片内eeprom

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

如果你需要这些资料,可以戳这里获取

2.2.1 不同的 Bank

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

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

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

STM32的启动过程 — startup_xxxx.s文件解析(MDK和GCC双环境

那么我们只要保证我们的 EEPROM 的读写地址为 Bank2 即可:
在这里插入图片描述

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

#define NVM2\_EEPROM\_START\_ADDR 0x08080C00 //起始地址

/\*
 EEPROM只有4页,每页512bytes,EEPROM使用方便,我们用它来保存数据
 但是要注意,L051 falsh 和 eeprom没有数据的时候是 0,不是FFFFFFF
 L051C8 系列 和 L051R8 系列一样 

 L071

 FALSH : bank1 0x0800 0000 - 0x0800 FFFF
 bank2 0x0801 0000 - 0x0801 FFFF
 EEPROM : bank1 0x0808 0000 - 0x0808 0BFF
 bank2 0x0808 0C00 - 0x0808 17FF
\*/


#define CH1\_ID\_ADDR NVM2\_EEPROM\_START\_ADDR + 0 
#define CH2\_ID\_ADDR NVM2\_EEPROM\_START\_ADDR + 4
#define CH3\_ID\_ADDR NVM2\_EEPROM\_START\_ADDR + 8
#define CH4\_ID\_ADDR NVM2\_EEPROM\_START\_ADDR + 12
#define CH5\_ID\_ADDR NVM2\_EEPROM\_START\_ADDR + 16
#define CH6\_ID\_ADDR NVM2\_EEPROM\_START\_ADDR + 20
#define CH7\_ID\_ADDR NVM2\_EEPROM\_START\_ADDR + 24 
#define CH8\_ID\_ADDR NVM2\_EEPROM\_START\_ADDR + 28 
#define CH9\_ID\_ADDR NVM2\_EEPROM\_START\_ADDR + 32 
#define CH10\_ID\_ADDR NVM2\_EEPROM\_START\_ADDR + 36


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

程序大小怎么算,可查看文章:

STM32的内存管理相关(内存架构,内存管理,map文件分析)

❤️
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个函数:

\_\_enable\_irq(void);
\_\_disable\_irq(void);

如图:

在这里插入图片描述

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

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

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

2.2.3 关键程序放到 RAM 中执行

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

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

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

三、官方文档

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

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

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

在这里插入图片描述

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

在这里插入图片描述

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

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

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

结语

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

做事情不要想当然,要想产品无 bug ,该看的资料还是得看到位,希望 EEPROM 这个问题是产品更换后最后的问题。ヾ(◍°∇°◍)ノ゙

本文就到这里,谢谢大家!

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

如果你需要这些资料,可以戳这里获取

嵌入式知识点,真正体系化!**

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

如果你需要这些资料,可以戳这里获取

  • 16
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值