学习使用FLASH存储器的STM32教程
一、FLASH简介
二、FLASH外设基本结构
三、FLASH流程
FLASH解锁
程序存储器编程(写入)
程序存储器页擦除
程序存储器全擦除
选项字节
四、FLASH配置
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));
}
void MyFlash_EraseAllPages(void)
{
FLASH_Unlock(); // 解锁
FLASH_EraseAllPages(); // 全擦除
FLASH_Lock(); // 加锁
}
void MyFlash_EraseAPage(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_ProgramWord(uint32_t Address, uint32_t Data)
{
FLASH_Unlock(); // 解锁
FLASH_ProgramHalfWord(Address, Data); // 写入半字
FLASH_Lock(); // 加锁
'对闪存读写的基本逻辑是:上电时将闪存读取到SRAM内存中,下电前再写回闪存,避免频繁的读写闪存'
'因为在读写FLASH闪存时,CPU会停止,会可能导致中断程序无法按时执行'
}
五、FLASH库函数
void FLASH_SetLatency(uint32_t FLASH_Latency);
void FLASH_HalfCycleAccessCmd(uint32_t FLASH_HalfCycleAccess);
void FLASH_PrefetchBufferCmd(uint32_t FLASH_PrefetchBuffer);
void FLASH_Unlock(void);
// FLASH解锁
void FLASH_Lock(void);
// FLASH加锁
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);
// 在指定地址写入全字(32位),其实是写入两次半字
FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data);
// 在指定地址写入半字(16位)
// 以下四个函数为选项字节写入函数
FLASH_Status FLASH_ProgramOptionByteData(uint32_t Address, uint8_t Data);
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);
// 等待忙
五、补充
使用指针访问存储器
uint16_t Data = *((__IO uint16_t *)(0x08000000));
*((__IO uint16_t *)(0x08000000)) = 0x1234;
#define __IO volatile
易变的,直接存取原始内存地址,防止编译器优化。
电子签名
基地址:0x1FFF F7E0
大小:16位
基地址: 0x1FFF F7E8
大小:96位
Reference
STM32入门教程-2023版(江科大)