功能介绍:Flash断电数据不丢失
单片机:STM32F103C8t6
实现功能实现数据不丢失
调用文件:flash.h
调用函数:
FLASH_Unlock(void);//解锁
FLASH_Lock(void);//上锁
FLASH_ErasePage(uint32_t Page_Address);//擦除指定地址的页
FLASH_EraseAllPages(void);//擦除全部页
FLASH_ProgramWord(uint32_t Address, uint32_t Data);//写入字
FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data);//写入半字
核心代码:
uint16_t Data = *((__IO uint16_t *)(0x08000000));//读数指定地址的数据
*((__IO uint16_t *)(0x08000000)) = 0x1234;//写数据到指定地址
注意事项:
在做项目时尽量不要使用FLASH_EraseAllPages(void)函数,以免擦除所有数据,程序代码也是存贮在flash中,以免把代码清除。
代码如下
main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "MyFLASH.h"
int main(void)
{
OLED_Init();
OLED_ShowHexNum(1,1,MyFLASH_ReadWord(0x08000000),8);
OLED_ShowHexNum(2,1,MyFLASH_ReadHalfWord(0x08000000),4);
OLED_ShowHexNum(3,1,MyFLASH_ReadByte(0x08000000),2);
while (1)
{
}
}
MyFlash.c
#include "stm32f10x.h" // Device header
uint32_t MyFLASH_ReadWord(uint32_t Address)
{
return *((__IO uint32_t *)(Address));
}
uint16_t MyFLASH_ReadHalfWord(uint32_t Address)
{
return *((__IO uint16_t *)(Address));
}
uint8_t MyFLASH_ReadByte(uint32_t Address)
{
return *((__IO uint8_t *)(Address));
}
MyFlash.h
#ifndef __MYFLASH_H
#define __MYFLASH_H
uint32_t MyFLASH_ReadWord(uint32_t Address);
uint16_t MyFLASH_ReadHalfWord(uint32_t Address);
uint8_t MyFLASH_ReadByte(uint32_t Address);
#endif
在进行写入操作时,必须先擦除页,擦除的最小单位是页,不能擦除字,所以代码还需要继续封装
封装代码如下:
Store.c
#include "stm32f10x.h" // Device header
#include "MyFLASH.h"
#define STORE_START_ADDRESS 0x0800FC00//尾页
#define STORE_COUNT 512//一页的数据
uint16_t Store_Data[STORE_COUNT];//第几个数据
void Store_Init(void)//Store初始化
{
if (MyFLASH_ReadHalfWord(STORE_START_ADDRESS) != 0xA5A5)//尾页的初始化判断尾页是否有使用,没有使用则不进行初始化函数
{
MyFLASH_ErasePage(STORE_START_ADDRESS);//清除页
MyFLASH_ProgramHalfWord(STORE_START_ADDRESS, 0xA5A5);//把页的第一个半字设置为标志位
for (uint16_t i = 1; i < STORE_COUNT; i ++)//循环STORE_COUNT-1次
{
MyFLASH_ProgramHalfWord(STORE_START_ADDRESS + i * 2, 0x0000);//并且把除了标志位的数据都全部置为0
}
}
for (uint16_t i = 0; i < STORE_COUNT; i ++)//循环一个页,把所有数据都缓存在Store数组中
{
Store_Data[i] = MyFLASH_ReadHalfWord(STORE_START_ADDRESS + i * 2);
}
}
void Store_Save(void)
{
MyFLASH_ErasePage(STORE_START_ADDRESS);
for (uint16_t i = 0; i < STORE_COUNT; i ++)//保存所有数据并且Store的所有数据写入flash中;
{
MyFLASH_ProgramHalfWord(STORE_START_ADDRESS + i * 2, Store_Data[i]);
}
}
void Store_Clear(void)//清除所有数据
{
for (uint16_t i = 1; i < STORE_COUNT; i ++)
{
Store_Data[i] = 0x0000;
}
Store_Save();
}
Store.h
#ifndef __PARAM_LIST_H
#define __PARAM_LIST_H
extern uint16_t Store_Data[];
void Store_Init(void);
void Store_Save(void);
void Store_Clear(void);
#endif
注意:在执行写入flash函数时要先进行擦除
Store代码类似于两个相互交换的代码