你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

《STM32学习笔记》From Zero To Hero | 片内FLASH读写失败问题分析

[复制链接]
STMCU-管管 发布时间:2020-3-26 14:20
FLASH,指Flash Memory,是一种非易失性存储器(闪存),掉电能正常保存数据。
3 j; B0 R" L+ {6 @' A, _4 V& r( q
今天是第5篇分享,《STM32学习笔记》之片内FLASH读写失败问题分析。

% B4 R/ y" U& N/ M
STM32的存储器通常包含内部SRAM、内部FLASH,部分系列还包含EEPROM。其中FLASH通常用于存储代码或数据,可被读写访问。

- ~+ }  Y+ _# }% H- H% D; m
STM32 FLASH 基础内容
, M1 J$ i- B1 C# Y
STM32的FLASH组织结构,可能因不同系列、型号略有不同。比如大家熟悉的STM32F1中小容量一页大小只有1K,而F1大容量一页有2K。
还比如有些系列以扇区为最小单元,有的扇区最小16K,有的128K不等。
本文主要结合F4系列来描述关于FLASH的相关内容。

' U4 h8 U% O( a9 l: y- j
1.Flash 结构
3 y) H; T, S6 H- @
通常Flash包含几大块,这里以F40x为例:
· 主存储器:用来存放用户代码或数据。
· 系统存储器:用来存放出厂程序,一般是启动程序代码。
· OTP 区域:一小段一次性可编程区域,供用户存放特定的数据。
· 选项字节:存放与芯片资源或属性相关的配置信息。

# g' {  s% Y0 r3 m9 ?0 {: J' w
11.jpg
3 f. h3 n; z: D
2.Flash 常规操作

