目录
1.0 闪存模块组织
2.0 Flash基本结构
3.0 Flash解锁
4.0 指针访问存储器地址
5.0 程序存储器编程
6.0 选项字节
7.0 选项字节编程
8.0 选项字节擦除
9.0 电子签名
10.0 手册解读
定义:
STM32F1系列的FLASH包含程序存储器、系统存储器和选项字节三个部分,通过闪存存储器接口(外设)可以对程序存储器和选项字节进行擦除和编程
读写FLASH的用途:利用程序存储器的剩余空间来保存掉电不丢失的用户数据 通过在程序中编程(IAP),实现程序的自我更新
在线编程(In-Circuit Programming – ICP)用于更新程序存储器的全部内容,它通过JTAG、SWD协议或系统加载程序(Bootloader)下载程序
在程序中编程(In-Application Programming – IAP)可以使用微控制器支持的任一种通信接口下载程序
1.0 闪存模块组织
2.0 Flash基本结构
3.0 Flash解锁
4.0 指针访问存储器地址
指针访问存储器地址需要解引用:在C语言中解引用表示的就是取值的意思
5.0 程序存储器编程
注:在单片机中有字节,半字,一字的说法,字节表示的是8个bit位,半节表示的是uint16_t,一个字节表示的是uint32_t个字节。
6.0 选项字节
7.0 选项字节编程
检查FLASH_SR的BSY位,以确认没有其他正在进行的编程操作
解锁FLASH_CR的OPTWRE位
设置FLASH_CR的OPTPG位为1
写入要编程的半字到指定的地址
等待BSY位变为0 读出写入的地址并验证数据
8.0 选项字节擦除
检查FLASH_SR的BSY位,以确认没有其他正在进行的闪存操作
解锁FLASH_CR的OPTWRE位
设置FLASH_CR的OPTER位为1
设置FLASH_CR的STRT位为1
等待BSY位变为0 读出被擦除的选择字节并做验证
9.0 电子签名
10.0 手册解读
......
11.0 库函数解读
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);
void FLASH_Lock(void);
这两个库函数分别对应解锁和加锁
FLASH_Status FLASH_ErasePage(uint32_t Page_Address);
闪存擦除某一页,擦除完成之后对应的Page就完成了
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);
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_Status FLASH_WaitForLastOperation(uint32_t Timeout);
等待的时间,是否超时,表示处于等待忙的状态
12.0 Flash操作
注:flash的基本操作,flash的读取,删除,编程【使用指针访问存储器的格式】