Flash

/**  
 * @brief 设置闪存延迟周期  
 *  
 * 根据系统时钟设置闪存的延迟周期。  
 *  
 * @param FLASH_Latency 闪存延迟周期值  
 */  
void FLASH_SetLatency(uint32_t FLASH_Latency);  
  
/**  
 * @brief 半周期访问使能/失能  
 *  
 * 启用或禁用闪存半周期访问功能。  
 *  
 * @param FLASH_HalfCycleAccess 启用或禁用半周期访问  
 *   - FLASH_HalfCycleAccess_Enable: 启用  
 *   - FLASH_HalfCycleAccess_Disable: 禁用  
 */  
void FLASH_HalfCycleAccessCmd(uint32_t FLASH_HalfCycleAccess);  
  
/**  
 * @brief 预取缓冲区使能/失能  
 *  
 * 启用或禁用闪存预取缓冲区功能。  
 *  
 * @param FLASH_PrefetchBuffer 启用或禁用预取缓冲区  
 *   - FLASH_PrefetchBuffer_Enable: 启用  
 *   - FLASH_PrefetchBuffer_Disable: 禁用  
 */  
void FLASH_PrefetchBufferCmd(uint32_t FLASH_PrefetchBuffer);  
  
/**  
 * @brief 解锁闪存编程/擦除控制寄存器  
 *  
 * 在对闪存进行编程或擦除操作前,需要先解锁相关的控制寄存器。  
 */  
void FLASH_Unlock(void);  
  
/**  
 * @brief 锁定闪存编程/擦除控制寄存器  
 *  
 * 在完成对闪存的编程或擦除操作后,锁定相关的控制寄存器以防止误操作。  
 */  
void FLASH_Lock(void);  
  
/**  
 * @brief 擦除闪存页  
 *  
 * 擦除指定地址的闪存页。  
 *  
 * @param Page_Address 要擦除的闪存页的地址  
 * @return 擦除状态  
 *   - FLASH_COMPLETE: 擦除成功  
 *   - FLASH_TIMEOUT: 擦除超时  
 *   - FLASH_ERROR: 擦除错误  
 */  
FLASH_Status FLASH_ErasePage(uint32_t Page_Address);  
  
/**  
 * @brief 擦除所有闪存页  
 *  
 * 擦除闪存中的所有页。  
 *  
 * @return 擦除状态  
 *   - FLASH_COMPLETE: 擦除成功  
 *   - FLASH_TIMEOUT: 擦除超时  
 *   - FLASH_ERROR: 擦除错误  
 */  
FLASH_Status FLASH_EraseAllPages(void);  
  
/**  
 * @brief 擦除选项字节  
 *  
 * 擦除闪存中的选项字节区域。  
 *  
 * @return 擦除状态  
 *   - FLASH_COMPLETE: 擦除成功  
 *   - FLASH_TIMEOUT: 擦除超时  
 *   - FLASH_ERROR: 擦除错误  
 */  
FLASH_Status FLASH_EraseOptionBytes(void);  
  
/**  
 * @brief 编程闪存字  
 *  
 * 在指定地址处编程一个32位字。  
 *  
 * @param Address 要编程的地址  
 * @param Data 要编程的数据  
 * @return 编程状态  
 *   - FLASH_COMPLETE: 编程成功  
 *   - FLASH_TIMEOUT: 编程超时  
 *   - FLASH_ERROR: 编程错误  
 */  
FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data);
/**  
 * @brief 编程闪存半字  
 *  
 * 在指定地址处编程一个16位半字。  
 *  
 * @param Address 要编程的地址  
 * @param Data 要编程的数据  
 * @return 编程状态  
 *   - FLASH_COMPLETE: 编程成功  
 *   - FLASH_TIMEOUT: 编程超时  
 *   - FLASH_ERROR: 编程错误  
 */  
FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data);  
  
/**  
 * @brief 编程选项字节数据  
 *  
 * 在指定地址处编程选项字节数据。  
 *  
 * @param Address 选项字节的地址  
 * @param Data 要编程的数据  
 * @return 编程状态  
 *   - FLASH_COMPLETE: 编程成功  
 *   - FLASH_TIMEOUT: 编程超时  
 *   - FLASH_ERROR: 编程错误  
 */  
