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

STM32G071评测:Flash

[复制链接]
STM1024 发布时间:2019-1-16 20:42
本帖最后由 stm1024 于 2019-1-18 11:15 编辑
6 j8 \" p7 U  H: h% ~+ w% Q2 Y$ P4 F0 [* d: ^
Flash现已成为MCU的标配,Flash的特性在决定了MCU的一些功能,如代码大小、执行效率、FDU等。了解一款MCU的Flash显得很重要,这里测试一下G071的Flash。
  z- S1 q. b) ^: w先看看和F0存在的不同。flash的大小就没必要深究了,主要的区别如下:
& {% E5 T; @4 O5 X 2019-01-16_132545.png 3 i* ?8 b; L- {
1.指令缓存。Flash控制器含有一个8字节的预取指缓冲器和一个16字节的指令缓存。6 C6 x. E" R( c! Z2 Y) z' v
2.OTP区域。所谓的OTP,也就是one time programming,这个区域可以按双字方式写入数据,而且只能写一次,如果写入的数据有一个bit不为0,则以后这个区域就不可更改了,可用于存取非擦写的用户数据。0 w7 g% k" K1 T5 b# t8 `
3.快速编程。官方给出的数据是22ms的擦除时间和写入每双字时间为82us。
0 v( k* l, g2 X$ M! C4.PCROP。这个是proprietary code readout protection的缩写,用于保护代码,其代码只能用来执行,而不能被读取或写入。至于Securable Memory,则是安全储存器,该区域不能被非安全区域外访问,
, z5 M0 n# n' d4 `5.ECC。ECC是Error Correction and Checking,即错误检查和纠正。能检查2 bits的错误,并能纠正1 bit翻转错误。
& @: \& n8 U4 ]( ]
$ U# C: k% w" L再看看Flash的组织。见下图:
2 g7 ~4 d7 k- ], L6 M' c: ~4 S 2.png
0 n( R' W1 Z4 v: C$ ~" SFlash主要分为两块,分别是主块和信息块。主块就是常规使用的Flash,通常也是我们程序的入口地址,这一块可以随便使用。
4 M6 u6 t# p6 }* v5 ~4 i而信息块则包含了系统储存器,OTP区域和选项字节,Flash的操作方式按下图:
; H3 g$ r% J) { 3.png / E8 i  n+ [: H" A3 M* r: g
编程需要一次写入8字节,也就是粒度为64bits(实际上是72bits,还有8bits的ECC)快速编程为256字节(仅支持Main Memory),快速编程因为不检查所写入的地址,因此比标准编程快了约37%。擦除可按2KB的页或者整个擦除(128KB),但花费的时间相当。" A) F. }  R! {

5 \  g, n1 Y# |4 O' R在选项字节的配置上,和F0系列没有差别(或者我还没有发现)。
0 K. b3 L9 X9 Y. {8 b; e
# W" n1 ?  x2 P+ c5 B4 P以下Flash编程测试代码:6 [* K, D( X0 c, u( i/ r- Y
  1. int main(void)$ }2 K1 b% i9 L. ?( O: z8 K
  2. {
    " [2 I7 i; m' A9 o9 _4 B
  3.     uint16_t i;
    ! Q- A* b/ e  v9 P& t
  4.     HAL_Init();/ Z$ f, _9 \3 f6 h
  5.     SystemClock_Config();
    . G9 Z0 ~- m* u- M: Z$ v
  6.     MX_GPIO_Init();0 C" d9 J: {* l5 f/ F4 G* q
  7.     HAL_FLASH_Unlock();    ; M) H& J# q; d$ s$ N2 W
  8.     EraseInitStruct.TypeErase   = FLASH_TYPEERASE_PAGES;* T/ M* W4 R4 k& X3 j! ^$ T
  9.     EraseInitStruct.Page        = GetPage(FLASH_USER_START_ADDR);
    7 h) ?8 _. F$ u* k7 F3 }' E+ D! H; a
  10.     EraseInitStruct.NbPages     = 1;
    6 {8 x9 R" @1 x  R$ r
  11.     HAL_FLASHEx_Erase(&EraseInitStruct, &PageError);
    & v$ c6 G) a& {' _' u* C
  12.     //8*256=2KB,1 page    ) \' x9 M4 D) p( O* {
  13.     for(i=0;i<0x100;i++)9 Q4 c* j7 F& ^( ~: [0 z
  14.         HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, FLASH_USER_START_ADDR+i*8, 0xefcdab8967452301);
    ' @* D, B1 V: F1 U$ r  u% @1 x
  15.     HAL_FLASH_Lock();
    8 H: N4 V6 l# P3 ^( `' M; s
  16.     while (1)" c! @0 U1 |( g/ b& h5 ^8 v5 Q6 R
  17.     {3 r% I+ G: a( f6 L4 t1 v" L2 Q
  18. 2 R( O( |5 `$ Y3 I
  19.     }
    ( [! Z5 g, n# X% U" R
  20. }
复制代码
效果嘛,就是把一页的数据都改写为0x012345678abcdef这种模式,因为ARM核是Little-Endian的,所以低字节在前,高字节在后:
" u4 P: ]1 u+ N) o! K# ]' Z 4.png
8 f2 O( H+ a; K( z2 x不得不说,有ST Link Utility就是好,直接Dump Flash。+ b' s' |1 t2 b3 _3 t% \6 C3 v; f
此外,可以看到刚好改写数据是1页:) |9 S! ]9 i$ d) [, ]  k/ K
5.png . l; ^1 N# m- E% s7 m8 c
因为0x2000-0x1800=0x800,也就是1 Page的大小。! ]) w- V: e1 j8 ^( ?  e7 L8 G

* v" Z- Q! ~  t- k: G* V' R0 x+ L& ]4 [! Z( W8 u3 S9 q' W, z$ c
4 q& [! G8 X  j1 S6 W
# O6 D3 P3 e& Q1 Q9 I5 @
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
: e% R6 e" o/ Z# \另外还有页设置的函数GetPage()是在哪个文件中定义的?我在编译时提示未定义。 ...

; R9 O7 A6 H1 R0 c0 z6 ~啊,这个没复制进去。: z7 Y/ `) @, J' D' K
一行代码:
& ~1 {( o# O3 F
  1. static uint32_t GetPage(uint32_t Addr), ^# S; T$ m( ~/ P
  2. {
    + N7 M/ m% t5 H, d6 f2 X* d
  3.   return (Addr - FLASH_BASE) / FLASH_PAGE_SIZE;;
    2 ^0 Y; F% v) H. k6 P  h
  4. }
复制代码
STM1024 回答时间:2019-1-17 19:37:44
五哥1 发表于 2019-1-17 18:574 Q8 U+ x0 v9 c& S; I. o+ z% W
得一开发板,能换主控吗?|我爱单片机 - 数码之家 http://bbs.mydigit.cn/read.php?tid=2641715
  b0 S8 {, `) f2 m  e+ ^4 P. o4 {) D这个文章中 ...
7 b0 e- _  w2 _* G$ n1 P/ J
这命名方式不太符合ST家的风格,而且目前从官网看,也就只有G070,G071,G081三个大系列。9 T) k! I$ Q9 \# R
STM1024 回答时间:2019-1-17 11:45:40
hujjj 发表于 2019-1-16 22:25. o, l: G, k3 K; l7 o! ^& C! `* c
感谢楼主分享!请教楼主HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD函数的这个参数怎么设置?另外要读 ...
) s$ F+ D4 c; _. e$ l0 E
这个可以参考HAL库的文档,我都是调用的HAL库函数
老牛洋车 回答时间:2019-1-16 22:25:17
感谢楼主分享!请教楼主HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD函数的这个参数怎么设置?另外要读取指定地址的数据该如何写代码?
  i* F6 W0 C0 S( f; `; _/ l* E) u' u4 Q( l' \& y
谢谢!- }  A# [3 @# l, P3 n. b0 J: i
老牛洋车 回答时间:2019-1-16 22:38:48
本帖最后由 hujjj 于 2019-1-17 17:24 编辑 - c: B; z3 T$ q% T
, [$ G, ?( i* t8 {) l$ p
另外还有页设置的函数GetPage()是在哪个文件中定义的?我在编译时提示未定义。
( f9 a0 \: r4 ?: Q这个问题已经解决了,编译通过了。2 h7 w& }% ~( n
五哥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
( b; a/ G7 p! ^8 N听说,有最新的STLINK 是用STM32G系列的芯片的
) u) m2 Z4 t" Y) z1 @% @8 T
额,这个还没见到过,不过一般用的好像都是F103C8T6
七哥 回答时间:2019-1-17 12:17:49
楼主厉害 4 |. K  a& |, r
感谢分享
MrJiu 回答时间:2019-1-17 14:01:57
这个分析的仔细啊!!!
STM1024 回答时间:2019-1-17 14:13:40
MrJiu 发表于 2019-1-17 14:01
, b2 O" W: R% a0 n这个分析的仔细啊!!!
& [% `0 S! r( f- R3 L. }
大佬过奖了~
STM1024 回答时间:2019-1-17 14:14:02
toofree 发表于 2019-1-17 12:17
' e$ }: q  _8 e5 r, G4 ^/ n楼主厉害
9 {9 D' R" H- T感谢分享

7 T, ^7 B; o0 e! a9 d过奖了,学了点皮毛
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
, Y7 B: L6 n4 Q" s这个文章中的,一位买了STLINK 主控是stm32gc102cb
" C; v: q6 T! F3 c0 Q
12下一页
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版