操作步骤: 上电读取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();
把函数放到程序开始
看现象烧入程序
按复位按键
看到会自加,说明已经成功