flash应用:将单片机未使用部分的flash来存储数据,以达到掉电保存数据的作用相当于EEPROM。这里的话主要是代码的实现STM32CubeMx不用去配置。
flash.c文件如下:
#include "flash.h"
uint32_t startAddress;
uint32_t endAddress;
uint32_t Data = 0x12345678;
//FLASH写入数据
void WriteFlash(uint32_t Address)
{
uint16_t i = 0;
uint32_t Data;
startAddress = SN;
endAddress = SN+16;
HAL_FLASH_Unlock();
FLASH_EraseInitTypeDef f;
f.TypeErase = FLASH_TYPEERASE_PAGES;
f.PageAddress = Address;
f.NbPages = 1;
uint32_t PageError = 0;
HAL_FLASHEx_Erase(&f, &PageError);
//在startAddress~endAddress写入4组0x12345678
while(startAddress < endAddress)
{
if(HAL_FLASH_Program(TYPEPROGRAM_WORD, startAddress, Data) == HAL_OK)
{
startAddress +=4;
}
}
//4、锁住FLASH
HAL_FLASH_Lock();
}
//FLASH读取数据
uint32_t ReadFlash(uint32_t Address)
{
uint32_t temp = *(__IO uint32_t*)(Address);
return temp;
}
flash.h如下:
#ifndef __FLASH_H
#define __FLASH_H
#include "stm32l0xx_hal.h"
#define SN 0x08010000
#define PN 0x08010010
#define SOFTWARE_VERSION 0x08010020
#define HARDWARE_VERSION 0x08010030
void WriteFlash(uint32_t Address);
uint32_t ReadFlash(uint32_t Address);
#endif
调用时直接加入:
WriteFlash(SN);
可以通过仿真查看FLASH地址看有没有数据写进去
也可以通过访问地址去读取地址的值并将其打印出来
ReadFlash(SN);
注意使用函数读时只能访问4的倍数的地址即:ReadFlash(0x08010000)和ReadFlash(0x08010004)而不能访问非4的倍数的空间否则程序会跑飞。每个地址存放4个字节。
还有写时注意,因为写是一页一页的写,所以先WriteFlash(0x08010000)在WriteFlash(0x08010004)会使得前面写的失效,如我的单片机一页是128个地址。这两个地址属于同一页,由于写时要先擦除,前面写的内容就会给擦掉。当要在一页里面写入多个数据时就如我上面这样写即可。