这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界» 论坛首页» 嵌入式开发» 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 跳转至

回复

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