h图文:图文介绍STM32L4读写内部flash 2024-04-22 22:04:33 0 0 型号: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;//要写入的数据,必须得是双字64bituint64_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地址对应的地址就是例子中写入的数据。 收藏(0)