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

STM32G071评测:Flash

[复制链接]
STM1024 发布时间:2019-1-16 20:42
本帖最后由 stm1024 于 2019-1-18 11:15 编辑
8 j% ?2 ^# ^; E  M! U$ b/ C) \/ {1 ~2 Y; h6 u* O! Q6 r; c
Flash现已成为MCU的标配,Flash的特性在决定了MCU的一些功能,如代码大小、执行效率、FDU等。了解一款MCU的Flash显得很重要,这里测试一下G071的Flash。/ O4 P0 {! X2 h9 A2 G* m
先看看和F0存在的不同。flash的大小就没必要深究了,主要的区别如下:0 n# ?7 y$ U' k* `4 b8 O) `
2019-01-16_132545.png 5 {) [6 o1 P7 y6 v
1.指令缓存。Flash控制器含有一个8字节的预取指缓冲器和一个16字节的指令缓存。
2 Y& d/ U! D& B- L, ]- B2.OTP区域。所谓的OTP,也就是one time programming,这个区域可以按双字方式写入数据,而且只能写一次,如果写入的数据有一个bit不为0,则以后这个区域就不可更改了,可用于存取非擦写的用户数据。  ?* u# X% s$ H% I- M, g
3.快速编程。官方给出的数据是22ms的擦除时间和写入每双字时间为82us。6 `3 ?0 V8 h* t" R1 R
4.PCROP。这个是proprietary code readout protection的缩写,用于保护代码,其代码只能用来执行,而不能被读取或写入。至于Securable Memory,则是安全储存器,该区域不能被非安全区域外访问,
$ a. u8 m" W5 @) R1 h9 u5.ECC。ECC是Error Correction and Checking,即错误检查和纠正。能检查2 bits的错误,并能纠正1 bit翻转错误。# W0 p+ ]8 V. O( O& _0 N/ s8 x

( A( y* s, R2 X: \再看看Flash的组织。见下图:8 j; r- z3 M) b3 W! A
2.png 2 J( b6 T3 D8 T
Flash主要分为两块,分别是主块和信息块。主块就是常规使用的Flash,通常也是我们程序的入口地址,这一块可以随便使用。( U# \  T( |  p  _" h! v5 D
而信息块则包含了系统储存器,OTP区域和选项字节,Flash的操作方式按下图:0 B' w0 l5 o  O' ?; P" m9 R
3.png ! w/ @( Y0 O: b) v# }6 m; }$ u( N4 Q
编程需要一次写入8字节,也就是粒度为64bits(实际上是72bits,还有8bits的ECC)快速编程为256字节(仅支持Main Memory),快速编程因为不检查所写入的地址,因此比标准编程快了约37%。擦除可按2KB的页或者整个擦除(128KB),但花费的时间相当。% U% \# Y/ G% ^$ j$ {. u

; M8 z8 Z* @6 F* r在选项字节的配置上,和F0系列没有差别(或者我还没有发现)。
& w1 b! E' T( b" C+ ?  s4 `4 |+ Z
' Q3 [( d5 h5 H' y5 C( g8 _以下Flash编程测试代码:. q( ?& D6 j% O
  1. int main(void)  p" Z2 c0 @2 [: s
  2. {
    + P8 @) Q* a- O+ ?% x5 }4 w$ q- r9 b
  3.     uint16_t i;
    ' X' v# o* S& A
  4.     HAL_Init();9 @5 B: _" n. y( r. @
  5.     SystemClock_Config();
    ; T+ s' [% Q6 O
  6.     MX_GPIO_Init();4 `5 A: D) O4 ~; |$ ~/ i
  7.     HAL_FLASH_Unlock();    9 _! h; r) t: i" Z
  8.     EraseInitStruct.TypeErase   = FLASH_TYPEERASE_PAGES;1 ], ]3 t6 M7 s, j4 g* t
  9.     EraseInitStruct.Page        = GetPage(FLASH_USER_START_ADDR);
    + ^; [3 W7 @4 s2 P3 c
  10.     EraseInitStruct.NbPages     = 1;
    7 X, V  `: ~* o4 F) P" Y. \4 u
  11.     HAL_FLASHEx_Erase(&EraseInitStruct, &PageError); 5 r9 N6 n) @$ S  a, ]% X
  12.     //8*256=2KB,1 page   
    + e! Y3 @6 k/ o) M; w  E+ }9 t
  13.     for(i=0;i<0x100;i++)' P. N1 L/ I5 v1 s
  14.         HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, FLASH_USER_START_ADDR+i*8, 0xefcdab8967452301);
    6 M8 Q$ L" r' K9 W
  15.     HAL_FLASH_Lock();
    ) \: `1 K6 o( B4 ^: _( |+ c
  16.     while (1)
    1 `: t3 ]. D9 l1 H5 ~
  17.     {
    + w+ X+ g+ ~) N0 T- x3 j4 @

  18. ! Z7 f' Y7 E: H! _4 h7 U  T
  19.     }
    7 |+ V! q& y% D! [
  20. }
