我们开发的时候应该有很多时候需要存储一些参数,需要掉电存储,玩51的时候用的多的是EEPROM,也有外部flash,今天我用下内部flash,记录一下上电次数.目的 每次上电次数加1
操作步骤: 上电读取flash默认地址的数据 读出来打印 +1再存入
看看手册我们在stm32cubeide右下角可以看到

查看所使用芯片的信息,Flash起始地址为0x08000000,大小为0x00020000(128KB).
再去数据手册看哈

是每页2K,那我们的芯片就是64页
再看看库文件主要用的就是这两个函数
擦除


写入


步骤很简单就是先读,再擦,再写
读取很简单,因为仍然是在FLASH,所以直接用memcpy函数就可以
写程序先定义变量及结构体
uint32_t PageError = 0; uint32_t start_count;//次数 uint32_t addr = 0x0801FE00;//数据存储地址 HAL_StatusTypeDef status; FLASH_EraseInitTypeDef EraseInitStruct1;//擦除结构体 EraseInitStruct1.TypeErase = FLASH_TYPEERASE_PAGES;//擦除 EraseInitStruct1.Banks = FLASH_BANK_1; //块 EraseInitStruct1.Page = 63; //最后一页 EraseInitStruct1.NbPages = 1; //只擦除一页
读取数据
/* 读取Flash内容 */
memcpy((uint8_t *)&start_count, (uint32_t*)addr, sizeof(uint32_t));
if(start_count == 0xffffffff)
{
start_count = 1;
}
printf("start_count:%ld\r\n",(uint32_t)start_count);
start_count ++;第一次读到为0XFFFFFFFF,赋值为1,然后就是自加
擦除数据
/* 写入新的数据 */
//解锁Flash操作
HAL_FLASH_Unlock();
//擦除
status = HAL_FLASHEx_Erase(&EraseInitStruct1, &PageError);
//重新上锁
HAL_FLASH_Lock();
if(status != HAL_OK)
printf("erase fail\r\n");
else
printf("erase success\r\n");写入数据
//写入Flash内容
HAL_FLASH_Unlock();
//一个字是32位,一次写入两个字,64位,8个字节
status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, addr, (uint64_t)start_count);
if(status == HAL_OK)
{
printf("write success\r\n");
}
HAL_FLASH_Lock();把函数放到程序开始
看现象烧入程序

按复位按键

看到会自加,说明已经成功## 我们开发的时候应该有很多时候需要存储一些参数,需要掉电存储,玩51的时候用的多的是EEPROM,也有外部flash,今天我用下内部flash,记录一下上电次数.
目的 每次上电次数加1操作步骤: 上电读取flash默认地址的数据 读出来打印 +1再存入
看看手册我们在stm32cubeide右下角可以看到

查看所使用芯片的信息,Flash起始地址为0x08000000,大小为0x00020000(128KB).
再去数据手册看哈

是每页2K,那我们的芯片就是64页
再看看库文件主要用的就是这两个函数
擦除


写入


步骤很简单就是先读,再擦,再写
读取很简单,因为仍然是在FLASH,所以直接用memcpy函数就可以
写程序先定义变量及结构体
uint32_t PageError = 0; uint32_t start_count;//次数 uint32_t addr = 0x0801FE00;//数据存储地址 HAL_StatusTypeDef status; FLASH_EraseInitTypeDef EraseInitStruct1;//擦除结构体 EraseInitStruct1.TypeErase = FLASH_TYPEERASE_PAGES;//擦除 EraseInitStruct1.Banks = FLASH_BANK_1; //块 EraseInitStruct1.Page = 63; //最后一页 EraseInitStruct1.NbPages = 1; //只擦除一页
读取数据
/* 读取Flash内容 */
memcpy((uint8_t *)&start_count, (uint32_t*)addr, sizeof(uint32_t));
if(start_count == 0xffffffff)
{
start_count = 1;
}
printf("start_count:%ld\r\n",(uint32_t)start_count);
start_count ++;第一次读到为0XFFFFFFFF,赋值为1,然后就是自加
擦除数据
/* 写入新的数据 */
//解锁Flash操作
HAL_FLASH_Unlock();
//擦除
status = HAL_FLASHEx_Erase(&EraseInitStruct1, &PageError);
//重新上锁
HAL_FLASH_Lock();
if(status != HAL_OK)
printf("erase fail\r\n");
else
printf("erase success\r\n");写入数据
//写入Flash内容
HAL_FLASH_Unlock();
//一个字是32位,一次写入两个字,64位,8个字节
status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, addr, (uint64_t)start_count);
if(status == HAL_OK)
{
printf("write success\r\n");
}
HAL_FLASH_Lock();把函数放到程序开始
看现象烧入程序

按复位按键

看到会自加,说明已经成功
我要赚赏金
