【极海APM32替代笔记】HAL库Flash读写操作及配置

【极海APM32替代笔记】HAL库Flash读写操作及配置

【极海APM32替代笔记】HAL库Flash读写操作及配置_第1张图片
在keil里面的默认工程配置中 Flash分配地址 程序部分为0x0800 0000到0x0810 0000 总共是0x0010 0000的大小 也就是1048576Byte 1024KB 1MB

而实际上程序部分大小应该要看硬件手册来确定

可以通过配置keil工程中size的大小 来确定程序地址的范围(如果太小了 编译会报错) 在进行flash读写时 应跳过程序部分

在用户手册里 可以查看flash的分配情况
【极海APM32替代笔记】HAL库Flash读写操作及配置_第2张图片
如STM32L496xx 有两个banks 每个bank有256页 每一页对应2KB 一共是1MB

【极海APM32替代笔记】HAL库Flash读写操作及配置_第3张图片
我的程序编译后 大概占用了24192的空间 也就要跳过这个空间才能进行读写操作

在这里插入图片描述

基本上 大小选择为0x10000也是不会报错的
【极海APM32替代笔记】HAL库Flash读写操作及配置_第4张图片
那进行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

测试结果如下:
【极海APM32替代笔记】HAL库Flash读写操作及配置_第5张图片

debug调试界面结果
【极海APM32替代笔记】HAL库Flash读写操作及配置_第6张图片

有个需要注意的地方 那就是Flash擦写次数为1w次 所以测试的时候千万不能放在死循环下面

你可能感兴趣的:(极海APM32替代笔记,单片机,stm32,嵌入式硬件)