1 k& k( K' @! h, ?. V! s6 ~
Flash 读、写(编程)、擦除:
· 128 位宽数据读取
· 字节、半字、字和双字数据写入
· 扇区擦除与全部擦除
(提示:不同系列可能存在差异,比如还有字节读取,页擦除等)
Flash 读、写保护:通过配置选项字节实现。

0 @& J; W5 Z2 e1 |  J4 J
3.Flash 容量
8 K1 [! ^  w1 m7 C; K3 u: F1 C
STM32的Flash容量出厂已经决定,可根据型号得知容量大小。
  _- Q; D" _$ {- I8 p% A1 p
22.jpg

) Q  T: Q! ?  e' J
4.存储器端格式

3 i- |* f* [' Y5 Y& \! {
目前STM32存储器组织结构默认为小端格式:数据的低字节保存在内存的低地址。
更多内容请查阅芯片对应的参考手册。
FLASH 选项字节

* e, w) B9 q. W: Q; ?/ [
STM32内部Flash具有读写保护功能,想要对Flash进行读写操作,首先要去除读写保护,读写保护通过配置选项字节完成。
配置选项字节,常见两种方式:1.软件编码;2.编程工具;

" o0 Y  e4 X, u! }# {* l
1.软件编码

- z0 k! T' c7 _2 C
比如STM32F4系列标准外设库库提供函数:

9 E+ G" ]7 C6 h3 X% r% _
33.jpg

4 P+ K. _* h0 t8 F6 @
软件编码通过调用这些函数接口就可以配置选项字节。

- N5 [* T3 A( _% F; e: o0 I
2.编程工具

+ z, I: N$ a. P" m
比如STM32CubeProg编程工具:
/ m9 I# h7 @  n3 N, s( B
44.png
$ g  y  x$ g# X1 U& d
配置STM32选项字节,还可通过ST-LINKUtility、STVP等类似工具进行配置。

! l& U! N. q. P% T
提示:不同型号的STM32选项字节可能略有差异。

& \/ d- u% C) C0 `  a
FLASH 读写擦除操作

  Q  |7 ^3 k- H$ L
STM32内部Flash和其他外部Flash类似,支持读、写、擦除等常规操作。对内部Flash操作之前通常需要解锁、去保护等操作。
比如:

+ a9 c5 x. m9 o& U0 z
55.jpg

: ~. `/ S3 R2 {8 D" ^1 u4 O
1.读数据

# ^. Q0 ~  R. u/ {. Z2 t
读取内部Flash数据通常有两种方式:
· 通过程序(编码)读取
· 通过外部(编程)工具读取
' I- {2 |  L) M7 ~
程序(编码)读取:
. A& l. T* r7 X/ ^( |- R$ B$ {7 y
66.jpg
8 [" [+ V2 Q. Q
外部编程工具读取:
: ?: G  y4 F% O( g% Y+ t
读取前提:没有读保护,设置好读取地址,长度、数据宽度等。
+ v, N# P3 l* X8 l7 r1 X
77.png

! R, H( }1 F9 v4 g  Q
2.写数据
. V7 }- p! Y) N, b2 a
往STM32内部Flash写数据和读数据类似,但写数据地址不能有数据,也就是写之前要擦除数据。
所以,相对读数据,通常写之前需要一些额外操作,比如:
+ s! n+ B, y5 y
88.jpg

8 J" a# d' t. R3 y) w  ^) Q" s
通过工具写数据,就是我们量产时说的下载数据,正式一点说法叫编程。

( v- v+ b6 l3 m
3.擦除数据

9 n, X/ V2 u, G0 K# Z8 x+ q
擦除数据通常分擦除页、扇区、整块,擦除时间也因型号不同、速度不同有差异。
提示:该部分内容建议参考官方提供的Demo(标准外设库和HAL都有基本例程)
5 A: D; `" R$ q$ z) V$ q- d- z- S* \
FLASH 常见问题
8 q0 J) }' @# `6 j  `1 R  u
STM32内部Flash主要用途是存储程序代码和数据。操作内部Flash要慎重,一旦操作不当就有可能会破坏整个程序。

' F9 s- _! H; e5 D: [3 P6 \
问题一:编程(写数据)地址非对齐

5 G" j7 X4 l, R6 s* N
写数据时,我们要指定写入的地址,如果写入地址为非对齐,则会出现编程对齐错误。
比如:
遵循32位(4字节)地址对齐,你的地址只能是4的倍数。0x08001000正确,0x08001001错误。
提示:不同型号对齐宽度可能不同,有的32位、有的128位等。
解决办法:通过“取余”判断地址。

4 f: r6 ]4 Q# o/ }) _1 \
问题二:编程地址数据未擦除

$ S+ r4 G: z- V0 p: ^( f2 X! S8 s7 i
写数据之前需要擦除对应地址数据才能正常写入,否则会出现失败。
我们擦除数据通常是页,或扇区,写入某个地址数据,就可能影响其他地址的数据,如果直接覆盖就会出现问题。
解决办法:通常的做法是读出整页(或扇区)数据并缓存,再擦除整页,再写入。
1 e! N# J& v. R. }
问题三:擦除时读取数据

4 k+ u3 x3 ]: I6 l
STM32内部Flash在进行写或擦除操作时,总线处于阻塞状态,此时读取Flash数据就会出现失败。【双BANK模式除外】
解决办法:通过标志判断写/擦除操作是否完成。

) l+ K  e0 `2 ]  r4 v  U8 ^
问题四:电压不稳定写入失败
, \, X8 p# p5 J* t
处于外界干扰较大的环境,供电就有暂降的可能,而对STM32内部Flash进行操作时,如果低于特定电压就会出现编程失败。
操作Flash的最低电压既与工作频率有关,也与STM32型号有关(具体需要看数据手册)。
解决办法:通过完善硬件电路保证电压稳定。电源电压不够或不稳导致隐患往往不易觉察!!

. g* \) M0 n: m6 v6 s# y: [1 ^& F* ]! @
赞 收藏 评论0 发布时间:2020-3-26 14:20

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版