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

STM32G071评测:Flash

[复制链接]
STM1024 发布时间:2019-1-16 20:42
本帖最后由 stm1024 于 2019-1-18 11:15 编辑 # J2 g# P/ Q: B6 E3 e$ q5 V

1 p! q6 b/ U9 QFlash现已成为MCU的标配,Flash的特性在决定了MCU的一些功能,如代码大小、执行效率、FDU等。了解一款MCU的Flash显得很重要,这里测试一下G071的Flash。0 k# ^; w7 a# M, R( r5 x: {
先看看和F0存在的不同。flash的大小就没必要深究了,主要的区别如下:
' p/ ]( v8 t3 z! |. n8 F 2019-01-16_132545.png
4 ?  k9 I1 @0 X/ e1.指令缓存。Flash控制器含有一个8字节的预取指缓冲器和一个16字节的指令缓存。" f  b7 `1 t4 \  K
2.OTP区域。所谓的OTP,也就是one time programming,这个区域可以按双字方式写入数据,而且只能写一次,如果写入的数据有一个bit不为0,则以后这个区域就不可更改了,可用于存取非擦写的用户数据。* ^$ h9 @+ L% V' R
3.快速编程。官方给出的数据是22ms的擦除时间和写入每双字时间为82us。
% L( m9 e. V  B, r4.PCROP。这个是proprietary code readout protection的缩写,用于保护代码,其代码只能用来执行,而不能被读取或写入。至于Securable Memory,则是安全储存器,该区域不能被非安全区域外访问,/ @0 i9 x" y% W# Y
5.ECC。ECC是Error Correction and Checking,即错误检查和纠正。能检查2 bits的错误,并能纠正1 bit翻转错误。
. v4 O. S: n* X! s/ X; a- F
( G) c# V! ]& c- `再看看Flash的组织。见下图:. ^/ b( D3 r4 J+ w5 l4 R) u" D
2.png
) d6 t% u7 K- r5 }/ W4 \5 yFlash主要分为两块,分别是主块和信息块。主块就是常规使用的Flash,通常也是我们程序的入口地址,这一块可以随便使用。: O6 U/ }  s+ T) G9 R) j- D
而信息块则包含了系统储存器,OTP区域和选项字节,Flash的操作方式按下图:" ]1 j: W) [% z" J* x
3.png
; t$ H" u' a( f' _+ ~6 q编程需要一次写入8字节,也就是粒度为64bits(实际上是72bits,还有8bits的ECC)快速编程为256字节(仅支持Main Memory),快速编程因为不检查所写入的地址,因此比标准编程快了约37%。擦除可按2KB的页或者整个擦除(128KB),但花费的时间相当。
4 m5 f* k- p0 U2 X
& ]- L& ?/ g% d9 Z/ J& {9 o* s- Q在选项字节的配置上,和F0系列没有差别(或者我还没有发现)。
+ ^6 a4 E4 L& g$ u0 b
) g4 f5 |- c4 `% v$ E/ D: ?以下Flash编程测试代码:4 L7 r3 \6 L4 a5 d/ K: K2 M
  1. int main(void)
    ; Q, H$ l  ]$ ]7 n
  2. {6 \$ H) Q2 M3 z
  3.     uint16_t i;: }0 Z4 H/ u8 b- p. f! K
  4.     HAL_Init();
    ) o, {" ]5 M) O3 p+ s
  5.     SystemClock_Config();' g: b7 ~) L; _1 c
  6.     MX_GPIO_Init();
    7 M. G! K, [* _. @; ?: f
  7.     HAL_FLASH_Unlock();    9 F6 ^4 p0 |# i6 t/ I
  8.     EraseInitStruct.TypeErase   = FLASH_TYPEERASE_PAGES;
    ) W) Y* t! g) J& g
  9.     EraseInitStruct.Page        = GetPage(FLASH_USER_START_ADDR);
      N, L; K7 l2 C) m# h/ u% f5 J) ?
  10.     EraseInitStruct.NbPages     = 1;$ T' \# Y! Z, Z# y
  11.     HAL_FLASHEx_Erase(&EraseInitStruct, &PageError); - g+ C, I, g5 m/ Q! k' N9 A! K) T3 x
  12.     //8*256=2KB,1 page   
    1 J( e4 g& v/ c: j$ C& K/ l
  13.     for(i=0;i<0x100;i++)
    " b7 S8 k; f' Z7 H/ Z2 A
  14.         HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, FLASH_USER_START_ADDR+i*8, 0xefcdab8967452301);
    ) Z* k# R+ h! f* Q8 ^0 N2 N& V
  15.     HAL_FLASH_Lock();
    6 ~% u2 q6 m% G( M$ G2 `. Y- Y
  16.     while (1), _1 S! z) {) f% [/ M7 R
  17.     {
      N4 M( D8 F5 y, k9 D& r! x% U1 N
  18. 3 ~9 L+ ?# R- D8 n
  19.     }. R( }- t; v0 o  W
  20. }
复制代码
效果嘛,就是把一页的数据都改写为0x012345678abcdef这种模式,因为ARM核是Little-Endian的,所以低字节在前,高字节在后:
, P9 f7 i3 A3 H9 T 4.png . ?! J9 K: `4 e! a! ^9 |, U
不得不说,有ST Link Utility就是好,直接Dump Flash。
5 v8 ^' z0 Y: k- F! [此外,可以看到刚好改写数据是1页:
; _" c" \- C* v2 N- O 5.png 2 c, {+ w" O: y9 |: u% s
因为0x2000-0x1800=0x800,也就是1 Page的大小。4 s% }7 T) a& d. u1 _3 Y5 ?

* V/ ^7 a# r: L7 @8 U8 i4 {9 c. V5 z3 f0 A! j0 |4 F
8 @# B9 P& E% k* \* M

2 \; G6 j% _6 m
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& s/ Q" k7 W( |) y" \% n
另外还有页设置的函数GetPage()是在哪个文件中定义的?我在编译时提示未定义。 ...
: j" J, K5 W! z* E* m  p1 \
啊,这个没复制进去。
, i% D( Y  @) U& u+ U+ x6 @7 G一行代码:( G% c* v- t% ]6 d- u# A* _4 C
  1. static uint32_t GetPage(uint32_t Addr), w* l3 N) Y$ H1 L- A+ I; _; l0 ~; {
  2. {
    4 `# e2 S: m: d  L" V
  3.   return (Addr - FLASH_BASE) / FLASH_PAGE_SIZE;;1 U8 \" f8 R, F4 i  T8 K
  4. }
