stm32的内部flash在我们实际运行的时候。很多时候并没有用完,还有许许多多的空闲内存,因此可以利用内部flash存储一些数据。我使用的是stm32f407vet6 ,所以就用这个芯片来进行演示。
认识内部的存储划分。
这是芯片内部的存储划分,需要注意的是,我们自己的程序也是存储在这些位置,所以需要存储在应用程序没有使用的内存区域,关于如何查看内存的划分,可以去查看map文件,在此不展开叙述。
由于读写内部flash不需要特别的外设,只需要开启一个串口就好了。
使用的是cube生成的
开始读写
读写内部flash只需要几个结构体,函数就可以了。
HAL_FLASH_Unlock(); 解锁内部flash函数,默认内部flASH是锁上的,使用的时候,需要解锁。
FLASH_EraseInitTypeDef 擦除内部flash的结构体,
HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *SectorError) 擦除函数
需要注意的是 与flash有关的函数,在两个文件中
#include “stm32f4xx_hal_flash.h”
#include "stm32f4xx_hal_flash_ex.h"
因此需要包含着两个头文件。
HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data) flash写入数据函数,需要注意的是第一个参数,决定写入数据的类型 八位,16位 32 位。
uint8_t erase_flash(uint32_t sector_start,uint32_t sector_end)
{FLASH_EraseInitTypeDef EraseInitStruct;
uint32_t SECTORError = 0;
uint32_t address,i;
HAL_FLASH_Unlock(); 解锁内部flash
//FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);
EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS; 以扇区进行擦除
EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_3;/* ÒÔ¡°×Ö¡±µÄ´óС½øÐвÙ×÷ */
EraseInitStruct.Sector = sector_start; 擦除扇区的首 如果要擦除第五扇区,此处就填入5
EraseInitStruct.NbSectors = sector_end; 擦除扇区的尾,如果擦除第五扇区,就填入6 if (HAL_FLASHEx_Erase(&EraseInitStruct, &SECTORError) != HAL_OK)
{ return -1;
}
//address=add; HAL_FLASH_Lock();
} uint8_t writedata_to_flash(uint8_t *data,uint32_t len,uint32_t address)
{
HAL_FLASH_Unlock();
//FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);
uint32_t i=0,temp;
for(i=0;i<len;i++)
{
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_BYTE, (uint32_t)address, *data) == HAL_OK)
注意我是以8位数据写入的,因此第一个参数写入的byte ,如果要想写入32位的数据,改为对应的参数就行了。
{
address = address + 1;
data=data+1; }
else
{
/*дÈë³ö´í£¬·µ»Ø£¬Êµ¼ÊÓ¦ÓÃÖпɼÓÈë´¦Àí */
return -1;
} }
HAL_FLASH_Lock();
}
此函数是将一个uint8_t类型的数组,写入对应的内部flash。
有了这来个函数,就能对内部flash进行读写的
在主函数进行申明
uint8_t flag=10,a[8]={22,33,44,55,66,77,88}; 即将写入到内存的数据
uint32_t writeFlashData = 0x55555555;
uint32_t addr = ((uint32_t)0x08020000);这是第五扇区的开始地址
erase_flash(5,6); 擦除第五扇区
writedata_to_flash(a, 8,addr);将数组写入
读取数据,查看是否写入成功
printf("at address:0x%x, read value:0x%d\r\n", addr, *(__IO uint8_t*)addr);
printf("at address:0x%x, read value:0x%d\r\n", addr+1, *(__IO uint8_t*)(addr+1));
printf("at address:0x%x, read value:0x%d\r\n", addr+2, *(__IO uint8_t*)(addr+2));
printf("at address:0x%x, read value:0x%d\r\n", addr+3, *(__IO uint8_t*)(addr+3));