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

STM32G071评测:Flash

[复制链接]
STM1024 发布时间:2019-1-16 20:42
本帖最后由 stm1024 于 2019-1-18 11:15 编辑 $ R* T7 }9 k! G( e( C& x) j

# f/ x' b7 F8 OFlash现已成为MCU的标配,Flash的特性在决定了MCU的一些功能,如代码大小、执行效率、FDU等。了解一款MCU的Flash显得很重要,这里测试一下G071的Flash。5 F5 Z1 k& K3 F+ U9 B4 ~
先看看和F0存在的不同。flash的大小就没必要深究了,主要的区别如下:& N- j7 a$ b1 d
2019-01-16_132545.png 6 E4 s/ J) R. S: n/ b# }
1.指令缓存。Flash控制器含有一个8字节的预取指缓冲器和一个16字节的指令缓存。5 T' a# k! J8 }
2.OTP区域。所谓的OTP,也就是one time programming,这个区域可以按双字方式写入数据,而且只能写一次,如果写入的数据有一个bit不为0,则以后这个区域就不可更改了,可用于存取非擦写的用户数据。, ?1 d- h: Q8 p" C4 g" t9 A
3.快速编程。官方给出的数据是22ms的擦除时间和写入每双字时间为82us。$ z% q/ P5 D: D) f: d: G
4.PCROP。这个是proprietary code readout protection的缩写,用于保护代码,其代码只能用来执行,而不能被读取或写入。至于Securable Memory,则是安全储存器,该区域不能被非安全区域外访问,
" u) X! X! |4 d5.ECC。ECC是Error Correction and Checking,即错误检查和纠正。能检查2 bits的错误,并能纠正1 bit翻转错误。, {2 W3 H3 Q; C
! ]/ D- \0 u& A
再看看Flash的组织。见下图:
. ~' |7 ]* {# d9 ?, j 2.png
- F/ v7 S+ {( \) HFlash主要分为两块,分别是主块和信息块。主块就是常规使用的Flash,通常也是我们程序的入口地址,这一块可以随便使用。
# @; B# I; M$ w( P8 _而信息块则包含了系统储存器,OTP区域和选项字节,Flash的操作方式按下图:
# t* ~) w& `* y' R 3.png
5 V) c0 u/ g9 q1 z* s8 F% e编程需要一次写入8字节,也就是粒度为64bits(实际上是72bits,还有8bits的ECC)快速编程为256字节(仅支持Main Memory),快速编程因为不检查所写入的地址,因此比标准编程快了约37%。擦除可按2KB的页或者整个擦除(128KB),但花费的时间相当。
. C; h( Z; N' C# q( |  i, Z7 f
0 b( P. N+ t; k  J在选项字节的配置上,和F0系列没有差别(或者我还没有发现)。% ?+ S8 M8 y: a! y, r1 {

/ Y7 P" m7 H' J" y! |3 h以下Flash编程测试代码:
/ u6 b7 R+ S/ a0 T7 z9 g8 _
  1. int main(void)6 |6 y. c  y0 ~' O
  2. {: o9 [+ X0 S' X
  3.     uint16_t i;
    5 D  {/ D; w3 Z0 f( Q% b
  4.     HAL_Init();) B4 q5 O5 ]/ I& b" @+ F$ s
  5.     SystemClock_Config();7 O2 u/ ]8 X- U3 q; b
  6.     MX_GPIO_Init();
    6 F1 @3 d( I4 Q3 D. S9 e, |
  7.     HAL_FLASH_Unlock();    + |% |* l  O- ~3 K5 |, u$ Q
  8.     EraseInitStruct.TypeErase   = FLASH_TYPEERASE_PAGES;9 H4 \5 W# N2 j
  9.     EraseInitStruct.Page        = GetPage(FLASH_USER_START_ADDR);: T. t1 P4 \# x* m3 B7 _
  10.     EraseInitStruct.NbPages     = 1;9 M1 G( p! Y: e4 P: R$ U" _
  11.     HAL_FLASHEx_Erase(&EraseInitStruct, &PageError);
    6 G. Z7 z; P* q( U
  12.     //8*256=2KB,1 page   
    6 ~6 H/ q6 G/ r- d" J
  13.     for(i=0;i<0x100;i++)
    & F- P4 u" j+ y) F% q" K2 b2 q
  14.         HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, FLASH_USER_START_ADDR+i*8, 0xefcdab8967452301);3 }" t6 O3 w! `! x' o# A
  15.     HAL_FLASH_Lock();
    1 f( R. v! N  H$ A- x. a
  16.     while (1)9 Z# l' _0 V- c
  17.     {
    ( w. ~/ ?1 {; A2 A2 u" c
  18. : K7 e$ [+ _( i# o/ N
  19.     }6 C2 l  K0 Z8 b4 a: X2 D" T1 n& D
  20. }
复制代码
效果嘛,就是把一页的数据都改写为0x012345678abcdef这种模式,因为ARM核是Little-Endian的,所以低字节在前,高字节在后:
0 P4 D, d4 m. R2 ]+ X, s 4.png
* w  {2 z& W/ M5 q( L% u不得不说,有ST Link Utility就是好,直接Dump Flash。
2 t0 i1 u$ k8 [6 S5 O5 ^此外,可以看到刚好改写数据是1页:* Z" ^- Q$ k0 S, e# C' ^
5.png 5 p8 \" Q8 m: o% Q! y
因为0x2000-0x1800=0x800,也就是1 Page的大小。2 o1 ~& ]0 U2 u: K, c

1 e, B/ I/ j3 x7 \, U7 }
+ c( Q0 `! R% d7 E. l
4 N$ D$ F; T: ^, d/ @; T2 N4 W# G
$ i$ S- n/ d% N1 ~  ?; p3 g/ J  G
2019-01-16_132545.png
收藏 2 评论16 发布时间:2019-1-16 20:42

举报

16个回答
STM1024 回答时间:2019-1-17 11:43:59
hujjj 发表于 2019-1-16 22:38
' M  N* w; B" H另外还有页设置的函数GetPage()是在哪个文件中定义的?我在编译时提示未定义。 ...

. a. |! e7 Q5 ]% X啊,这个没复制进去。- Y8 u9 D6 ?/ E) T4 g) ^' g
一行代码:: @* k9 W& O  u  [
  1. static uint32_t GetPage(uint32_t Addr), L* p" v2 {- I. h9 b1 x9 G8 l9 v
  2. {) y3 h0 ~4 t2 g- e7 n. X6 U
  3.   return (Addr - FLASH_BASE) / FLASH_PAGE_SIZE;;! n  K( W8 I: X, G
  4. }
复制代码
STM1024 回答时间:2019-1-17 19:37:44
五哥1 发表于 2019-1-17 18:57# w+ b. O1 w! o( j( H
得一开发板,能换主控吗?|我爱单片机 - 数码之家 http://bbs.mydigit.cn/read.php?tid=2641715
( y! @! K2 T4 g7 W这个文章中 ...

) [; _& w1 w) B这命名方式不太符合ST家的风格,而且目前从官网看,也就只有G070,G071,G081三个大系列。
& A4 q1 F4 c& M+ w# I
STM1024 回答时间:2019-1-17 11:45:40
hujjj 发表于 2019-1-16 22:25
* e0 {7 n2 d/ |# A* z感谢楼主分享!请教楼主HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD函数的这个参数怎么设置?另外要读 ...

* i; D8 J7 f3 F5 T+ a这个可以参考HAL库的文档,我都是调用的HAL库函数
老牛洋车 回答时间:2019-1-16 22:25:17
感谢楼主分享!请教楼主HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD函数的这个参数怎么设置?另外要读取指定地址的数据该如何写代码?
3 z6 X3 X1 Y9 k! b
6 s9 x* }  Y& h0 t) G谢谢!
8 s) U/ o( l' j/ ~0 c* i
老牛洋车 回答时间:2019-1-16 22:38:48
本帖最后由 hujjj 于 2019-1-17 17:24 编辑 0 b# Z9 x8 M( S( J; ~2 ?
+ r" i) _( s8 ]2 t: F# {5 K  F% E
另外还有页设置的函数GetPage()是在哪个文件中定义的?我在编译时提示未定义。
, a- X; D. e2 Q8 K$ h% u这个问题已经解决了,编译通过了。# d. N' G" Y* b: l; W' c  N; x
五哥1 回答时间:2019-1-17 08:35:58
听说,有最新的STLINK 是用STM32G系列的芯片的
STMCU-管管 回答时间:2019-1-17 09:24:14
勤劳的楼主 啊
STM1024 回答时间:2019-1-17 11:46:27
五哥1 发表于 2019-1-17 08:35
+ `7 Q- p8 x$ D/ B3 H* z听说,有最新的STLINK 是用STM32G系列的芯片的

/ ?6 l* x1 i# \+ e额,这个还没见到过,不过一般用的好像都是F103C8T6
七哥 回答时间:2019-1-17 12:17:49
楼主厉害 $ q7 P% U5 E- r! j. A
感谢分享
MrJiu 回答时间:2019-1-17 14:01:57
这个分析的仔细啊!!!
STM1024 回答时间:2019-1-17 14:13:40
MrJiu 发表于 2019-1-17 14:01/ w8 J% ^+ c" x- Y
这个分析的仔细啊!!!

/ j- t9 W8 A5 P; ~大佬过奖了~
STM1024 回答时间:2019-1-17 14:14:02
toofree 发表于 2019-1-17 12:17
1 n' ]* K7 m: y3 w; Y$ y( y% p楼主厉害
! l5 |1 j% U. M5 D0 Z( y感谢分享
" y8 w% R. ~7 p9 M+ j6 Y2 x, x
过奖了,学了点皮毛
Kevin_G 回答时间:2019-1-17 17:42:40
多谢分享
五哥1 回答时间:2019-1-17 18:57:41
得一开发板,能换主控吗?|我爱单片机 - 数码之家 http://bbs.mydigit.cn/read.php?tid=2641715 108_203117_bce98ed2987bc61.jpg
; b; F* {' Y. u1 B1 _2 `7 g这个文章中的,一位买了STLINK 主控是stm32gc102cb
; p3 B, \& D9 `; |
12下一页
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版