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

STM32G071评测:Flash

[复制链接]
STM1024 发布时间:2019-1-16 20:42
本帖最后由 stm1024 于 2019-1-18 11:15 编辑 7 e2 a: F% N* d5 S( X$ m

; I) p* r9 w" {# g  N3 N2 @* X9 XFlash现已成为MCU的标配,Flash的特性在决定了MCU的一些功能,如代码大小、执行效率、FDU等。了解一款MCU的Flash显得很重要,这里测试一下G071的Flash。9 _/ Q% w5 R9 V% P1 @& r: w
先看看和F0存在的不同。flash的大小就没必要深究了,主要的区别如下:
+ @; L5 s/ v9 G1 m 2019-01-16_132545.png ) p9 @* ^# [3 R. x/ @  G/ Z3 ]7 J
1.指令缓存。Flash控制器含有一个8字节的预取指缓冲器和一个16字节的指令缓存。
5 g# T3 Z3 `3 a; {, c* q2.OTP区域。所谓的OTP,也就是one time programming,这个区域可以按双字方式写入数据,而且只能写一次,如果写入的数据有一个bit不为0,则以后这个区域就不可更改了,可用于存取非擦写的用户数据。
9 r8 c5 |+ z: T$ t3.快速编程。官方给出的数据是22ms的擦除时间和写入每双字时间为82us。
! _6 Y6 c  j) ^; i5 P2 r4.PCROP。这个是proprietary code readout protection的缩写,用于保护代码,其代码只能用来执行,而不能被读取或写入。至于Securable Memory,则是安全储存器,该区域不能被非安全区域外访问,
( q) \9 e* k4 y" k5.ECC。ECC是Error Correction and Checking,即错误检查和纠正。能检查2 bits的错误,并能纠正1 bit翻转错误。
" P" a! ?, C" V0 y3 T) t; S! W4 h
3 i  u- Z3 y; y再看看Flash的组织。见下图:
$ w2 B  E& J3 {. Y* d/ a% s7 Q 2.png : u5 G4 f3 ^/ A( d6 A  X# Q
Flash主要分为两块,分别是主块和信息块。主块就是常规使用的Flash,通常也是我们程序的入口地址,这一块可以随便使用。
, z2 S! l' f4 D- i: D- V$ W0 q+ n3 ^; C% G而信息块则包含了系统储存器,OTP区域和选项字节,Flash的操作方式按下图:
/ ^) P( n' M) H4 X5 t" C7 n0 U 3.png 8 g+ u( V6 x" q+ r1 \$ V
编程需要一次写入8字节,也就是粒度为64bits(实际上是72bits,还有8bits的ECC)快速编程为256字节(仅支持Main Memory),快速编程因为不检查所写入的地址,因此比标准编程快了约37%。擦除可按2KB的页或者整个擦除(128KB),但花费的时间相当。
* [& b* _+ h9 ?( J$ C7 T( N8 Y0 ?* q+ K  t5 V% M
在选项字节的配置上,和F0系列没有差别(或者我还没有发现)。, _; D$ h% P! w

3 c3 ~6 X, t/ i0 h# Y以下Flash编程测试代码:) }5 ^+ G  y9 S" ?3 z( ]
  1. int main(void)' y" a8 s! T  M' h9 x
  2. {
    1 y% U' I7 O: n9 i' [3 Q: T, j
  3.     uint16_t i;: @+ _! Z- z& r0 {$ V" H6 n
  4.     HAL_Init();; X" ~7 L- T" O) p, {
  5.     SystemClock_Config();
    4 O3 y' W1 F- H3 X2 i* Y
  6.     MX_GPIO_Init();* Q) g2 S2 U4 d
  7.     HAL_FLASH_Unlock();   
    2 i. F7 T: o! }6 \% ~
  8.     EraseInitStruct.TypeErase   = FLASH_TYPEERASE_PAGES;' W/ T7 |& _5 w5 G
  9.     EraseInitStruct.Page        = GetPage(FLASH_USER_START_ADDR);/ N) `+ q& X% r# q# ^" f0 I
  10.     EraseInitStruct.NbPages     = 1;5 {8 Z0 x  n# m8 q5 M/ o8 L) q( O* K
  11.     HAL_FLASHEx_Erase(&EraseInitStruct, &PageError); * W3 B' s" K4 n; w( J$ y
  12.     //8*256=2KB,1 page   
    + A& b& ?- b+ C* o0 J
  13.     for(i=0;i<0x100;i++)
    . l' y  R8 L& d; _) b* a
  14.         HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, FLASH_USER_START_ADDR+i*8, 0xefcdab8967452301);2 J6 h$ ^/ I9 Q3 p, `
  15.     HAL_FLASH_Lock();
    ! d5 v# D) u2 n! C' f- R
  16.     while (1)
    , a% a" O5 ~* H5 C; c2 N* x' I
  17.     {0 ~; n8 a7 I+ r, z7 ~6 g# Q

  18. / O, v8 u/ R4 u) q1 z* }* T
  19.     }2 @# d& ~6 {+ ]& I
  20. }
复制代码
效果嘛,就是把一页的数据都改写为0x012345678abcdef这种模式,因为ARM核是Little-Endian的,所以低字节在前,高字节在后:3 o( D( r/ q* J  N8 @
4.png
2 @; a" j' F$ s. }不得不说,有ST Link Utility就是好,直接Dump Flash。# t0 E' i! |" M, ~! D; D
此外,可以看到刚好改写数据是1页:
  v: x" r% s0 Q; s! @0 Q" x; F3 y 5.png
9 z. z; c4 X2 K1 g& r: u因为0x2000-0x1800=0x800,也就是1 Page的大小。
- Z" f4 a8 S* B8 N7 A) D4 r, X( C1 m+ h; ]! V3 z7 ?! f0 |

. c" W4 K& L4 L0 d- W9 v& a" z% U2 S0 p$ ]2 W
; ~2 i9 F) K' {' z. N/ E! F
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
1 `0 `, Z( n) X! g另外还有页设置的函数GetPage()是在哪个文件中定义的?我在编译时提示未定义。 ...

; K7 ]4 O% N7 T. h- w啊,这个没复制进去。
' Q. ~7 |* X$ Y% z0 U7 O一行代码:4 O, v& }7 h+ l( _  R2 U# f
  1. static uint32_t GetPage(uint32_t Addr)3 m. }& D; q7 E+ f; d" h, {
  2. {: ~, [! b( n0 a9 L4 _
  3.   return (Addr - FLASH_BASE) / FLASH_PAGE_SIZE;;* V/ P9 e. R! Y( e" e3 w' a0 R
  4. }
复制代码
STM1024 回答时间:2019-1-17 19:37:44
五哥1 发表于 2019-1-17 18:57
' z) i( G% d1 `' L; _得一开发板,能换主控吗?|我爱单片机 - 数码之家 http://bbs.mydigit.cn/read.php?tid=26417154 }4 g- A; T) i" Z3 x9 R& X
这个文章中 ...
! W0 _' e0 Z$ |
这命名方式不太符合ST家的风格,而且目前从官网看,也就只有G070,G071,G081三个大系列。3 m3 o  K; g9 O3 z; a5 u% T
STM1024 回答时间:2019-1-17 11:45:40
hujjj 发表于 2019-1-16 22:25
  s( h! E. \+ M* M2 S8 H感谢楼主分享!请教楼主HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD函数的这个参数怎么设置?另外要读 ...

$ m: @. b8 T0 {( |7 t- q  y$ _% V这个可以参考HAL库的文档,我都是调用的HAL库函数
老牛洋车 回答时间:2019-1-16 22:25:17
感谢楼主分享!请教楼主HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD函数的这个参数怎么设置?另外要读取指定地址的数据该如何写代码?5 O1 V, q' ?( A) a: C  W
* Z0 ]0 N5 r5 D
谢谢!) `& v& b, ^0 \" Z9 j+ p: F) s
老牛洋车 回答时间:2019-1-16 22:38:48
本帖最后由 hujjj 于 2019-1-17 17:24 编辑 1 g0 I) G" W0 I7 Z! I& k1 E
5 G. D7 ~/ [1 D: ^4 e# f+ j! P
另外还有页设置的函数GetPage()是在哪个文件中定义的?我在编译时提示未定义。
. V- g; H: H; y' D这个问题已经解决了,编译通过了。
) B8 y5 [: a* Q8 W7 j' m4 D. c7 d+ Z
五哥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
1 j: K8 r( W5 j2 J听说,有最新的STLINK 是用STM32G系列的芯片的
" y+ r% L; E" S& i% T( X$ V
额,这个还没见到过,不过一般用的好像都是F103C8T6
七哥 回答时间:2019-1-17 12:17:49
楼主厉害
: w! w( [1 z2 {8 s' ]8 k感谢分享
MrJiu 回答时间:2019-1-17 14:01:57
这个分析的仔细啊!!!
STM1024 回答时间:2019-1-17 14:13:40
MrJiu 发表于 2019-1-17 14:019 f8 i8 D3 p$ \4 g" p
这个分析的仔细啊!!!

5 L6 C/ y. Q, [5 I大佬过奖了~
STM1024 回答时间:2019-1-17 14:14:02
toofree 发表于 2019-1-17 12:17
1 J0 U3 a  O: x% K% j% b楼主厉害
5 @( m* F# M* c0 I3 ~' i感谢分享

' {! T; d$ U2 t# K5 f$ M7 B  e; d, O过奖了,学了点皮毛
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# t% j: i3 l' V9 n5 F
这个文章中的,一位买了STLINK 主控是stm32gc102cb0 e% i" A/ {# ~0 K6 X/ u' V/ i! B
12下一页
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版