复制代码
效果嘛,就是把一页的数据都改写为0x012345678abcdef这种模式,因为ARM核是Little-Endian的,所以低字节在前,高字节在后:; `" O$ Q4 a0 Q
4.png
+ x9 B0 M) n, C5 V不得不说,有ST Link Utility就是好,直接Dump Flash。( J+ P( q5 [7 z/ ?, |3 a
此外,可以看到刚好改写数据是1页:0 T% f8 F0 L$ ]' N# i" z
5.png 9 j/ g: q  w$ F; v% G
因为0x2000-0x1800=0x800,也就是1 Page的大小。/ t5 G$ i0 u/ y0 e
: u8 s$ j/ K( v, P

1 `1 M' T& T" ?6 c% ]9 L/ s( R
6 w6 r' n7 A! d# @$ [) R1 _" e
- v5 l; g0 ^* z; i4 ~& Z3 ]
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$ r* }. _. ^$ p' g7 C
另外还有页设置的函数GetPage()是在哪个文件中定义的?我在编译时提示未定义。 ...

& ]" W% q. c, o! X7 O啊,这个没复制进去。
/ Q$ |3 c+ w3 Z7 y9 E一行代码:
# k! {* q+ t/ K  o9 S9 E
  1. static uint32_t GetPage(uint32_t Addr)
    2 w6 F2 T* A$ o" u) l: U
  2. {- _8 t( W7 h) i. o& \
  3.   return (Addr - FLASH_BASE) / FLASH_PAGE_SIZE;;
    + V  g9 l+ ~; a/ c; q5 }+ M3 w0 U
  4. }
复制代码
STM1024 回答时间:2019-1-17 19:37:44
五哥1 发表于 2019-1-17 18:57' ^& g. r6 s9 K  d' B9 Q3 ^# t* |0 m
得一开发板,能换主控吗?|我爱单片机 - 数码之家 http://bbs.mydigit.cn/read.php?tid=2641715
8 j" a  A7 B; H$ Y这个文章中 ...
1 f* K6 U; J, K2 g
这命名方式不太符合ST家的风格,而且目前从官网看,也就只有G070,G071,G081三个大系列。- y7 H9 {8 Y8 ~& o
STM1024 回答时间:2019-1-17 11:45:40
hujjj 发表于 2019-1-16 22:25! n# ^- m( p2 l+ P3 J
感谢楼主分享!请教楼主HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD函数的这个参数怎么设置?另外要读 ...

- ^/ u! y8 k  o1 b这个可以参考HAL库的文档,我都是调用的HAL库函数
老牛洋车 回答时间:2019-1-16 22:25:17
感谢楼主分享!请教楼主HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD函数的这个参数怎么设置?另外要读取指定地址的数据该如何写代码?
2 L1 M2 r( k. e' S7 [% Z4 c% @+ v$ _
谢谢!+ r( }+ r! k, n" R" \: x9 O/ o
老牛洋车 回答时间:2019-1-16 22:38:48
本帖最后由 hujjj 于 2019-1-17 17:24 编辑 3 J9 O0 S/ d( d4 |! S

* G4 R2 a: [; _( B$ n/ r另外还有页设置的函数GetPage()是在哪个文件中定义的?我在编译时提示未定义。
6 f( u6 @8 ?) k4 C. }4 ]这个问题已经解决了,编译通过了。+ p* u; j8 v+ @% v3 _9 _
五哥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:350 p' u; E' ?4 N. G
听说,有最新的STLINK 是用STM32G系列的芯片的
; t2 c3 t5 Y, f- T8 d* F
额,这个还没见到过,不过一般用的好像都是F103C8T6
七哥 回答时间:2019-1-17 12:17:49
楼主厉害
, m% h+ f+ o$ i感谢分享
MrJiu 回答时间:2019-1-17 14:01:57
这个分析的仔细啊!!!
STM1024 回答时间:2019-1-17 14:13:40
MrJiu 发表于 2019-1-17 14:01
" f0 B& E  Q3 J0 h这个分析的仔细啊!!!

4 R5 c6 N1 y( Q6 I% \# Y大佬过奖了~
STM1024 回答时间:2019-1-17 14:14:02
toofree 发表于 2019-1-17 12:17
- t2 W/ ]! K; `) v- `楼主厉害 ; f2 F$ P5 X5 J. h' y- p
感谢分享
/ I/ a: G" M1 r* R6 D  t3 Q2 g
过奖了,学了点皮毛
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
0 A' R1 P$ B1 k# ?. V# K- |这个文章中的,一位买了STLINK 主控是stm32gc102cb8 E7 U' I! C6 Q0 \) g2 v' m
12下一页

所属标签

相似技术帖

官网相关资源

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