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

STM32G071评测:Flash

[复制链接]
STM1024 发布时间:2019-1-16 20:42
本帖最后由 stm1024 于 2019-1-18 11:15 编辑
2 H  F6 s+ W9 [2 }$ v% u9 F9 W& a$ j- }7 e7 j5 t; z! Y
Flash现已成为MCU的标配,Flash的特性在决定了MCU的一些功能,如代码大小、执行效率、FDU等。了解一款MCU的Flash显得很重要,这里测试一下G071的Flash。
' k, W' f8 f3 B) V先看看和F0存在的不同。flash的大小就没必要深究了,主要的区别如下:% X+ n. A1 t( |7 a8 X+ |7 u2 f
2019-01-16_132545.png
3 J% B4 ~5 a! a6 v# P& d$ W! l1.指令缓存。Flash控制器含有一个8字节的预取指缓冲器和一个16字节的指令缓存。6 T/ I, {5 Y# M2 v+ K( Q1 x* i
2.OTP区域。所谓的OTP,也就是one time programming,这个区域可以按双字方式写入数据,而且只能写一次,如果写入的数据有一个bit不为0,则以后这个区域就不可更改了,可用于存取非擦写的用户数据。
* s/ U& U  U9 m2 M3.快速编程。官方给出的数据是22ms的擦除时间和写入每双字时间为82us。0 L4 b1 C8 A" M- l, ^; i- u
4.PCROP。这个是proprietary code readout protection的缩写,用于保护代码,其代码只能用来执行,而不能被读取或写入。至于Securable Memory,则是安全储存器,该区域不能被非安全区域外访问,
: I5 M3 w0 t" c2 W: I5.ECC。ECC是Error Correction and Checking,即错误检查和纠正。能检查2 bits的错误,并能纠正1 bit翻转错误。9 [: Z6 f7 S) @5 _
" X- K' M- D+ A- k
再看看Flash的组织。见下图:; f" v3 g0 c* Z; b
2.png
8 }* x0 i0 C1 r4 ]4 b+ ~$ {Flash主要分为两块,分别是主块和信息块。主块就是常规使用的Flash,通常也是我们程序的入口地址,这一块可以随便使用。
8 L4 x1 Z/ W  e# ~# R# G而信息块则包含了系统储存器,OTP区域和选项字节,Flash的操作方式按下图:' P5 H6 Q: X/ R5 B4 s' Y
3.png ( I% r* N; D! z) a. R, v
编程需要一次写入8字节,也就是粒度为64bits(实际上是72bits,还有8bits的ECC)快速编程为256字节(仅支持Main Memory),快速编程因为不检查所写入的地址,因此比标准编程快了约37%。擦除可按2KB的页或者整个擦除(128KB),但花费的时间相当。
3 z+ o. T% y+ a# \, J7 R7 Y' X% [' T. j2 y' H; }/ K
在选项字节的配置上,和F0系列没有差别(或者我还没有发现)。# d& ~8 f# v0 d3 v8 b- I3 v: w; l9 _
& N& I8 F4 \5 x
以下Flash编程测试代码:
; ~/ y7 e. o) G6 m
  1. int main(void)+ o: S. p& ^& ?( |4 h$ |
  2. {" z- I$ E/ D* H+ t: L
  3.     uint16_t i;
    $ T0 g8 _5 z7 u  W0 l1 _. {4 t; [
  4.     HAL_Init();
    ! Y$ X5 x$ k1 c5 e# l3 L
  5.     SystemClock_Config();
    & p9 s# r# J6 |5 m& L% C' K
  6.     MX_GPIO_Init();
    6 F! N3 r& o% a5 {5 G% W
  7.     HAL_FLASH_Unlock();   
    $ O( v9 q2 X% q+ e. a/ }
  8.     EraseInitStruct.TypeErase   = FLASH_TYPEERASE_PAGES;
    : i3 q. M- v  X4 @9 g" M  j3 d
  9.     EraseInitStruct.Page        = GetPage(FLASH_USER_START_ADDR);6 D, D3 d& g, a$ N6 ?0 _1 [. @
  10.     EraseInitStruct.NbPages     = 1;4 L5 e# F2 M" i( b1 n
  11.     HAL_FLASHEx_Erase(&EraseInitStruct, &PageError); ! @% Q: i# E* |
  12.     //8*256=2KB,1 page    # _% a+ R! _. v& @8 U2 d
  13.     for(i=0;i<0x100;i++)  u/ z3 L% p' o* o; j: G
  14.         HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, FLASH_USER_START_ADDR+i*8, 0xefcdab8967452301);( A! j5 E) ^! u' z1 }' m; V; V0 M4 h% w
  15.     HAL_FLASH_Lock();
    ( P$ `6 I+ Y* F7 ?+ E0 {# l
  16.     while (1)
    $ @0 ]# R# h, R- G- ]( d* W1 _
  17.     {8 u8 z8 f2 V0 O; [& T1 X6 @
  18. / i, l- h) I/ w4 ?
  19.     }
    * F% x0 J2 t$ T7 m% c: |4 J
  20. }
复制代码
效果嘛,就是把一页的数据都改写为0x012345678abcdef这种模式,因为ARM核是Little-Endian的,所以低字节在前,高字节在后:0 F$ L5 I5 O2 m0 h9 z. [$ s
4.png ; k% x; K8 a9 b6 {/ T$ T" {
不得不说,有ST Link Utility就是好,直接Dump Flash。
) W9 p' L# j+ @此外,可以看到刚好改写数据是1页:
7 k! p& Z0 m, n, O 5.png ) I1 b! G. W4 j$ ~9 f
因为0x2000-0x1800=0x800,也就是1 Page的大小。
& z+ Q5 z& z: Z7 W( U) X4 i( l- l1 J& P# G- ~8 y% G
9 R" d, d3 A% ~; `

/ @/ L, Z1 M* q4 a( v- @+ [& b2 f8 v' F5 |/ I
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
8 F" L2 V* {& U, B另外还有页设置的函数GetPage()是在哪个文件中定义的?我在编译时提示未定义。 ...

% l1 i  V  X; G啊,这个没复制进去。
0 I% ^4 u% K* w% s; Z一行代码:
2 w. h/ {( s9 l4 I. {
  1. static uint32_t GetPage(uint32_t Addr)* m. D- A! U; V. {) B4 s
  2. {
    . q; b" y) M3 U6 ]( @& D
  3.   return (Addr - FLASH_BASE) / FLASH_PAGE_SIZE;;
    : r) g( h# b% ^
  4. }
复制代码
STM1024 回答时间:2019-1-17 19:37:44
五哥1 发表于 2019-1-17 18:57! b! K1 X+ V1 v8 \4 d$ d
得一开发板,能换主控吗?|我爱单片机 - 数码之家 http://bbs.mydigit.cn/read.php?tid=2641715
" I$ c2 G* j3 l: R: e这个文章中 ...
  s+ S5 _7 a: r2 s) w- X5 j
这命名方式不太符合ST家的风格,而且目前从官网看,也就只有G070,G071,G081三个大系列。
! w: v+ o) |! [6 O$ o" F! c
STM1024 回答时间:2019-1-17 11:45:40
hujjj 发表于 2019-1-16 22:25
( W) H& `0 |3 [* I5 F& R感谢楼主分享!请教楼主HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD函数的这个参数怎么设置?另外要读 ...
  C- l5 ]  u+ z6 @+ Y4 e5 X/ H
这个可以参考HAL库的文档,我都是调用的HAL库函数
老牛洋车 回答时间:2019-1-16 22:25:17
感谢楼主分享!请教楼主HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD函数的这个参数怎么设置?另外要读取指定地址的数据该如何写代码?1 E1 O  c6 Q! k' O
9 d" z2 N! W  v  z0 b( M
谢谢!
$ h2 u! F) D4 Z  u7 s
老牛洋车 回答时间:2019-1-16 22:38:48
本帖最后由 hujjj 于 2019-1-17 17:24 编辑 ; i0 P3 ]1 w" q6 O& x: h

' m" f. F$ W. o& }3 n* n另外还有页设置的函数GetPage()是在哪个文件中定义的?我在编译时提示未定义。
* A: {% m0 n  q% J这个问题已经解决了,编译通过了。( \' ~3 O4 Y, _; p! O0 q
五哥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* S* j4 r, w1 ~6 [
听说,有最新的STLINK 是用STM32G系列的芯片的
9 t. H) J6 e, E7 M
额,这个还没见到过,不过一般用的好像都是F103C8T6
七哥 回答时间:2019-1-17 12:17:49
楼主厉害
" h: @  T) ]* T感谢分享
MrJiu 回答时间:2019-1-17 14:01:57
这个分析的仔细啊!!!
STM1024 回答时间:2019-1-17 14:13:40
MrJiu 发表于 2019-1-17 14:01. o/ \4 G9 i6 X) R3 `
这个分析的仔细啊!!!

! R; a6 w- U6 _7 g0 F3 @4 h大佬过奖了~
STM1024 回答时间:2019-1-17 14:14:02
toofree 发表于 2019-1-17 12:17! \# F% ]' W8 N' O3 v" p
楼主厉害 7 g8 f9 P. R# R$ g& x. K. t
感谢分享
7 `/ S3 M7 X* F9 n: h6 U
过奖了,学了点皮毛
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
- w7 p* Y8 M' l. F. B9 |& Y4 y这个文章中的,一位买了STLINK 主控是stm32gc102cb! G: B/ u/ C0 v' G2 b
12下一页

所属标签

相似分享

官网相关资源

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