STMCU小助手
发布时间:2021-3-9 13:04
|
STM32学习笔记 | 片内FLASH读写失败问题分析 FLASH,指Flash Memory,是一种非易失性存储器(闪存),掉电能正常保存数据。 STM32的存储器通常包含内部SRAM、内部FLASH,部分系列还包含EEPROM。其中FLASH通常用于存储代码或数据,可被读写访问。 2 P, d2 j1 S0 D$ c) e$ K STM32 FLASH 基础内容 STM32的FLASH组织结构,可能因不同系列、型号略有不同。比如大家熟悉的STM32F1中小容量一页大小只有1K,而F1大容量一页有2K。 还比如有些系列以扇区为最小单元,有的扇区最小16K,有的128K不等。 本文主要结合F4系列来描述关于FLASH的相关内容。 " R; X6 Y9 F' `" g3 S+ Z 1.Flash 结构 5 j: P3 W; f8 X8 U8 x 通常Flash包含几大块,这里以F40x为例: ※ 主存储器:用来存放用户代码或数据。 ※ 系统存储器:用来存放出厂程序,一般是启动程序代码。 ※ OTP 区域:一小段一次性可编程区域,供用户存放特定的数据。 ※ 选项字节:存放与芯片资源或属性相关的配置信息。 7 y) l2 j- w3 Z* c
2.Flash 常规操作 1 Z1 @& n5 @0 F" J9 B Flash 读、写(编程)、擦除: ※ 128 位宽数据读取 ※ 字节、半字、字和双字数据写入 ※ 扇区擦除与全部擦除 (提示:不同系列可能存在差异,比如还有字节读取,页擦除等) Flash 读、写保护:通过配置选项字节实现。 3.Flash 容量 STM32的Flash容量出厂已经决定,可根据型号得知容量大小。
4.存储器端格式 5 P) u- l5 u4 o. K6 h 目前STM32存储器组织结构默认为小端格式:数据的低字节保存在内存的低地址。 更多内容请查阅芯片对应的参考手册。 FLASH 选项字节 % W5 S8 C. G, q' C& b& B STM32内部Flash具有读写保护功能,想要对Flash进行读写操作,首先要去除读写保护,读写保护通过配置选项字节完成。 配置选项字节,常见两种方式:1.软件编码;2.编程工具; 1.软件编码 比如STM32F4系列标准外设库库提供函数: 9 ?( U2 P2 _9 e8 N, w b
软件编码通过调用这些函数接口就可以配置选项字节。 2.编程工具 比如STM32CubeProg编程工具:
配置STM32选项字节,还可通过ST-LINKUtility、STVP等类似工具进行配置。 提示:不同型号的STM32选项字节可能略有差异。 K+ N( W: d% J2 h1 N+ M9 ~ FLASH 读写擦除操作 STM32内部Flash和其他外部Flash类似,支持读、写、擦除等常规操作。对内部Flash操作之前通常需要解锁、去保护等操作。 比如: + e2 z+ h% ?! Y
1.读数据 `8 Q: }$ V4 q& F( I 读取内部Flash数据通常有两种方式: ※ 通过程序(编码)读取 ※ 通过外部(编程)工具读取 2 m, S* Y5 C9 W& J1 e 程序(编码)读取:
外部编程工具读取: 读取前提:没有读保护,设置好读取地址,长度、数据宽度等。
2.写数据 $ S. j9 o& T- c" h+ \; e2 c 往STM32内部Flash写数据和读数据类似,但写数据地址不能有数据,也就是写之前要擦除数据。 所以,相对读数据,通常写之前需要一些额外操作,比如:
通过工具写数据,就是我们量产时说的下载数据,正式一点说法叫编程。 3.擦除数据 % Z# l9 i. ]0 D+ J( K 擦除数据通常分擦除页、扇区、整块,擦除时间也因型号不同、速度不同有差异。 提示:该部分内容建议参考官方提供的Demo(标准外设库和HAL都有基本例程) FLASH 常见问题 # j! R, D# M' Q" S% @ STM32内部Flash主要用途是存储程序代码和数据。操作内部Flash要慎重,一旦操作不当就有可能会破坏整个程序。 + _/ B" _3 p+ F7 o1 D2 ~% F9 f 问题一:编程(写数据)地址非对齐 写数据时,我们要指定写入的地址,如果写入地址为非对齐,则会出现编程对齐错误。 比如:遵循32位(4字节)地址对齐,你的地址只能是4的倍数。0x08001000正确,0x08001001错误。 提示:不同型号对齐宽度可能不同,有的32位、有的128位等。 解决办法:通过“取余”判断地址。 H. G' A9 c6 ^ |+ O 问题二:编程地址数据未擦除 写数据之前需要擦除对应地址数据才能正常写入,否则会出现失败。 我们擦除数据通常是页,或扇区,写入某个地址数据,就可能影响其他地址的数据,如果直接覆盖就会出现问题。 解决办法:通常的做法是读出整页(或扇区)数据并缓存,再擦除整页,再写入。 ( p- }' c; Y( T9 w. b 问题三:擦除时读取数据 STM32内部Flash在进行写或擦除操作时,总线处于阻塞状态,此时读取Flash数据就会出现失败。【双BANK模式除外】 解决办法:通过标志判断写/擦除操作是否完成。 & s) b2 m1 S5 }3 {) m/ _. R0 _ 问题四:电压不稳定写入失败 处于外界干扰较大的环境,供电就有暂降的可能,而对STM32内部Flash进行操作时,如果低于特定电压就会出现编程失败。 操作Flash的最低电压既与工作频率有关,也与STM32型号有关(具体需要看数据手册)。 解决办法:通过完善硬件电路保证电压稳定。电源电压不够或不稳导致隐患往往不易觉察!! 复盘一下 ▼FLASH 基础内容:结构、常规操作、容量、大小端格式; ▼FLASH 选项字节:通过软件编码和编程工具配置; ▼FLASH 读写擦除操作:常规程序读写操作、工具的读写操作; ▼FLASH 常见问题:编程地址非对齐、数据未擦除、擦除同时读取数据、电压不稳定写入失败。 . G: c, [7 [( B" Q/ e 文章出处: STM32 |
《STM32CubeMX2 实战课程》学习笔记1+由MX2生成MDK5项目并打开
《STM32CubeMX2 实战课程》学习笔记3.+sleep/stop/standby低功耗模式的入口
《STM32CubeMX2 实战课程》学习笔记2+MX2生成的MDK5工程中添加已存在文件(*.c / *.h)
【STM32MP257-DK】01开发板开箱、ST MPU 生态资源使用、环境搭建以及镜像更新
基于STM32在线升级OTA经验分享
【STM32C0测评】Nucleo-C092开发板驱动DS1302实验
Keil下的STM32N6之RAM运行工程配置说明
兔哥的初代M33【002】-H503Nucleo 内部flash操作
兔哥的杂谈【002】——如何性价比更高地去编译STM32
汇编浮点库qfplib移植STM32F769I-DISCO开发板与硬件浮点运算性能测试对比
微信公众号
手机版