打印
[其他ST产品]

图文介绍STM32L4读写内部flash

[复制链接]
1519|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

型号:STM32L431KBU6;

该型号内存 = 128KB,起始地址 = 0x0800_0000;只有63页;


在L4的user manual手册的第三章详细介绍了FLASH的操作细节,我挑一些重要的信息;

flash擦除方式有两种:

1、Page erase—以页位单位擦除,1页=2K,每次最少擦除1页;

2、Mass erase—擦除整个flash;



使用特权

评论回复
沙发
纠结的那些年|  楼主 | 2023-7-30 16:18 | 只看该作者
比较重要的信息是flash的写操作只能是双字(double word,64bit),写完第一个字,再写第二个字。

使用特权

评论回复
板凳
纠结的那些年|  楼主 | 2023-7-30 16:18 | 只看该作者
下面贴出可用的代码:

第一步:定义相关变量:
    uint32_t flashwriteaddr = 0x08008000;        //定义写入数据的地址
        uint32_t pageError = 0;
        uint64_t flashwritedata = 0x0000000200000001;//要写入的数据,必须得是双字64bit
        uint64_t flashreaddata = 0 ;
        FLASH_EraseInitTypeDef flash_erase;          //定义一个结构体变量,里面有擦除操作需要定义的变量

使用特权

评论回复
地板
纠结的那些年|  楼主 | 2023-7-30 16:18 | 只看该作者
关于这个写入数据的地址,不能瞎定义,千万别定义在程序存储的区域;

我是这样选的:先用ST-Link连接上mcu,看看我的程序占用了哪些空间。

使用特权

评论回复
5
纠结的那些年|  楼主 | 2023-7-30 16:18 | 只看该作者
从起始地址的0x08000000,到0x080025F0这个区间有数据,所以不能选择这个区域。所以就尽量往下选了个肯定安全的起始地址0x08008000;

第二步:解锁;

第三步:擦除;

第四步: 写数据;

第五步:上锁;

经过这5步数据就写进去了。

使用特权

评论回复
6
纠结的那些年|  楼主 | 2023-7-30 16:19 | 只看该作者
具体代码:
HAL_FLASH_Unlock();                                    //第二步:解锁                        
flash_erase.TypeErase = FLASH_TYPEERASE_PAGES;         //擦除类型是“Page Erase”
flash_erase.Page = 16;                                 //擦除第16页
flash_erase.NbPages = 2;                               //一次性擦除2页,可以是任意页
HAL_FLASHEx_Erase(&flash_erase,&pageError);            //第三步:参数写好后调用擦除函数
HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, flashwriteaddr, flashwritedata);//第四步:写入数据
HAL_FLASH_Lock();                                      //第五步:上锁
flashreaddata = *(__IO uint64_t *)flashwriteaddr;           //读出flash中的数据
d1 = (flashreaddata>>32) & 0xFFFFFFFF;
d2 = (flashreaddata)& 0xFFFFFFFF;
printf("读出数据:%d   %d\r\n",d1,d2);
HAL_Delay(200);

使用特权

评论回复
7
纠结的那些年|  楼主 | 2023-7-30 16:19 | 只看该作者
flash_erase.Page =16的计算方法举例:

Page =(定义的起始地址 - 基地址)/ 2K;

e.g.(0x08008000 - 0x08000000)/ (2 * 1024) = 16;

读数据的方法只需一句话:

flashreaddata = *(__IO uint64_t *)flashwriteaddr;       
因为L4的flash只能是双字,所以必须是:*(__IO uint64_t *)

如果可以操作单字,就可以写:*(__IO uint32_t *)

为了验证写入的数据:0x00000002_00000001是否正确,我把读出来的数据拆成了两个uint32_t变量,分别存储高32bit数据d1,和低32bit数据d2;

使用特权

评论回复
8
纠结的那些年|  楼主 | 2023-7-30 16:19 | 只看该作者
打印出来的数据是:

使用特权

评论回复
9
纠结的那些年|  楼主 | 2023-7-30 16:19 | 只看该作者
链接ST-Link我们可以查看对应地址里存储的数据:




从图中可以看出,对应地址0x080080000地址对应的地址就是例子中写入的数据。

使用特权

评论回复
10
帛灿灿| | 2023-12-29 07:27 | 只看该作者

让电子产品电路免受瞬态雷击浪涌与ESD静电的损害。

使用特权

评论回复
11
Bblythe| | 2023-12-29 08:30 | 只看该作者

固有的ESD钳位二极管。

使用特权

评论回复
12
周半梅| | 2023-12-29 10:26 | 只看该作者

不打坏仪器内部

使用特权

评论回复
13
Pulitzer| | 2023-12-29 11:29 | 只看该作者

具体采用灌封胶的种类的性能参数,主要看对电源模块的灌封用的胶的要求

使用特权

评论回复
14
童雨竹| | 2023-12-29 13:25 | 只看该作者

不影响线路正常工作

使用特权

评论回复
15
Wordsworth| | 2023-12-29 14:28 | 只看该作者

然而它的作用又可以分为阻抗匹配和减少信号边沿的陡峭程度两点

使用特权

评论回复
16
Clyde011| | 2023-12-29 15:31 | 只看该作者

Cfinal是CESD和人体电容的并联组合

使用特权

评论回复
17
公羊子丹| | 2023-12-29 16:24 | 只看该作者

变压器副边不对负载供电

使用特权

评论回复
18
万图| | 2023-12-29 17:27 | 只看该作者

其定义为温度每升高1℃时电阻值发生变化的百分数

使用特权

评论回复
19
Uriah| | 2023-12-29 18:30 | 只看该作者

应在操作时间内将胶料灌注完毕,否则影响流平

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

43

主题

675

帖子

0

粉丝