【STM32笔记】HAL库Flash读写配置
在keil里面的默认工程配置中 Flash分配地址 程序部分为0x0800 0000到0x0810 0000 总共是0x0010 0000的大小 也就是1048576Byte 1024KB 1MB
而实际上程序部分大小应该要看硬件手册来确定
可以通过配置keil工程中size的大小 来确定程序地址的范围(如果太小了 编译会报错) 在进行flash读写时 应跳过程序部分
在用户手册里 可以查看flash的分配情况
如STM32L496xx 有两个banks 每个bank有256页 每一页对应2KB 一共是1MB
我的程序编译后 大概占用了24192的空间 也就要跳过这个空间才能进行读写操作
基本上 大小选择为0x10000也是不会报错的
那进行flash操作就可以从0x0801 0000开始
一直到0x080F FFFF结束
Flash的读写与EEPROM不同 读的时候可以随时读 但写的时候不能直接写 必须先将该页2KB的数据清除 然后再写(清除后 该页的数据全为1)
注意:要明白Flash的编程原理都是只能将1写为0,而不能将0写为1,所以在进行Flash编程前,必须将对应的块擦除,即将该块的每一位都变为1,块内所有字节变为0xFF。
HAL库测试代码如下:
void Test_Flash(void)
{
uint32_t add = 0x08010000; //定义写入数据的地址
uint32_t error = 0;
uint64_t dat = 0x0123456776543210;//要写入的数据,必须得是双字64bit
uint64_t read_dat = 0 ;
FLASH_EraseInitTypeDef flash_dat; //定义一个结构体变量,里面有擦除操作需要定义的变量
HAL_FLASH_Unlock(); //第二步:解锁
flash_dat.TypeErase = FLASH_TYPEERASE_PAGES; //擦除类型是“Page Erase” 仅删除页面 另外一个参数是全部删除
flash_dat.Page = (uint32_t)((add-0x08000000)/2048); //擦除地址对应的页
flash_dat.NbPages = 1; //一次性擦除1页,可以是任意页
flash_dat.Banks=1;
HAL_FLASHEx_Erase(&flash_dat,&error); //第三步:参数写好后调用擦除函数
HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, add, dat);//第四步:写入数据
HAL_FLASH_Lock(); //第五步:上锁
read_dat = *(__I uint64_t *)add; //读出flash中的数据
uint32_t read_dat1=read_dat>>32;
uint32_t read_dat2=read_dat&0x00000000FFFFFFFF;
printf("[INFO] Flash_Test:0x%08x 0x%08x\n",read_dat1,read_dat2);
}
步骤就是:
解锁;
擦除;
写数据;
上锁。
读数据就用
read_dat = *(__I uint64_t *)add;
__I
表示read only
测试结果如下:
debug调试界面结果
有个需要注意的地方 那就是Flash擦写次数为1w次 所以测试的时候千万不能放在死循环下面