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

STM32G071评测:Flash

[复制链接]
STM1024 发布时间:2019-1-16 20:42
本帖最后由 stm1024 于 2019-1-18 11:15 编辑 " }2 a3 O4 j5 Y
2 A3 z* S$ m# F) L- [* s
Flash现已成为MCU的标配,Flash的特性在决定了MCU的一些功能,如代码大小、执行效率、FDU等。了解一款MCU的Flash显得很重要,这里测试一下G071的Flash。
* b. r4 q5 k* m8 S5 l; ^! u8 ~& a$ }先看看和F0存在的不同。flash的大小就没必要深究了,主要的区别如下:
2 H0 L! u! V! s! l" U% ~- h 2019-01-16_132545.png 0 Q  I+ V' T5 Y
1.指令缓存。Flash控制器含有一个8字节的预取指缓冲器和一个16字节的指令缓存。
. v- X# V( ~- m! I- A/ I! o2.OTP区域。所谓的OTP,也就是one time programming,这个区域可以按双字方式写入数据,而且只能写一次,如果写入的数据有一个bit不为0,则以后这个区域就不可更改了,可用于存取非擦写的用户数据。
0 ~1 a$ W! N8 V# K4 d3.快速编程。官方给出的数据是22ms的擦除时间和写入每双字时间为82us。& M, t2 p( i! c* r# W
4.PCROP。这个是proprietary code readout protection的缩写,用于保护代码,其代码只能用来执行,而不能被读取或写入。至于Securable Memory,则是安全储存器,该区域不能被非安全区域外访问,
0 Q0 j) T6 p: w4 A5.ECC。ECC是Error Correction and Checking,即错误检查和纠正。能检查2 bits的错误,并能纠正1 bit翻转错误。; L% E! u) T+ C# R3 d# A
) }0 [; H2 A- ~3 L7 }& U/ @
再看看Flash的组织。见下图:
8 `- ]2 O2 s7 U: x8 P 2.png 9 s& c; i! C# [1 }0 W3 D. c
Flash主要分为两块,分别是主块和信息块。主块就是常规使用的Flash,通常也是我们程序的入口地址,这一块可以随便使用。1 X: W4 L/ L, ]8 u
而信息块则包含了系统储存器,OTP区域和选项字节,Flash的操作方式按下图:2 p& S. x0 i0 V# L! N! Y# x
3.png
8 ?5 p* }( R; ]2 o$ T; |- Y编程需要一次写入8字节,也就是粒度为64bits(实际上是72bits,还有8bits的ECC)快速编程为256字节(仅支持Main Memory),快速编程因为不检查所写入的地址,因此比标准编程快了约37%。擦除可按2KB的页或者整个擦除(128KB),但花费的时间相当。
" g! E; i! L" B9 L! N6 z) a/ u4 g- j/ @4 j
在选项字节的配置上,和F0系列没有差别(或者我还没有发现)。3 ?3 c$ W) v: F- `/ p
: s6 F" z- e8 D* o# R4 I5 z
以下Flash编程测试代码:# h2 `1 `$ A" e$ s
  1. int main(void)- U: C; p5 {) ?1 v! r& \
  2. {# Y, R, A* R0 U: H2 V2 f
  3.     uint16_t i;
    ( n) R  P; m* f0 H
  4.     HAL_Init();' X+ M0 @- g7 O5 I) p* ^$ ~
  5.     SystemClock_Config();/ Y* O2 r6 n8 W2 N, x
  6.     MX_GPIO_Init();
    2 b: z3 n! O% B  K
  7.     HAL_FLASH_Unlock();   
    0 y. l' V. b# ~* Q# ?
  8.     EraseInitStruct.TypeErase   = FLASH_TYPEERASE_PAGES;
    / `1 L1 H' \4 N& ~/ Z" i
  9.     EraseInitStruct.Page        = GetPage(FLASH_USER_START_ADDR);
    ; s$ K( ^( E8 y7 I
  10.     EraseInitStruct.NbPages     = 1;
    & ?" `+ o6 a/ p) b2 z  {- q
  11.     HAL_FLASHEx_Erase(&EraseInitStruct, &PageError);
    0 R7 g" ~: |: ~+ w1 k
  12.     //8*256=2KB,1 page   
    5 O5 u" L( H; m8 ?; }
  13.     for(i=0;i<0x100;i++)$ X0 U. z. c% i. D+ F3 Y
  14.         HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, FLASH_USER_START_ADDR+i*8, 0xefcdab8967452301);
    . Q! a* Q6 ?) T/ X+ h$ G
  15.     HAL_FLASH_Lock();
    $ U% x1 [8 G! C9 L. V/ ~
  16.     while (1)9 A* X4 B% P0 q$ q. Z- I
  17.     {
    : c% Y5 {2 i+ `& ]  B9 e
  18. 4 C% Q. ?) z7 D: s+ Y
  19.     }
    ! }( P( h  D5 Y) U
  20. }
复制代码
效果嘛,就是把一页的数据都改写为0x012345678abcdef这种模式,因为ARM核是Little-Endian的,所以低字节在前,高字节在后:2 f8 r$ U$ ]9 N0 V
4.png , D" |! `( L5 u1 p1 G
不得不说,有ST Link Utility就是好,直接Dump Flash。
3 d2 t2 d0 C) N4 v3 C+ U) M此外,可以看到刚好改写数据是1页:
+ p; t6 Y! q) A& e9 z% ?9 I$ Y 5.png - L' r0 T. R; g9 j1 t
因为0x2000-0x1800=0x800,也就是1 Page的大小。" Q7 H  y6 x+ d9 A' L6 m

% K+ E% s$ g  U/ s9 Q
2 b$ Q: }0 S4 \/ K- t
5 b/ q* m1 \1 I0 Y$ J) p: l5 g6 }. E
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:388 z2 y$ [- e2 ~& M2 e0 F1 D. h
另外还有页设置的函数GetPage()是在哪个文件中定义的?我在编译时提示未定义。 ...

7 ^0 D  z& \7 |/ y. X* S" {$ B+ P啊,这个没复制进去。
. C  H( S5 I1 s; @, z4 z1 n/ p一行代码:9 l$ p) ]9 r! T4 K7 v& B: ], S
  1. static uint32_t GetPage(uint32_t Addr)2 Z9 A; x7 F" P1 F9 X
  2. {
    % F; b; K7 R# Z
  3.   return (Addr - FLASH_BASE) / FLASH_PAGE_SIZE;;5 B* c  a& W+ M/ k$ G2 v& \' q. v
  4. }
