/**
* @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);
•使用指针读指定地址下的存储器:
uint16_t Data = *((__IO uint16_t )(0x08000000));
//指定0x08000000并把它设定为volatile 然后强转为uint16_t指针类型,并取出指针指向的数据赋值给Data
•使用指针写指定地址下的存储器:
((__IO uint16_t *)(0x08000000)) = 0x1234;
•其中:
#define __IO volatile
LOCK位:为0芯片锁了,为1芯片没锁
FLASH_CR: 控制寄存器
STRT:为1为触发条件,芯片开始干活
MER=1:执行全擦除
BSY=1:芯片忙
AR寄存器:存储擦除页起始地址
字:32位
半字:16位
字节:8位
写入寄存器时需要再带n的名称相同的寄存器写入反码,这样操作才是有效的
1.事前等待
2.OPTWRE:解除小锁
电子签名即STM32ID号
- FLASH读取一个8位的字节
**
* 函 数:FLASH读取一个8位的字节
* 参 数:Address 要读取数据的字节地址
* 返 回 值:指定地址下的数据
*/
uint8_t MyFLASH_ReadByte(uint32_t Address)
{
return *((__IO uint8_t *)(Address)); //使用指针访问指定地址下的数据并返回
}
- FLASH读取一个16位的半字
/**
* 函 数:FLASH读取一个16位的半字
* 参 数:Address 要读取数据的半字地址
* 返 回 值:指定地址下的数据
*/
uint16_t MyFLASH_ReadHalfWord(uint32_t Address)
{
return *((__IO uint16_t *)(Address)); //使用指针访问指定地址下的数据并返回
}
- FLASH读取一个32位的字
/**
* 函 数:FLASH读取一个32位的字
* 参 数:Address 要读取数据的字地址
* 返 回 值:指定地址下的数据
*/
uint32_t MyFLASH_ReadWord(uint32_t Address)
{
return *((__IO uint32_t *)(Address)); //使用指针访问指定地址下的数据并返回
}
- FLASH编程半字
/**
* 函 数:FLASH编程半字
* 参 数:Address 要写入数据的半字地址
* 参 数:Data 要写入的16位数据
* 返 回 值:无
*/
void MyFLASH_ProgramHalfWord(uint32_t Address, uint16_t Data)
{
FLASH_Unlock(); //解锁
FLASH_ProgramHalfWord(Address, Data); //编程半字
FLASH_Lock(); //加锁
}
- FLASH编程字
/**
* 函 数:FLASH编程字
* 参 数:Address 要写入数据的字地址
* 参 数:Data 要写入的32位数据
* 返 回 值:无
*/
void MyFLASH_ProgramWord(uint32_t Address, uint32_t Data)
{
FLASH_Unlock(); //解锁
FLASH_ProgramWord(Address, Data); //编程字
FLASH_Lock(); //加锁
}
- FLASH页擦除
/**
* 函 数:FLASH页擦除
* 参 数:PageAddress 要擦除页的页地址
* 返 回 值:无
*/
void MyFLASH_ErasePage(uint32_t PageAddress)
{
FLASH_Unlock(); //解锁
FLASH_ErasePage(PageAddress); //页擦除
FLASH_Lock(); //加锁
}
- FLASH全擦除
/**
* 函 数:FLASH全擦除
* 参 数:无
* 返 回 值:无
* 说 明:调用此函数后,FLASH的所有页都会被擦除,包括程序文件本身,擦除后,程序将不复存在
*/
void MyFLASH_EraseAllPages(void)
{
FLASH_Unlock(); //解锁
FLASH_EraseAllPages(); //全擦除
FLASH_Lock(); //加锁
}
- 参数存储模块初始化
/**
* 函 数:参数存储模块初始化
* 参 数:无
* 返 回 值:无
*/
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数组
}
}
- 参数存储模块保存数据到闪存
/**
* 函 数:参数存储模块保存数据到闪存
* 参 数:无
* 返 回 值:无
*/
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数组的数据备份保存到闪存
}
}
- 参数存储模块将所有有效数据清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(); //保存数据到闪存
}