STM32-Flash闪存

简介

STM32F1系列的FLASH包含程序存储器、系统存储器和选项字节三个部分,通过闪存存储器接口(外设)可以对程序存储器和选项字节进行擦除和编程

读写Flash的用途

1.利用程序存储器的剩余空间来保存掉电不丢失的用户数据。

2.通过在程序中变成(IPA),实现程序的自我更新。

在线编程(ICP)用于更新程序存储器的全部内容,通过JTAG、SWD协议或系统加载程序(Bootloader)下载程序,例如ST-LINK使用SWD协议进行下载程序,每次下载都是将整个程序都覆盖掉。

在程序中编程(IAP)可以使用微控制器支持的任意一种通信接口下载程序。自己写一个Bootloader,放在程序更新时不会覆盖的地方,需要更新程序时,控制程序跳转到自己写的Bootloader中,再进行接收任意一种通信接口传过来的数据,就是待更新的程序,再控制Flash读写把收到的程序写到程序正常运行的地方,写完后控制程序跳转回去或者直接复位。

  • 闪存只能1写0不能0写1
  • 写入前必须擦除
  • 必须以最小单位进行擦除
  • 擦除后数据全为1
  • 擦除后需要等待忙

存储器映像

闪存模块组织

每页大小为1k

Flash基本结构

Flash解锁

FPEC共有三个键值

RDPRT键=0x000000A5

KEY1=0x45670123

KEY2=0xCDEF89AB

解锁:

复位后,FPEC被保护,不能写入FLASH_CR

在FLASH_KEYR先写入KEY1,再写入KEY2,解锁

错误的操作序列会在下次复位前锁死FPEC和FLASH_CR

加锁:

设置FLASH_CR中的LOCK位锁住FPEC和FLASH_CR

使用指针访问存储器

先指定地址,地址可进行加减。然后进行强制类型转换,再解引用。

__IO 对应C语言关键字 volatile,防止编译器优化。或者防止缓存数据不同步问题。

读取不需要解锁。

写数据需要提前解锁。

程序存储器页编程流程图

写入

注: 对主闪存编程每次可以写入16位。当FLASH_CR寄存器的PG位为'1'时,在一个闪存地址写入

一个半字将启动一次编程;写入任何非半字的数据, FPEC都会产生总线错误。在编程过程中

(BSY位为'1'),任何读写闪存的操作都会使CPU暂停,直到此次闪存编程结束。

STM32的闪存在写入之前会检查指定地址有没有擦除,如果没有擦除就写入STM32不执行写入操作,除非写入的数据全是0。

页擦除
闪存全擦除

解锁过程:在KEYR寄存器,先写入KEY1,在写入KEY2。

选项字节

RDP:写入RDPRT键(0x000000A5)后解除读保护。

USER:选择看门狗事件和进入停机/待机模式是否产生复位。

Data0/1:用户可自定义。

WRP0/1/2/3: 配置写保护,每一个位对应保护4个存储页(中容量)。

n字母开头为对应数据的反码。

选项字节擦除
  • 检查FLASH_SR的BSY位,以确认没有其他正在进行的编程操作
  • 解锁FLASH_CR的OPTWRE位
  • 设置FLASH_CR的OPTPG位为1
  • 写入要编程的半字到指定的地址
  • 等待BSY位变为0
  • 读出写入的地址并验证数据
选项字节编程
  • 检查FLASH_SR的BSY位,以确认没有其他正在进行的编程操作
  • 解锁FLASH_CR的OPTWRE位
  • 设置FLASH_CR的OPTPG位为1
  • 写入要编程的半字到指定的地址
  • 等待BSY位变为0
  • 读出写入的地址并验证数据

器件电子签名

flash代码

复制代码
//FLASH读取一个32位的字
uint32_t MyFLASH_ReadWord(uint32_t Address)
{
	return *((__IO uint32_t *)(Address));	//使用指针访问指定地址下的数据并返回
}

//函    数:FLASH读取一个16位的半字
uint16_t MyFLASH_ReadHalfWord(uint32_t Address)
{
	return *((__IO uint16_t *)(Address));	//使用指针访问指定地址下的数据并返回
}

// 函    数:FLASH读取一个8位的字节
uint8_t MyFLASH_ReadByte(uint32_t Address)
{
	return *((__IO uint8_t *)(Address));	//使用指针访问指定地址下的数据并返回
}

//FLASH全擦除
void MyFLASH_EraseAllPages(void)
{
	FLASH_Unlock();					//解锁
	FLASH_EraseAllPages();			//全擦除
	FLASH_Lock();					//加锁
}

//FLASH页擦除
void MyFLASH_ErasePage(uint32_t PageAddress)
{
	FLASH_Unlock();					//解锁
	FLASH_ErasePage(PageAddress);	//页擦除
	FLASH_Lock();					//加锁
}

//FLASH编程字
void MyFLASH_ProgramWord(uint32_t Address, uint32_t Data)
{
	FLASH_Unlock();							//解锁
	FLASH_ProgramWord(Address, Data);		//编程字
	FLASH_Lock();							//加锁
}

//FLASH编程半字
void MyFLASH_ProgramHalfWord(uint32_t Address, uint16_t Data)
{
	FLASH_Unlock();							//解锁
	FLASH_ProgramHalfWord(Address, Data);	//编程半字
	FLASH_Lock();							//加锁
}
相关推荐
炸膛坦客4 小时前
单片机/C/C++八股:(二十六)IIC 专题(I²C)---- 上集
c语言·c++·单片机
华清远见IT开放实验室8 小时前
实验室建设案例 | 石家庄科技信息职业学院嵌入式实验室——从底层硬件到系统应用,一所应用型高校的嵌入式人才培养这样落地
linux·arm开发·stm32·嵌入式硬件·高校·实验室建设
AI的探索之旅10 小时前
AI辅助原理图评审:电源去耦、BOOT引脚、VCAP——19项逐一核查,遗漏?不存在的
人工智能·vscode·嵌入式硬件
茯苓gao11 小时前
嵌入式开发笔记:EtherCAT协议从硬件到软件完整配置指南——从零搭建一套EtherCAT通信系统
笔记·嵌入式硬件·学习
GeekArch11 小时前
第24讲:Vibe模式代码风格控制——适配Keil/STM32工程规范
人工智能·stm32·单片机·嵌入式硬件·mcu·决策树·ai编程
Freedom_my12 小时前
STM32项目3
stm32·单片机·嵌入式硬件
国科安芯13 小时前
星间光链路:AS32S601型抗辐射MCU在空间激光通信终端控制中的技术实现
服务器·网络·单片机·嵌入式硬件·物联网·安全·信息与通信
小李不困还能学14 小时前
基于 51 单片机的8 路抢答器设计教程
单片机·嵌入式硬件·mongodb·抢答器
CedarQR14 小时前
万字长文:从零在 RK3588 上部署 PaddleSpeech 中文 TTS 全流程(FastSpeech2 + HiFiGAN)
开发语言·c++·嵌入式硬件·ubuntu·json
萌动的小火苗14 小时前
嵌入式开发中的栈与队列:任务调度为什么依赖数据结构
数据结构·c++·单片机·嵌入式硬件