复制代码
STM1024 回答时间:2019-1-17 19:37:44
五哥1 发表于 2019-1-17 18:573 T2 `# V! f) Z6 X4 e
得一开发板,能换主控吗?|我爱单片机 - 数码之家 http://bbs.mydigit.cn/read.php?tid=2641715/ v8 k2 @9 ?  m0 Q+ z
这个文章中 ...

" r. F  e8 n( b8 G5 S5 y- Z" z这命名方式不太符合ST家的风格,而且目前从官网看,也就只有G070,G071,G081三个大系列。2 W9 F: Z9 T; I, z# h4 d
STM1024 回答时间:2019-1-17 11:45:40
hujjj 发表于 2019-1-16 22:25" s5 }- K# r/ E4 _6 W: ]
感谢楼主分享!请教楼主HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD函数的这个参数怎么设置?另外要读 ...
9 p, E' o5 S4 n% q
这个可以参考HAL库的文档,我都是调用的HAL库函数
老牛洋车 回答时间:2019-1-16 22:25:17
感谢楼主分享!请教楼主HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD函数的这个参数怎么设置?另外要读取指定地址的数据该如何写代码?- H8 G+ g1 x5 d7 o6 D% [
* |0 x2 J# \+ U; `5 z
谢谢!( C" r5 o6 x! b. r6 J) D. _
老牛洋车 回答时间:2019-1-16 22:38:48
本帖最后由 hujjj 于 2019-1-17 17:24 编辑 * B0 L  Q6 R1 S: M5 O

/ p, Q: L# u& K1 _2 }( ~另外还有页设置的函数GetPage()是在哪个文件中定义的?我在编译时提示未定义。( `, [* @) X% X# C+ n4 @
这个问题已经解决了,编译通过了。7 }! g4 O3 T7 m- J8 |
五哥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
, L1 ^% x; r% P! _$ [听说,有最新的STLINK 是用STM32G系列的芯片的

( u, l) Z* H+ r9 D" f额,这个还没见到过,不过一般用的好像都是F103C8T6
七哥 回答时间:2019-1-17 12:17:49
楼主厉害
% c+ _" L! _6 z感谢分享
MrJiu 回答时间:2019-1-17 14:01:57
这个分析的仔细啊!!!
STM1024 回答时间:2019-1-17 14:13:40
MrJiu 发表于 2019-1-17 14:01( Y# T2 V' F3 P- N; t, F9 t: s
这个分析的仔细啊!!!

; c- u( F; |2 M& C; Q' `大佬过奖了~
STM1024 回答时间:2019-1-17 14:14:02
toofree 发表于 2019-1-17 12:178 l* n8 A! K2 H& u
楼主厉害 - k1 {7 [& q; {" ]) a
感谢分享

+ X9 t; n# T' V' w6 K过奖了,学了点皮毛
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 - L; M- h; M4 `! n  n9 [0 v
这个文章中的,一位买了STLINK 主控是stm32gc102cb
, t6 E& e3 ^, h6 k% A+ W9 |$ ^# O! n
12下一页

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版