复制代码
STM1024 回答时间:2019-1-17 19:37:44
五哥1 发表于 2019-1-17 18:57, P2 {/ C* _+ q+ Y* y5 g/ b
得一开发板,能换主控吗?|我爱单片机 - 数码之家 http://bbs.mydigit.cn/read.php?tid=2641715
  ]) `- N* t7 S* A7 a) s- h# L这个文章中 ...

6 A( A; [+ b. \7 L" {. ~( N这命名方式不太符合ST家的风格,而且目前从官网看,也就只有G070,G071,G081三个大系列。( Q: d- Y! L- L& L
STM1024 回答时间:2019-1-17 11:45:40
hujjj 发表于 2019-1-16 22:25
( G' N& M; P$ m7 l; h感谢楼主分享!请教楼主HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD函数的这个参数怎么设置?另外要读 ...
$ X* ?; |4 l. z5 r; z
这个可以参考HAL库的文档,我都是调用的HAL库函数
老牛洋车 回答时间:2019-1-16 22:25:17
感谢楼主分享!请教楼主HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD函数的这个参数怎么设置?另外要读取指定地址的数据该如何写代码?
3 V3 o7 B) L" X) C4 o# l% f$ J, Z/ ?: W! ?
谢谢!0 o# l* v& d+ i8 a  X
老牛洋车 回答时间:2019-1-16 22:38:48
本帖最后由 hujjj 于 2019-1-17 17:24 编辑
9 r) M& ?$ j, f3 N( H/ t- ?; U0 d3 P" G7 j) M6 |8 y, F# [
另外还有页设置的函数GetPage()是在哪个文件中定义的?我在编译时提示未定义。
1 A" Z2 u0 C, D这个问题已经解决了,编译通过了。7 X) k: [' ^7 d5 h  z3 C* s0 B
五哥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
6 s. b+ X2 z% O! V' X8 C" g听说,有最新的STLINK 是用STM32G系列的芯片的

' R% @- w6 e- w/ G$ v, G3 P6 Z% W3 A1 ~额,这个还没见到过,不过一般用的好像都是F103C8T6
七哥 回答时间:2019-1-17 12:17:49
楼主厉害   i  H4 @% s( a7 E$ W! @' O8 P$ ^4 o
感谢分享
MrJiu 回答时间:2019-1-17 14:01:57
这个分析的仔细啊!!!
STM1024 回答时间:2019-1-17 14:13:40
MrJiu 发表于 2019-1-17 14:01
/ X' u* ^, H- U0 v: R! _  f3 V这个分析的仔细啊!!!
7 Q: y+ u3 K) ^
大佬过奖了~
STM1024 回答时间:2019-1-17 14:14:02
toofree 发表于 2019-1-17 12:17
* D  u% U7 r" o6 x- [# H楼主厉害 # u- X% c/ w4 S( r" _( x
感谢分享
! N( n, }( `  D% i2 x5 D! 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   J& y" D+ O- Y) C
这个文章中的,一位买了STLINK 主控是stm32gc102cb
2 U- o. }* U# M, v+ p
12下一页

所属标签

相似技术帖

官网相关资源

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