本节所指STM32内部闪存,即下载程序的时候,程序存储的地方。(非易失性)
STM32F1系列的FLASH包含程序存储器、系统存储器(bootloader,不允许修改)和选项字节三个部分,通过闪存存储器接口(外设)可以对程序存储器和选项字节进行擦除和编程
类型 | 起始地址 | 存储器 | 用途 |
ROM | 0x0800 0000 | 程序存储器Flash | 存储C语言编译后的程序代码 |
0x1FFF F000 | 系统存储器 | 存储BootLoader,用于串口下载 | |
0x1FFF F800 | 选项字节 | 存储一些独立于程序代码的配置参数 | |
RAM | 0x2000 0000 | 运行内存SRAM | 存储运行过程中的临时变量 |
0x4000 0000 | 外设寄存器 | 存储各个外设的配置参数 | |
0xE000 0000 | 内核外设寄存器 | 存储内核各个外设的配置参数 |
读写FLASH的用途:
????????????????利用程序存储器的剩余空间来保存掉电不丢失的用户数据
????????????????通过在程序中编程(IAP),实现程序的自我更新
在线编程(In-Circuit Programming – ICP)用于更新程序存储器的全部内容,它通过JTAG、SWD协议或系统加载程序(Bootloader)下载程序
在程序中编程(In-Application Programming – IAP)可以使用微控制器支持的任一种通信接口下载程序
主存储器:程序存储器;
信息块-》启动程序代码:Bootloader,用于串口下载;
信息块-》用户选择字节:选项字节,存储一些独立参数;
闪存存储器接口寄存器:普通外设。闪存管理员,擦除和编程通过读写这些寄存器来完成。
擦除和写保护都是以页为单位的、写入操作前,必须先进行写使能、每个数据位只能由1改写为0,不能由0改写为1、写入数据前必须先擦除,擦除后,所有数据位变为1、擦除必须按最小擦除单元进行、连续写入多字节时,最多写入一页的数据,超过页尾位置的数据,会回到页首覆盖写入、写入操作(包括擦除)结束后,芯片进入忙状态,不响应新的读写操作、直接调用读取时序,无需使能,无需额外操作,没有页的限制,读取操作结束后不会进入忙状态,但不能在忙状态时读取(同W25Q64)。
页的起始范围:0x0800 0000 ~ 0x0800 03FF。起始以0800/0400/0C00/1000结尾;
位置
FPEC共有三个键值:
????????????????RDPRT键 = 0x000000A5,解除读保护
????????????????KEY1 = 0x45670123
????????????????KEY2 = 0xCDEF89AB
使用键,更能防止误操作
解锁:
????????????????复位后,FPEC被保护,不能写入FLASH_CR,即复位后FLASH是锁着的。
????????????????在FLASH_KEYR先写入KEY1,再写入KEY2,解锁
????????????????错误的操作序列会在下次复位前锁死FPEC和FLASH_CR
加锁:
????????????????设置FLASH_CR中的LOCK位锁住FPEC和FLASH_CR
使用指针读指定地址下的存储器:
uint16_t Data = *((__IO uint16_t *)(0x08000000));
使用指针写指定地址下的存储器:
*((__IO uint16_t *)(0x08000000)) = 0x1234;
其中:
#define??? __IO??? volatile