图文介绍STM32L4读写内部flash

型号:STM32L431KBU6;

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

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

flash擦除方式有两种:

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

2、Mass erase—擦除整个flash;

比较重要的信息是flash的写操作只能是双字(double word,64bit),写完第一个字,再写第二个字。

下面贴出可用的代码:

第一步:定义相关变量:

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

关于这个写入数据的地址,不能瞎定义,千万别定义在程序存储的区域;

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

      从起始地址的0x08000000,到0x080025F0这个区间有数据,所以不能选择这个区域。所以就尽量往下选了个肯定安全的起始地址0x08008000;

第二步:解锁;

第三步:擦除;

第四步: 写数据;

第五步:上锁;

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

具体代码:

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);

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;

打印出来的数据是:

链接ST-Link我们可以查看对应地址里存储的数据:

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

STM32是一款广泛应用于嵌入式系统开发的微控制器系列,它具有强大的处理能力和丰富的外设接口。对于一些需要存储大量数据的应用场景,如图形界面的显示,我们可以将图片等资源存储在外部Flash上。 图片外部Flash存储的好处有以下几点。首先,外部Flash具有较大的存储容量,可以存储更多的资源数据。其次,外部Flash读写速度相对较快,可以快速地加载和显示图片。同时,外部Flash的寿命较长,可以保证数据的稳定性和可靠性。此外,外部Flash的接口丰富,可以通过SPI、QSPI等接口和STM32进行高速数据传输。 在使用STM32控制外部Flash时,首先需要在代码中引入相关的外部Flash驱动程序。然后,通过设置相应的寄存器和配置外设的接口,可以实现对外部Flash读写操作。例如,通过SPI接口读取外部Flash中的图片数据,然后通过STM32的DMA控制器将数据传输到显示模块,最终显示在屏幕上。 为了更好地管理外部Flash中的资源数据,可以将其分成不同的区块,每个区块存储不同类型的资源,如图片、音乐等。这样可以方便地读取对应类型的资源数据,提高系统的效率和性能。 总之,使用外部Flash存储图片等资源数据,可以扩展STM32的存储容量,提高系统的性能和功能。合理配置外部Flash的接口和管理方式,可以更好地满足不同应用场景的需求。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值