这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » STM32G070RB探测20-内部flash操作(上电次数统计)

共8条 1/1 1 跳转至

STM32G070RB探测20-内部flash操作(上电次数统计)

高工
2021-01-13 23:00:42     打赏
我们开发的时候应该有很多时候需要存储一些参数,需要掉电存储,玩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();

把函数放到程序开始

看现象

烧入程序

按复位按键

看到会自加,说明已经成功



工程师
2021-01-13 23:42:15     打赏
2楼

感谢分享


工程师
2021-01-13 23:58:08     打赏
3楼

感谢您的分享


工程师
2021-01-15 17:16:44     打赏
4楼

干货


工程师
2021-01-15 17:36:16     打赏
5楼

学习了


工程师
2021-01-15 23:57:36     打赏
6楼

统计做的非常准确


专家
2021-01-16 09:45:43     打赏
7楼

干货,谢谢分享!


高工
2021-01-16 23:56:05     打赏
8楼

学到经验了


共8条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]