STM32 FlashMemory 学习笔记
前言
本片博文主要总结 STM32 FlashMemory的相关操作方法,以及学习过程中的一些体会、遇到的问题,望可以帮助有需要的人。
笔记内容多为自己总结、心得,如有错漏不恰当之处望不吝指正。
一、STM32 MemoryMap
Coetex-M 处理器可以对32位存储器进行寻址,因此存储器空间能够达到4GB。
上图为 Cortex-M处理器 寻址范围4GB的内存分布,其中:
FLASH:0x00000000 ~ 0x1FFFFFFF;
SRAM :0x20000000 ~ 0x3FFFFFFF;
不同芯片 内存大小不一,起始地址不一,但均在此范围内,具体可以查看对应芯片手册。
本人使用的是STM32F103ZE系列,FLASH 512K,SRAM 64K,下图为FALSH内存分配图,其中512K分为256页,每页大小2K;
二、FALSH 操作
1.FLASH 读取
FLASH 支持直接地址寻址,即直接采用的地址寻址,即可读取内存数据。
2.FALSH 擦除与编程
1) KeyValue
● RDPRT key = 0x00A5
● KEY1 = 0x45670123
● KEY2 = 0xCDEF89A
2)FLASH Unlock
FPEC Block(Flash program and erase controller) 控制内存区 上电默认为上锁状态,不解锁,无法进行相
关控制寄存器得操作;
【解锁流程】
FLASH_KEYR = KEY1;
FLASH_KEYR = KEY2;
Note:错误的解锁序列会锁死FPEC block and FLASH_CR寄存器,仅复位可以解除。
3)FALSH Program
● 一次16bit编程;
● PG位置1 && 编程地址写入 Half-Word(16bits),启动编程;
● 非 Half-Word 写入,导致Bus Error;
● 编程期间,CPU处于阻塞状态知道编程完成;
【编程序列】
- Unlock;
- 内存擦除;
- Check 是否存在内存访问;
- PG = 1;
- (__IO uint16_t)Address = (uint16_t)Data;
- Check (FLASH_SR_BSY = 1);
- 校验编程数据;
4)FLASH Erase
页擦除/整个擦除;
【擦除序列-页】
- Unlock;
- Check 是否存在内存访问;
- PER = 1;
- FLASH_AR 选择擦除页;
- STAT = 1;
- Check (FLASH_SR_BSY = 1);
- 读取擦除页并且校验;
【擦除序列-整个扇区】
- Unlock;
- Check 是否存在内存访问;
- FLASH_CR_MER = 1;
- FLASH_AR 选择擦除页;
- FLASH_CR_STRT= 1;
- Check (FLASH_SR_BSY = 1);
- 读取擦除页并且校验;
三、FLASH 读/写保护
1.Option Byte
● 配置区域,大小16bytes(8个配置字节+8个配置字节取反),用于内存保护相关配置存储;
● 4byte 写保护配置字节 + 1 读保护配置字节 + 1配置配置字节 + 2 userData;
● 单字节格式如下图所示:
[0:7]:配置字节 byte0;
[8-15]:配置字节byte0 取反;
[16:23]:配置字节 byte1;
[24-31]:配置字节byte1 取反;
【编程序列】
- Check 是否存在内存访问
- FPEC Unlock;
- FLASH_OPTKEYR Unlock;
- OPTPG = 1;
- Half-Word 写入配置字节 ;
- Check (FLASH_SR_BSY = 1);
- 读取数据并且校验;
【擦除序列】
- Check 是否存在内存访问;
- FPEC Unlock;
- FLASH_OPTWRE Unlock;
- OPTER = 1;
- STAR = 1 ;
- Check (FLASH_SR_BSY = 1);
- 读取数据并且校验;
2.读取保护
● 默认关闭读取保护;
● 1个配置字节 RDP;
● 写入 0x00A5时,解除读取保护,其他值,开启读取保护;
● 当读取保护 激活 到 关闭时,芯片强制进行一次整个FLASH擦除;
● 主要用于防止代码数据盗窃;
3.写入保护
● 默认关闭写入保护;
● 4个配置字节WRP0-3;
● 0:开启写保护/1:关闭写保护;
● WRP[0:30]:每一位对应2个Page控制;
● WRP[31]:控制Page 62-255;
关于FLASH 的操作,PM0075官方文档描述很详细,需要的朋友可以百度下载,也可以评论分享。