FLASH_Status FLASH_ProgramOptionByteData(uint32_t Address, uint8_t Data);  
  
/**  
 * @brief 启用写保护  
 *  
 * 启用指定闪存页的写保护。  
 *  
 * @param FLASH_Pages 要保护的闪存页  
 * @return 操作状态  
 *   - FLASH_COMPLETE: 操作成功  
 *   - FLASH_TIMEOUT: 操作超时  
 *   - FLASH_ERROR: 操作错误  
 */  
FLASH_Status FLASH_EnableWriteProtection(uint32_t FLASH_Pages);  
  
/**  
 * @brief 读取保护使能/失能  
 *  
 * 启用或禁用闪存读取保护。  
 *  
 * @param NewState 新的状态  
 *   - ENABLE: 启用读取保护  
 *   - DISABLE: 禁用读取保护  
 * @return 操作状态  
 *   - FLASH_COMPLETE: 操作成功  
 *   - FLASH_TIMEOUT: 操作超时  
 *   - FLASH_ERROR: 操作错误  
 */  
FLASH_Status FLASH_ReadOutProtection(FunctionalState NewState);  
  
/**  
 * @brief 用户选项字节配置  
 *  
 * 配置用户选项字节,包括独立看门狗(IWDG)、STOP模式和STANDBY模式的选项。  
 *  
 * @param OB_IWDG 独立看门狗配置  
 * @param OB_STOP STOP模式配置  
 * @param OB_STDBY STANDBY模式配置  
 * @return 操作状态  
 *   - FLASH_COMPLETE: 操作成功  
 *   - FLASH_TIMEOUT: 操作超时  
 *   - FLASH_ERROR: 操作错误  
 */  
FLASH_Status FLASH_UserOptionByteConfig(uint16_t OB_IWDG, uint16_t OB_STOP, uint16_t OB_STDBY);  
  
/**  
 * @brief 获取用户选项字节  
 *  
 * 读取用户选项字节的值。  
 *  
 * @return 用户选项字节的值  
 */  
uint32_t FLASH_GetUserOptionByte(void);  
  
/**  
 * @brief 获取写保护选项字节  
 *  
 * 读取写保护选项字节的值。  
 *  
 * @return 写保护选项字节的值  
 */  
uint32_t FLASH_GetWriteProtectionOptionByte(void);  
  
/**  
 * @brief 获取读取保护状态  
 *  
 * 检查闪存读取保护是否被启用。  
 *  
 * @return 读取保护状态  
 *   - SET: 读取保护已启用  
 *   - RESET: 读取保护未启用  
 */  
FlagStatus FLASH_GetReadOutProtectionStatus(void);  
  
/**  
 * @brief 获取预取缓冲区状态  
 *  
 * 检查闪存预取缓冲区是否被启用。  
 *  
 * @return 预取缓冲区状态  
 *   - SET: 预取缓冲区已启用  
 *   - RESET: 预取缓冲区未启用  
 */  
FlagStatus FLASH_GetPrefetchBufferStatus(void);
/**  
 * @brief 配置FLASH中断  
 *  
 * 使能或禁用指定的FLASH中断。  
 *  
 * @param FLASH_IT FLASH中断类型  
 * @param NewState 中断使能/禁用状态  
 *   - ENABLE: 启用中断  
 *   - DISABLE: 禁用中断  
 */  
void FLASH_ITConfig(uint32_t FLASH_IT, FunctionalState NewState);  
  
/**  
 * @brief 获取FLASH标志状态  
 *  
 * 检查指定的FLASH标志是否被设置。  
 *  
 * @param FLASH_FLAG FLASH标志  
 * @return 标志状态  
 *   - SET: 标志被设置  
 *   - RESET: 标志未被设置  
 */  
FlagStatus FLASH_GetFlagStatus(uint32_t FLASH_FLAG);  
  
/**  
 * @brief 清除FLASH标志  
 *  
 * 清除指定的FLASH标志。  
 *  
 * @param FLASH_FLAG FLASH标志  
 */  
void FLASH_ClearFlag(uint32_t FLASH_FLAG);  
  
/**  
 * @brief 获取FLASH状态  
 *  
 * 返回FLASH的当前状态。  
 *  
 * @return FLASH状态  
 */  
