请选择 进入手机版 | 继续访问电脑版
搜索
查看: 1291|回复: 3

[分享] STM32L4系列内部FLASH双字编程示例

[复制链接]

该用户从未签到

1418

主题

2584

帖子

0

蝴蝶豆

管理员

最后登录
2021-1-21
发表于 2020-4-16 15:08:45 | 显示全部楼层 |阅读模式
有人使用STM32L476芯片开发产品,他想在内部FLASH空间特定位置写些数据,发现总是失败,并补充说之前使用STM32F1系列、STM32L1系列却没有类似问题。

其实,针对STM32L4的内部FLASH编程,跟STM32F1/L1系列是不同的,其中STM32F1的内部FLASH编程仅支持半字编程,STM32L1的内部FLASH编程主要支持字编程或半页编程。而STM32L4系列的内部FLASH编程所支持的则是64位双字编程或以32个双字为单位的快速行编程。

对于少量的零星数据编程自然会选择64位双字编程模式,即每次改写Flash内容必须以64位为单位。硬件还针对这64位数据做了8位的ECC,我们用户看不到而已。下面简单介绍下64位双字编程过程。

在基于64位双字编程时,如果只是就字节或半字进行编程则会产生错误;或者尽管使用双字编程却没有遵循双字地址对齐【8字节对齐】时也会产生错误。

这里我使用ARM MDK V2.9开发环境,借助于STM32L476_NUCELO开发板演示一下对内部FLASH某个位置写几个64位数据的实现过程【写之前相关区域已经被擦除过了】。

我通过IDE将内部FLASH最后的0x1000地址空间预留出来用于填写些数据,即我将内部FLASH分成2块,将最后的0x1000的FLASH空间划了出来。如下图所示:【这里的芯片是STM32L476RGT6,下面只演示写三个64位数据。】
11.png

我将特定数据区定义在内部FLASH空间0x80ff000开始的地方。
#define Address_Const     (0x80FF000)
另外还定义了一个64位地址指针和一个64位数据数组。
22.png

相关执行参考代码如下:
33.png
代码是基于STM32Cube库来组织的,连续写了三个64位的数据到指定的FLASH空间。其中主要涉及到一个FLASH编程函数HAL_FLASH_Program(),它有三个变量,分别是编程模式,待编程的FLASH地址以及用于编程的数据。
代码比较简单,对欲编程的地址做检查确认,然后进行FLASH编程开锁,清除可能存在的各种挂起状态标志,进行双字编程,之后对FLASH寄存器访问进行上锁。
现在基于上面的代码看看运行结果:
44.png
我们可以看到在指定的FLASH地址空间写三个64位数据。
在上面介绍64位双字编程规则时,可能有人会问,如果我遵循了8字节地址对齐,待写的数据也不是字节或半字,而是一个字会怎么样呢?那你也得凑成2个字来写,方能完成一次写操作。
比方基于上面测试代码,仅仅将每次待写的数据改为32位字,最后结果便是高位字被填0了。就像下面这样:
55.png
好,关于STM32L4系列内部FLASH双字编程模式就介绍到这里。整个过程应该说不难,只要注意到各个细节就好。

趁此再抛砖引玉似地做些提醒:STM32系列众多,各个系列的内部FLASH编程模式以及页或扇区的容量规划、地址安排往往各有差异,在FLASH编程时千万别跟着惯性或感觉走。还有,不同的编程模式往往对芯片的电源电压有不同的要求,这点也要特别特别特别注意。



回复

使用道具 举报

该用户从未签到

12

主题

1354

帖子

45

蝴蝶豆

金牌会员

最后登录
2021-1-21
发表于 2020-4-17 10:16:41 | 显示全部楼层
围观
回复

使用道具 举报

该用户从未签到

7

主题

126

帖子

80

蝴蝶豆

金牌会员

最后登录
2020-12-5
发表于 2020-4-17 10:42:32 | 显示全部楼层
L4的最大的坑是FAST_PROGRAM要全部擦除
而且我发现即使ST推出了自家的CubeIDE,不过培训还是教程都是基于IAR/Keil,自家的东西没多少存在感
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

8

帖子

0

蝴蝶豆

新手上路

最后登录
2020-4-21
发表于 2020-4-21 08:53:49 | 显示全部楼层
直接烧不用擦,都是自动的呀
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2021-1-21 19:38 , Processed in 0.078990 second(s), 20 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表