STM32学习-读写FLASH-20240918

一、简介

volatile表示该变量不会被编译器优化。uint16_t *表示转为16位指针变量。*()表示指针取内容。

二、库函数

void FLASH_Unlock(void);//解锁
void FLASH_Lock(void);//加锁

FLASH_Status FLASH_ErasePage(uint32_t Page_Address);//页擦除

FLASH_Status FLASH_EraseAllPages(void);//全擦除

FLASH_Status FLASH_EraseOptionBytes(void);//擦除选项字节

FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data);//写入字
FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data);//写入半字

FLASH_Status FLASH_ProgramOptionByteData(uint32_t Address, uint8_t Data);//自定义的Data1和Data2,选项字节
FLASH_Status FLASH_EnableWriteProtection(uint32_t FLASH_Pages);//写保护
FLASH_Status FLASH_ReadOutProtection(FunctionalState NewState);//读保护
FLASH_Status FLASH_UserOptionByteConfig(uint16_t OB_IWDG, uint16_t OB_STOP, uint16_t OB_STDBY);//用户选项的三个配置位

uint32_t FLASH_GetUserOptionByte(void);//获取用户字节的三个状态
uint32_t FLASH_GetWriteProtectionOptionByte(void);//获取写保护状态
FlagStatus FLASH_GetReadOutProtectionStatus(void);//获取读保护状态

FlagStatus FLASH_GetPrefetchBufferStatus(void);//获取预取缓冲区状态

void FLASH_ITConfig(uint32_t FLASH_IT, FunctionalState NewState);//中断使能
FlagStatus FLASH_GetFlagStatus(uint32_t FLASH_FLAG);//获取标志位
void FLASH_ClearFlag(uint32_t FLASH_FLAG);//清除标志位

FLASH_Status FLASH_GetStatus(void);//获取状态
FLASH_Status FLASH_WaitForLastOperation(uint32_t Timeout);//等待操作,不用单独调用

三、读写FLASH

#include "stm32f10x.h"                  // Device header

uint32_t MyFLASH_ReadWord(uint32_t Address)
{
	return *((__IO uint32_t *)(Address));//利用指针读取一个字,__IO表示易变变量,uint32_t *表示转为32位指针变量
											//*()表示取指针的数据
}

uint32_t MyFLASH_ReadHalfWord(uint32_t Address)
{
	return *((__IO uint16_t *)(Address));//利用指针读取一个字,__IO表示易变变量,uint32_t *表示转为32位指针变量
											//*()表示取指针的数据
}

uint32_t MyFLASH_ReadByte(uint32_t Address)//门牌号,即地址不变,只是每次出来的人数变化
{
	return *((__IO uint8_t *)(Address));//利用指针读取一个字,__IO表示易变变量,uint32_t *表示转为32位指针变量
											//*()表示取指针的数据
}

void MyFLASH_EraseAllPages(void)
{
	FLASH_Unlock();//解锁
	FLASH_EraseAllPages();//全擦除
	FLASH_Lock();//上锁
}

void MyFLASH_ErashPage(uint32_t PageAddress)
{
	FLASH_Unlock();//解锁
	FLASH_ErasePage(PageAddress);//页擦除
	FLASH_Lock();//上锁
}

void MyFLASH_ProgramWord(uint32_t Address, uint32_t Data)
{
	FLASH_Unlock();
	FLASH_ProgramWord(Address, Data);//写入字
	FLASH_Lock();
}

void MyFLASH_ProgramHalfWord(uint32_t Address, uint16_t Data)
{
	FLASH_Unlock();
	FLASH_ProgramHalfWord(Address, Data);//写入半字
	FLASH_Lock();
}

四、利用SRAM读写FLASH

#include "stm32f10x.h"                  // Device header
#include "MyFLASH.h"

#define STORE_START_ADDRESS 0x0800FC00
#define STORE_COUNT 512

uint16_t Store_Data[512];//数组保存在SRAM中,读取速度快,但是掉电丢失

void Store_Init(void)
{
	if (MyFLASH_ReadHalfWord(STORE_START_ADDRESS) != 0xA5A5)
	{
		MyFLASH_ErashPage(STORE_START_ADDRESS);
		MyFLASH_ProgramHalfWord(STORE_START_ADDRESS,0xA5A5);//自定义标志位
		for (uint16_t i = 1; i < STORE_COUNT; i++)
		{
			MyFLASH_ProgramHalfWord(STORE_START_ADDRESS + i * 2, 0x0000);//闪存初始化
		}
	}
	for (uint16_t i = 0; i < STORE_COUNT; i++)
	{
		Store_Data[i] = MyFLASH_ReadHalfWord(STORE_START_ADDRESS + i * 2);//把数据读出来,上电之后把FLASH中的数据读到SRAM中
	}
}

void Store_Save(void)
{
	MyFLASH_ErashPage(STORE_START_ADDRESS);
	for (uint16_t i = 0; i < STORE_COUNT; i++)
	{
		MyFLASH_ProgramHalfWord(STORE_START_ADDRESS + i * 2, Store_Data[i]);//把需要保存的数据从SRAM中转移到FLASH中
	}

}

void Store_Clear(void)
{
	for (uint16_t i = 1; i < STORE_COUNT; i++)
	{
		Store_Data[i] = 0x0000;//清除SRAM中的数据
	}
	Store_Save();//同时保持SRAM中数据与FLASH中一致
}

五、读取ID号

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Store.h"
#include "KEY.h"

uint8_t kEYNUM;
int main(void)
{
	OLED_Init();

	OLED_ShowString(1, 1, "F_SIZE");
	OLED_ShowHexNum(1, 8, *((__IO uint16_t *)(0x1FFFF7E0)), 4);//显示芯片容量
	
	OLED_ShowString(2, 1, "UID");
	OLED_ShowHexNum(2, 6, *((__IO uint16_t *)(0x1FFFF7E8)), 4);
	OLED_ShowHexNum(2, 11, *((__IO uint16_t *)(0x1FFFF7E8 + 0x02)), 4);
	OLED_ShowHexNum(3, 1, *((__IO uint32_t *)(0x1FFFF7E8 + 0x04)), 8);
	OLED_ShowHexNum(3, 10, *((__IO uint32_t *)(0x1FFFF7E8 + 0x08)), 8);
	
	while(1)
	{
		
	}
	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值