FLASH_Status FLASH_GetStatus(void);  
  
/**  
 * @brief 等待上一次操作完成  
 *  
 * 等待上一次FLASH操作完成或超时。  
 *  
 * @param Timeout 超时时间  
 * @return 操作状态  
 *   - FLASH_COMPLETE: 操作完成  
 *   - FLASH_TIMEOUT: 操作超时  
 *   - FLASH_ERROR: 操作错误  
 */  
FLASH_Status FLASH_WaitForLastOperation(uint32_t Timeout);  
  
/**  
 * @brief 解锁Bank 1  
 *  
 * 解锁Bank 1的写保护,以便对其进行编程或擦除操作。  
 */  
void FLASH_UnlockBank1(void);  
  
/**  
 * @brief 锁定Bank 1  
 *  
 * 锁定Bank 1的写保护,防止对其进行编程或擦除操作。  
 */  
void FLASH_LockBank1(void);  
  
/**  
 * @brief 擦除Bank 1的所有页  
 *  
 * 擦除Bank 1中的所有闪存页。  
 *  
 * @return 擦除状态  
 *   - FLASH_COMPLETE: 擦除完成  
 *   - FLASH_TIMEOUT: 擦除超时  
 *   - FLASH_ERROR: 擦除错误  
 */  
FLASH_Status FLASH_EraseAllBank1Pages(void);  
  
/**  
 * @brief 获取Bank 1的状态  
 *  
 * 返回Bank 1的当前状态。  
 *  
 * @return Bank 1的状态  
 */  
FLASH_Status FLASH_GetBank1Status(void);  
  
/**  
 * @brief 等待Bank 1的上一次操作完成  
 *  
 * 等待Bank 1的上一次FLASH操作完成或超时。  
 *  
 * @param Timeout 超时时间  
 * @return 操作状态  
 *   - FLASH_COMPLETE: 操作完成  
 *   - FLASH_TIMEOUT: 操作超时  
 *   - FLASH_ERROR: 操作错误  
 */  
FLASH_Status FLASH_WaitForLastBank1Operation(uint32_t Timeout);

image.png
image.png
•使用指针读指定地址下的存储器:
uint16_t Data = *((__IO uint16_t )(0x08000000));
//指定0x08000000并把它设定为volatile 然后强转为uint16_t指针类型,并取出指针指向的数据赋值给Data
•使用指针写指定地址下的存储器:
((__IO uint16_t *)(0x08000000)) = 0x1234;
•其中:
#define __IO volatile
image.png
LOCK位:为0芯片锁了,为1芯片没锁
FLASH_CR: 控制寄存器
STRT:为1为触发条件,芯片开始干活
MER=1:执行全擦除
BSY=1:芯片忙
image.png
AR寄存器:存储擦除页起始地址
字:32位
半字:16位
字节:8位
image.png
写入寄存器时需要再带n的名称相同的寄存器写入反码,这样操作才是有效的
image.png
1.事前等待
2.OPTWRE:解除小锁
image.png
电子签名即STM32ID号

  1. FLASH读取一个8位的字节
**
  * 函    数:FLASH读取一个8位的字节
  * 参    数:Address 要读取数据的字节地址
  * 返 回 值:指定地址下的数据
  */
uint8_t MyFLASH_ReadByte(uint32_t Address)
{
	return *((__IO uint8_t *)(Address));	//使用指针访问指定地址下的数据并返回
}
  1. FLASH读取一个16位的半字
/**
  * 函    数:FLASH读取一个16位的半字
  * 参    数:Address 要读取数据的半字地址
  * 返 回 值:指定地址下的数据
  */
uint16_t MyFLASH_ReadHalfWord(uint32_t Address)
{
	return *((__IO uint16_t *)(Address));	//使用指针访问指定地址下的数据并返回
}
  1. FLASH读取一个32位的字
/**
  * 函    数:FLASH读取一个32位的字
  * 参    数:Address 要读取数据的字地址
  * 返 回 值:指定地址下的数据
  */
uint32_t MyFLASH_ReadWord(uint32_t Address)
{
	return *((__IO uint32_t *)(Address));	//使用指针访问指定地址下的数据并返回
}
  1. FLASH编程半字
