STM32 Flash

一、Flash

1.1 Flash简介

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

读取闪存存储器,可以在通用地址空间直接寻址,直接使用指针即可

读写FLASH的用途:

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

(2)通过在程序中编程(IAP),实现程序的自我更新

闪存存储器可以用ICP或IAP方式编程:
在线编程(In-Circuit Programming -- ICP ) 方式用于更新闪存存储器的 全部内容 ,它通过 JTAG、 SWD协议 或 系统加载程序(Bootloader) 下载用户应用程序到微控制器中。

在程序中编程(In-Application Programming -- IAP ) 可以使用微控制器支持的 任一种通信接口 ( 如 I/O端口、USB、CAN、UART、I2C、SPI 等 ) 下载程序或数据到存储器中。 IAP允许用户 在程序运行时重新烧写 闪存存储器中的内容。然而,IAP 要求至少有一部分程序已经使用ICP(在线编程)烧到闪存存储器中

1.2 闪存模块组织

STM32F103C8T6有64KFlash存储空间,存储器组织成64个1K字节/页,页的起始地址 以000、4000、800、C00结尾

1.3 Flash基本结构

STM32F1系列的FLASH包含程序存储器、系统存储器和选项字节三个部分

程序存储器(0x0800 0000 ~ 0x0800 FFFF,64KB):存储编译后的代码

系统存储器(0x1FFF F000 ~ 0x1FFF F7FF,2KB):用于存放在系统存储器自举模式下的启动程序,这个区域只保留给ST使用, 启动程序使用USART1串行接口实现对闪存存储器的编程;ST在生产线上对这个区域编程 并锁定以防止用户擦写。

选项字节(0x1FFF F800 ~ 0x1FFF F80F,16B):存储一些独立于程序代码的配置参数

1.4 Flash解锁

1.5 使用指针访问存储器

1.6 Flash的擦除与编程

对主存储器和信息块的写入由内嵌的闪存编程/ 擦除控制器(FPEC) 管理

每执行一次编程过程可写入一个半字(16位字节),如果要写入很多数据,那就需要循环调用编程流程即可

写入Flash的具体流程:

(1)解锁Flash:在写入Flash之前,首先需要对Flash进行解锁。STM32的Flash有写保护功能,为了防止意外操作导致的数据损坏,需要手动解除保护。解锁操作需要向特定的解锁寄存器(如KEYR)写入特定的密钥序列。

(2)等待BSY:解锁完成后,需要确保Flash处于就绪状态。可以通过检查FLASH_SR寄存器的相关位(如BSY位)来判断Flash是否处于忙碌状态。务必等待Flash就绪后再进行后续操作。

(3)擦除目标扇区:在写入数据之前,需要先擦除目标扇区。STM32的Flash是按扇区进行擦写的,擦除一个扇区会把该扇区的所有数据设置为全1(0xFF)。擦除操作需要设置FLASH_CR寄存器的相关位,并指定需要擦除的扇区。

(4)等待擦除完成:擦除操作需要一定的时间,因此需要等待擦除完成。可以通过检查FLASH_SR寄存器的相关位(如EOP位)来判断擦除是否完成。务必等待擦除完成后再进行后续操作。

(5)写入数据:擦除完成后,就可以开始向目标地址写入数据了。通常,可以选择按字(32位)或半字(16位)进行写入。写入操作需要设置FLASH_CR寄存器的相关位,并将数据写入到目标地址。

(6)等待写入完成:与擦除操作类似,写入操作也需要一定的时间。因此需要等待写入完成。可以通过检查FLASH_SR寄存器的相关位(如EOP位)来判断写入是否完成。

(7)锁定Flash:写入操作完成后,为了防止意外操作导致的数据损坏,建议重新锁定Flash。锁定操作需要设置FLASH_CR寄存器的相关位(如LOCK位)。

1.7 选项字节

当写入一个存储器的值,要同时在带有n的寄存器中写入数据的反码,这样写入的数据才有效

写入反码的过程,硬件会自动计算,并写入

1.7.1 选项字节擦除

1.7.2 选项字节编程

1.8 器件的电子签名

相关推荐
创界工坊工作室1 小时前
DPJ-120 基于STC89C52的多功能清扫消杀车控制系统设计(源代码+proteus仿真)
stm32·单片机·嵌入式硬件·51单片机·proteus
1024肥宅1 小时前
手写 EventEmitter:深入理解发布订阅模式
前端·javascript·eventbus
Darken032 小时前
引脚重映射是什么意思?如何使用?
stm32·单片机·引脚重映射
知南x2 小时前
【正点原子STM32MP157 可信任固件TF-A学习篇】(2) STM32MP1 中的 TF-A
stm32·嵌入式硬件·学习·stm32mp157
3秒一个大3 小时前
HTML5 与 JavaScript 中的二进制数据处理:ArrayBuffer 与 TextEncoder/Decoder 实践
javascript
purpleseashell_Lili3 小时前
如何学习 AG-UI 和 CopilotKit
javascript·typescript·react
欢鸽儿3 小时前
Vitis】Linux 下彻底清除启动界面 Recent Workspaces 历史路径
linux·嵌入式硬件·fpga
LaoZhangGong1234 小时前
深度学习uip中“uip_arp.c“
c语言·stm32·以太网·arp·uip·enc28j60
LSL666_4 小时前
4 jQuery、JavaScript 作用域、闭包与 DOM 事件绑定
前端·javascript·html
小飞侠在吗5 小时前
vue computed 和 watch
前端·javascript·vue.js