【STM32详解FLASH闪存编程原理与步骤】

STM32详解FLASH闪存编程原理与步骤

FLASH编程注意事项

1.STM32复位后,FPEC模块是被保护的,不能写入FLASH_CR寄存器:通过写入特定的序列到FLASH_KEYR寄存器可以打开FPEC模块(即写入KEY1和KEY2),只有在写保护被解除后,我们才能操作相关寄存器。叫Unlock,简直不正确会产生总线错误。

2.STM32闪存的编程每次必须写入16位(不能单纯的写入8位数据哦!),当FLASH_CR寄存器的PG位为'1'时,在一个闪存地址写入一个半字将启动一次编程;写入任何非半字的数据,FPEC都会产生总线错误。

3.在编程过程中(FLASH_SR的BSY位为'1'),任何读写闪存的操作都会使CPU暂停,知道此次闪存编程结束。

4.STM32的FLASH在编程的时候,也必须要求其写入地址的FLASH是被擦除了的(也就是其值必须是0xFFFF),否则无法写入,在FLASH_SR寄存器的PGERR位将得到一个警告。

FLASH编程过程

1.检查FLASH_CR的LOCK是否解锁,如果没有则先解锁

2.检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的编程操作

3.设置FLASH_CR寄存器的PG位为'1',在指定的地址写入要编程的半字

4.等待BSY位变为'0'

5.读出写入的地址并验证数据

STM32的FLASH擦除过程

STM32FLASH编程的时候,要先判断缩写地址是否被擦除了,所以,我们有介绍STM32的闪存擦除过程很重要。

STM32的闪存擦除分为两种:页擦除和整片擦除。

1.检查FLASH_CR的LOCK是否解锁, 如果没有则先解锁

2.检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的闪存操作

3.设置FLASH_CR寄存器的PER位为'1'

4.用FLASH_AR寄存器选择要擦除的页

5.设置FLASH_CR寄存器的STRT位为'1'

6.等待BSY位变为'0'

7.读出被擦除的页并做验证

FLASH全片擦除

1.检查FLASH_SR寄存器的BSY位,已确定没有其他操作在进行

2.设置FLASH_CR寄存器的MER位1;

3.设置FLASH_CR寄存器的STRT为1

4.等待BSY为0

5.读出所有页并验证

FLASH操作总结

锁定解锁函数

在对FLASH进行写操作前必须先解锁,解锁操作也就是必须在

FLASH_KEYR寄存器写入特定的序列(KEY1和KEY2),固件库函数实现;

void FLASH_Unlock(void);

同样的道理,在对FLASH写操作完成之后,我们要锁定FLASH

void FLASH_Lock(void);

写操作函数

固件库提供了三个FLASH写函数:

复制代码
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擦除函数:

复制代码
FLASH_Status FLASH_ErasePage(uint32_t Page_Address);
FLASH_Status FLASH_EraseAllPages(void);
FLASH_Status FLASH_EraseOptionBytes(void);

第一个是也擦除函数,根据页地址擦除特定的页数据

第二个函数是擦除所有的页数据

第三个函数是擦除用户选择字节数据

获取状态函数

复制代码
FLASH_Status FLASH_GetStatus(void);

返回值是通过枚举类型定义的:

复制代码
	typedef enum
	{
	FLASH_BUSY = 1,             //忙
	FLASH_ERROR_PG,             //编程错误
	FLASH_ERROR_WRP,            //写保护错误
	FLASH_COMPLETE,             //操作完成
	FLASH_TIMEOUT               //操作超时
	}FLASH_Status;

等待操作完成函数

在执行闪存写操作时,任何对闪存的读操作都会锁住总线,在写操作完成后读操作才能正确地惊醒;即在进行写或擦除操作时,不能进行代码或数据的读取操作。所以在每次操作之前,我们都要等待上一次操作完成这次操作才能开始。

复制代码
FLASH_Status FLASH_WaitForLastOperation(uint32_t Timeout);

入口参数为等待时间,返回值是FLAHS的状态,这个很容易理解,这个函数本身我们在固件库中使用得不多,但是在固件库函数体中间可以多次看到。

读FLASH特定地址数据函数

读取FLASH指定地址的半字的函数固件库并没有给出来,这里我们需要自己写一个函数

复制代码
u16  STMFLASH_ReadHalfWord(u32 faddr)
{
	return *(vu16*)faddr;
}
相关推荐
松涛和鸣12 小时前
11.C 语言学习:递归、宏定义、预处理、汉诺塔、Fibonacci 等
linux·c语言·开发语言·学习·算法·排序算法
芯岭技术13 小时前
不到一块钱的带USB 2.4G收发 SOC芯片,集成2.4G射频 32位MCU
单片机·嵌入式硬件
ai_xiaogui13 小时前
Mac苹果版Krita AI一键安装教程:AIStarter+ComfyUI零基础部署全流程(X86/ARM双架构)
arm开发·人工智能·macos·comfyui·一键部署·ai绘画教程·kritaai
普中科技14 小时前
【普中DSP28335开发攻略】-- 第 15 章 外部中断实验
单片机·嵌入式硬件·开发板·外部中断·dsp28335·普中科技
IT阳晨。15 小时前
【STM32】ADC
stm32·单片机·嵌入式硬件
纳祥科技16 小时前
方案分享:一款基于高性能单片机的落日灯方案
单片机·嵌入式硬件
鑫—萍17 小时前
C/C++精品算法——双指针(1)
c语言·c++·算法
三佛科技-1341638421217 小时前
智能保温杯方案,保温杯MCU控制方案设计
单片机·嵌入式硬件·智能家居·pcb工艺
Wave84519 小时前
STM32_标准库转hal库
stm32·单片机·嵌入式硬件
智者知已应修善业20 小时前
【51单片机:两边向中间流水:即两边先点亮然后熄灭,次边的点亮再熄灭,直到最中间的两个点亮再熄灭,然后重复动作。】2023-3-4
c语言·c++·经验分享·笔记·嵌入式硬件·算法·51单片机