/**
  * 函    数:FLASH编程半字
  * 参    数:Address 要写入数据的半字地址
  * 参    数:Data 要写入的16位数据
  * 返 回 值:无
  */
void MyFLASH_ProgramHalfWord(uint32_t Address, uint16_t Data)
{
	FLASH_Unlock();							//解锁
	FLASH_ProgramHalfWord(Address, Data);	//编程半字
	FLASH_Lock();							//加锁
}
  1. FLASH编程字
/**
  * 函    数:FLASH编程字
  * 参    数:Address 要写入数据的字地址
  * 参    数:Data 要写入的32位数据
  * 返 回 值:无
  */
void MyFLASH_ProgramWord(uint32_t Address, uint32_t Data)
{
	FLASH_Unlock();							//解锁
	FLASH_ProgramWord(Address, Data);		//编程字
	FLASH_Lock();							//加锁
}
  1. FLASH页擦除
/**
  * 函    数:FLASH页擦除
  * 参    数:PageAddress 要擦除页的页地址
  * 返 回 值:无
  */
void MyFLASH_ErasePage(uint32_t PageAddress)
{
	FLASH_Unlock();					//解锁
	FLASH_ErasePage(PageAddress);	//页擦除
	FLASH_Lock();					//加锁
}
  1. FLASH全擦除
/**
  * 函    数:FLASH全擦除
  * 参    数:无
  * 返 回 值:无
  * 说    明:调用此函数后,FLASH的所有页都会被擦除,包括程序文件本身,擦除后,程序将不复存在
  */
void MyFLASH_EraseAllPages(void)
{
	FLASH_Unlock();					//解锁
	FLASH_EraseAllPages();			//全擦除
	FLASH_Lock();					//加锁
}
  1. 参数存储模块初始化
/**
  * 函    数:参数存储模块初始化
  * 参    数:无
  * 返 回 值:无
  */
void Store_Init(void)
{
	/*判断是不是第一次使用*/
	if (MyFLASH_ReadHalfWord(STORE_START_ADDRESS) != 0xA5A5)	//读取第一个半字的标志位,if成立,则执行第一次使用的初始化
	{
		MyFLASH_ErasePage(STORE_START_ADDRESS);					//擦除指定页
		MyFLASH_ProgramHalfWord(STORE_START_ADDRESS, 0xA5A5);	//在第一个半字写入自己规定的标志位,用于判断是不是第一次使用
		for (uint16_t i = 1; i < STORE_COUNT; i ++)				//循环STORE_COUNT次,除了第一个标志位
		{
			MyFLASH_ProgramHalfWord(STORE_START_ADDRESS + i * 2, 0x0000);		//除了标志位的有效数据全部清0
		}
	}
	
	/*上电时,将闪存数据加载回SRAM数组,实现SRAM数组的掉电不丢失*/
	for (uint16_t i = 0; i < STORE_COUNT; i ++)					//循环STORE_COUNT次,包括第一个标志位
	{
		Store_Data[i] = MyFLASH_ReadHalfWord(STORE_START_ADDRESS + i * 2);		//将闪存的数据加载回SRAM数组
	}
}
  1. 参数存储模块保存数据到闪存
/**
  * 函    数:参数存储模块保存数据到闪存
  * 参    数:无
  * 返 回 值:无
  */
void Store_Save(void)
{
	MyFLASH_ErasePage(STORE_START_ADDRESS);				//擦除指定页
	for (uint16_t i = 0; i < STORE_COUNT; i ++)			//循环STORE_COUNT次,包括第一个标志位
	{
		MyFLASH_ProgramHalfWord(STORE_START_ADDRESS + i * 2, Store_Data[i]);	//将SRAM数组的数据备份保存到闪存
	}
}
  1. 参数存储模块将所有有效数据清0
/**
  * 函    数:参数存储模块将所有有效数据清0
  * 参    数:无
  * 返 回 值:无
  */
void Store_Clear(void)
{
	for (uint16_t i = 1; i < STORE_COUNT; i ++)			//循环STORE_COUNT次,除了第一个标志位
	{
		Store_Data[i] = 0x0000;							//SRAM数组有效数据清0
	}
	Store_Save();										//保存数据到闪存
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值