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

STM32G071评测:Flash

[复制链接]
STM1024 发布时间:2019-1-16 20:42
本帖最后由 stm1024 于 2019-1-18 11:15 编辑
8 g0 n: J$ S0 Z  o  I  r( |8 N: f7 r3 w$ e4 {8 ?3 g% ?
Flash现已成为MCU的标配,Flash的特性在决定了MCU的一些功能,如代码大小、执行效率、FDU等。了解一款MCU的Flash显得很重要,这里测试一下G071的Flash。
8 c: `3 n( w2 O& C0 R! P* r先看看和F0存在的不同。flash的大小就没必要深究了,主要的区别如下:. f" m# L9 e: M3 i) _1 \& |
2019-01-16_132545.png 7 ?- _) X0 R+ P! [
1.指令缓存。Flash控制器含有一个8字节的预取指缓冲器和一个16字节的指令缓存。4 Y- `* A& a8 H
2.OTP区域。所谓的OTP,也就是one time programming,这个区域可以按双字方式写入数据,而且只能写一次,如果写入的数据有一个bit不为0,则以后这个区域就不可更改了,可用于存取非擦写的用户数据。' G" M9 q9 ?8 R+ G
3.快速编程。官方给出的数据是22ms的擦除时间和写入每双字时间为82us。
3 x& k3 n1 A: S. X4.PCROP。这个是proprietary code readout protection的缩写,用于保护代码,其代码只能用来执行,而不能被读取或写入。至于Securable Memory,则是安全储存器,该区域不能被非安全区域外访问,) g- T( k+ \9 ?5 g! C1 m6 Y
5.ECC。ECC是Error Correction and Checking,即错误检查和纠正。能检查2 bits的错误,并能纠正1 bit翻转错误。
- M+ t+ M* H% f$ M2 E. ]+ Y& w+ s8 d0 z5 N. j+ }7 D- R) X8 A* g1 w9 w1 }+ m
再看看Flash的组织。见下图:
* @3 s: a3 h4 s$ f1 v 2.png   p+ G7 t' R/ k$ p3 u# L2 I9 n! `: ^
Flash主要分为两块,分别是主块和信息块。主块就是常规使用的Flash,通常也是我们程序的入口地址,这一块可以随便使用。
2 s1 J8 l9 X- n$ m: i, H2 G而信息块则包含了系统储存器,OTP区域和选项字节,Flash的操作方式按下图:
! M7 k, B1 }9 w& B$ N 3.png $ x4 i% K; F7 m; {& l
编程需要一次写入8字节,也就是粒度为64bits(实际上是72bits,还有8bits的ECC)快速编程为256字节(仅支持Main Memory),快速编程因为不检查所写入的地址,因此比标准编程快了约37%。擦除可按2KB的页或者整个擦除(128KB),但花费的时间相当。
& q2 j( G5 l8 \, L
" J6 f9 V+ \3 s8 W) e7 R3 m. r# [+ f在选项字节的配置上,和F0系列没有差别(或者我还没有发现)。3 c) L3 c. Z6 f/ d0 s0 F1 p
) _: C  K* Q( Y* C
以下Flash编程测试代码:) x7 p5 e* h& O0 z
  1. int main(void)+ K# V. B% x' k7 O8 f
  2. {
    , }  I( m2 T/ Z
  3.     uint16_t i;7 d% C, v# E- i! b' V6 r3 n
  4.     HAL_Init();1 }( }! O! p5 O6 A1 ]
  5.     SystemClock_Config();6 Y# p9 b" t4 k/ r1 g1 o( M
  6.     MX_GPIO_Init();/ V4 `+ J2 ^! [  _, v
  7.     HAL_FLASH_Unlock();   
    # w' o: K$ G, c0 i
  8.     EraseInitStruct.TypeErase   = FLASH_TYPEERASE_PAGES;
    / ~6 f3 J. R6 I* h/ c6 S
  9.     EraseInitStruct.Page        = GetPage(FLASH_USER_START_ADDR);; Y/ c$ n( O4 a# }, t6 V% E
  10.     EraseInitStruct.NbPages     = 1;
    , P( z5 c: e5 E' Y- ]
  11.     HAL_FLASHEx_Erase(&EraseInitStruct, &PageError); - i% w0 @" E7 A: c7 _5 v& m* e) d
  12.     //8*256=2KB,1 page    2 x2 h/ p( p% [$ @( s
  13.     for(i=0;i<0x100;i++)
      H# K8 e% B# N: G
  14.         HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, FLASH_USER_START_ADDR+i*8, 0xefcdab8967452301);7 m. b8 I, F0 h2 i
  15.     HAL_FLASH_Lock();
    6 ]2 R! w. a( }
  16.     while (1)
    , X  M# e$ q0 f* b7 m' S: y+ F2 @7 [
  17.     {8 w2 w5 _5 ^9 L# e, ~

  18. ' g1 ^9 _" T9 b! i& ~! e, B' E
  19.     }
    5 n  A% a6 h% q% z# r
  20. }
复制代码
效果嘛,就是把一页的数据都改写为0x012345678abcdef这种模式,因为ARM核是Little-Endian的,所以低字节在前,高字节在后:
: F1 z7 A2 q+ j! R4 o 4.png
6 Q3 P% @! }8 {4 f$ y8 o不得不说,有ST Link Utility就是好,直接Dump Flash。3 p. O) O) W. S1 d0 a
此外,可以看到刚好改写数据是1页:
) ~5 F$ T  \" R: f5 S4 e 5.png
5 T( O$ c1 @2 c因为0x2000-0x1800=0x800,也就是1 Page的大小。$ [( T- M. |$ n0 W: n3 m  L
  Z; b2 |+ S; S% i3 i

/ K8 ?- R3 O0 N, l% r6 s$ H2 n
& ^2 D% g9 t, G5 i, n8 \0 V$ K+ b# \1 G4 t0 {) F1 u
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
) g- X4 f. Y6 e: ~. \' Q9 u7 K另外还有页设置的函数GetPage()是在哪个文件中定义的?我在编译时提示未定义。 ...

  [4 ?- J, E* R啊,这个没复制进去。5 f$ {! o" \: j3 U# n) _1 w
一行代码:
9 C( u0 Y" i( }2 F' W- o
  1. static uint32_t GetPage(uint32_t Addr)( x" o, _8 ?2 w% v
  2. {
    0 m" S& y, {. f3 p
  3.   return (Addr - FLASH_BASE) / FLASH_PAGE_SIZE;;
    + I0 P3 N4 n7 K
  4. }
复制代码
STM1024 回答时间:2019-1-17 19:37:44
五哥1 发表于 2019-1-17 18:57
. B8 M; |' \8 T: {得一开发板,能换主控吗?|我爱单片机 - 数码之家 http://bbs.mydigit.cn/read.php?tid=2641715
. C/ }8 F9 W1 i6 [0 E  a, X9 O这个文章中 ...

% w8 v' I- y! j1 k* T这命名方式不太符合ST家的风格,而且目前从官网看,也就只有G070,G071,G081三个大系列。
$ e/ O% h9 V+ ^' o; z
STM1024 回答时间:2019-1-17 11:45:40
hujjj 发表于 2019-1-16 22:25
& K4 ~% k; n0 a; {; M! T, L感谢楼主分享!请教楼主HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD函数的这个参数怎么设置?另外要读 ...

( Y" q8 }  o) t. p# r这个可以参考HAL库的文档,我都是调用的HAL库函数
老牛洋车 回答时间:2019-1-16 22:25:17
感谢楼主分享!请教楼主HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD函数的这个参数怎么设置?另外要读取指定地址的数据该如何写代码?! ^+ T. B; T  |5 W8 S
' F2 s3 F# F5 |/ x
谢谢!% H* b( c3 G# w0 y. w  N% L+ @
老牛洋车 回答时间:2019-1-16 22:38:48
本帖最后由 hujjj 于 2019-1-17 17:24 编辑
, X. _5 r) s& V
" c. w; P% N" E% F6 D% G9 m, Z" o另外还有页设置的函数GetPage()是在哪个文件中定义的?我在编译时提示未定义。* Q% T& a* x- f
这个问题已经解决了,编译通过了。+ Y" k/ Z% _) h. C( Y
五哥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  A' x! m2 f+ T/ ]
听说,有最新的STLINK 是用STM32G系列的芯片的

1 C: `/ }8 X0 @" y额,这个还没见到过,不过一般用的好像都是F103C8T6
七哥 回答时间:2019-1-17 12:17:49
楼主厉害
3 D5 v5 h7 Q) m: W感谢分享
MrJiu 回答时间:2019-1-17 14:01:57
这个分析的仔细啊!!!
STM1024 回答时间:2019-1-17 14:13:40
MrJiu 发表于 2019-1-17 14:01
$ S+ a5 }& L. j9 Y) J2 ]* d. u5 x这个分析的仔细啊!!!

$ S# D4 s/ K1 _8 ^' b大佬过奖了~
STM1024 回答时间:2019-1-17 14:14:02
toofree 发表于 2019-1-17 12:179 m6 i. d0 s6 o, A* f) b8 ?1 |
楼主厉害
( S7 G. U# f9 M% X2 H% N/ ]$ v+ A感谢分享
% X" ^. O+ W, D, r7 ]
过奖了,学了点皮毛
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
/ A' u  c4 t) G这个文章中的,一位买了STLINK 主控是stm32gc102cb
& r/ i5 R  R) M" ^
12下一页
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版