stm32学习笔记flash外设

功能介绍: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代码类似于两个相互交换的代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值