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

STM32G071评测:Flash

[复制链接]
STM1024 发布时间:2019-1-16 20:42
本帖最后由 stm1024 于 2019-1-18 11:15 编辑
3 C/ F$ M+ G; t1 ^: `1 p& E
* @# d  N- m' b& {Flash现已成为MCU的标配,Flash的特性在决定了MCU的一些功能,如代码大小、执行效率、FDU等。了解一款MCU的Flash显得很重要,这里测试一下G071的Flash。1 O: @, i3 x6 N3 [( v  @) J
先看看和F0存在的不同。flash的大小就没必要深究了,主要的区别如下:
7 B% m3 U4 U" Q 2019-01-16_132545.png
6 V! ~7 q: J3 M4 Q5 [! V' \5 J5 B' n1.指令缓存。Flash控制器含有一个8字节的预取指缓冲器和一个16字节的指令缓存。
& j  F1 Q; \# i3 `: _# s2.OTP区域。所谓的OTP,也就是one time programming,这个区域可以按双字方式写入数据,而且只能写一次,如果写入的数据有一个bit不为0,则以后这个区域就不可更改了,可用于存取非擦写的用户数据。9 |& g; g! v3 h* b8 N
3.快速编程。官方给出的数据是22ms的擦除时间和写入每双字时间为82us。5 D4 m" V5 g8 g
4.PCROP。这个是proprietary code readout protection的缩写,用于保护代码,其代码只能用来执行,而不能被读取或写入。至于Securable Memory,则是安全储存器,该区域不能被非安全区域外访问,; e6 A6 o1 ^( G
5.ECC。ECC是Error Correction and Checking,即错误检查和纠正。能检查2 bits的错误,并能纠正1 bit翻转错误。- A5 I2 S1 m/ L7 A5 H, Q0 P7 y# p

' v9 U; d) n% o7 x再看看Flash的组织。见下图:
8 K, m% p/ M1 e. y( z. V5 q$ q 2.png ! L; u6 ^  ]: r7 M+ N" ]
Flash主要分为两块,分别是主块和信息块。主块就是常规使用的Flash,通常也是我们程序的入口地址,这一块可以随便使用。6 y. B* J  \) [9 b
而信息块则包含了系统储存器,OTP区域和选项字节,Flash的操作方式按下图:
" z  o4 c) R" Z4 K  i 3.png
! O8 @) ?$ I0 E  X* i编程需要一次写入8字节,也就是粒度为64bits(实际上是72bits,还有8bits的ECC)快速编程为256字节(仅支持Main Memory),快速编程因为不检查所写入的地址,因此比标准编程快了约37%。擦除可按2KB的页或者整个擦除(128KB),但花费的时间相当。/ z9 H, p5 y8 E: X
0 t, B4 ?, F7 y8 T; F  t# n6 F
在选项字节的配置上,和F0系列没有差别(或者我还没有发现)。
! S9 }0 f! i1 q
& N$ e3 _" I; O9 O以下Flash编程测试代码:
4 ]( a, \5 U- h; y/ E
  1. int main(void)
    - v! h' b5 Z  q! B# D
  2. {: n+ H' P  N# ?$ h( U
  3.     uint16_t i;6 _( K2 s. i+ y) A4 i- Y
  4.     HAL_Init();
    7 g  W$ {7 H6 z' X
  5.     SystemClock_Config();
    4 O( t( ~+ X+ Y* F' G0 M+ ^2 H
  6.     MX_GPIO_Init();8 m& ?" G# P& N
  7.     HAL_FLASH_Unlock();    + F- \0 s& g% l" ]; U1 l+ l  P* E
  8.     EraseInitStruct.TypeErase   = FLASH_TYPEERASE_PAGES;. z/ ?$ E+ i) L4 F4 E! Y
  9.     EraseInitStruct.Page        = GetPage(FLASH_USER_START_ADDR);
    % B' \0 h, w) ]# [
  10.     EraseInitStruct.NbPages     = 1;* i; S% j3 g/ e% l, J% f
  11.     HAL_FLASHEx_Erase(&EraseInitStruct, &PageError); , z0 J" k8 y" E- k2 ?9 X+ ~
  12.     //8*256=2KB,1 page   
    8 z, i* D) t' N: Y% u( z9 e% Y
  13.     for(i=0;i<0x100;i++)( J; g  z! H9 {9 u
  14.         HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, FLASH_USER_START_ADDR+i*8, 0xefcdab8967452301);8 c3 T  S8 e) W( c5 b0 _' l, W; m" v
  15.     HAL_FLASH_Lock();6 a8 E; t3 L# m/ c9 s1 `0 |6 R3 K
  16.     while (1)
    6 M+ h5 ^6 \5 E# J" b% A5 g
  17.     {
    # v( \) b- \5 A0 d5 l, \

  18. 2 e+ B. v7 L8 t, w" ?
  19.     }5 W& @0 m% L/ q7 q' R
  20. }
复制代码
效果嘛,就是把一页的数据都改写为0x012345678abcdef这种模式,因为ARM核是Little-Endian的,所以低字节在前,高字节在后:  ?4 w1 M  u7 a5 q
4.png 1 g1 G  t1 \0 c8 @2 j& m1 S, O* I5 F
不得不说,有ST Link Utility就是好,直接Dump Flash。& [0 p) f  k' E1 C6 ~0 E3 D
此外,可以看到刚好改写数据是1页:7 i$ v8 J( ]/ n; x/ A6 I. w) s
5.png
, N( F# w3 i5 n0 Q4 a2 z因为0x2000-0x1800=0x800,也就是1 Page的大小。
  Y; A8 i1 a& u1 o0 [+ y) y/ u/ Z- G. B* O4 |6 C
2 }" A7 |: v7 t

3 o  T, f5 B1 \, p% R7 ~. F! c' `
+ Z8 F) _+ p1 ^  ^8 l
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
3 K$ Q( p6 Q0 z% e# l$ b! R6 x另外还有页设置的函数GetPage()是在哪个文件中定义的?我在编译时提示未定义。 ...
  w; M  N* n4 ?9 N) O: g" E: D
啊,这个没复制进去。/ B- `7 }" m. M- P
一行代码:
$ u9 Z- z" D4 f4 K/ l' t
  1. static uint32_t GetPage(uint32_t Addr). }  F' U  S+ m$ B6 V
  2. {
      W* E5 v! V, N. i7 e3 \
  3.   return (Addr - FLASH_BASE) / FLASH_PAGE_SIZE;;, f1 y$ |  _1 W  v; J$ n
  4. }
复制代码
STM1024 回答时间:2019-1-17 19:37:44
五哥1 发表于 2019-1-17 18:57
1 J$ v5 C: k# T( [$ C: o/ x. k: m! C得一开发板,能换主控吗?|我爱单片机 - 数码之家 http://bbs.mydigit.cn/read.php?tid=26417155 S2 a4 r! Z8 ]. o+ W( w# C; G# s
这个文章中 ...

$ A1 L$ L" L7 {0 s& w/ A这命名方式不太符合ST家的风格,而且目前从官网看,也就只有G070,G071,G081三个大系列。+ |% ?+ ~( u! c/ a; V) B% n0 c
STM1024 回答时间:2019-1-17 11:45:40
hujjj 发表于 2019-1-16 22:25
2 _- U8 r$ u9 p) F- E感谢楼主分享!请教楼主HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD函数的这个参数怎么设置?另外要读 ...

6 |+ G! Z+ e0 }1 A& F这个可以参考HAL库的文档,我都是调用的HAL库函数
老牛洋车 回答时间:2019-1-16 22:25:17
感谢楼主分享!请教楼主HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD函数的这个参数怎么设置?另外要读取指定地址的数据该如何写代码?4 W1 ?2 V- i; @. l5 S
& l. x% X" Q; R- U# N# h6 D
谢谢!
5 M- c2 a. K. o+ C; i
老牛洋车 回答时间:2019-1-16 22:38:48
本帖最后由 hujjj 于 2019-1-17 17:24 编辑
7 W* t7 Q& y* Q1 t6 y, x' _; a0 N9 W% {+ {2 H* ~) Z
另外还有页设置的函数GetPage()是在哪个文件中定义的?我在编译时提示未定义。6 E2 u6 M- h' e9 P2 k
这个问题已经解决了,编译通过了。
% U5 |6 s- z2 y% O0 |; U1 K. Z5 ^- O
五哥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: ?* R0 s7 M. w2 s
听说,有最新的STLINK 是用STM32G系列的芯片的
) M3 p3 W& [8 {2 c4 n. J
额,这个还没见到过,不过一般用的好像都是F103C8T6
七哥 回答时间:2019-1-17 12:17:49
楼主厉害 : ?( l' H( a+ b1 f# V
感谢分享
MrJiu 回答时间:2019-1-17 14:01:57
这个分析的仔细啊!!!
STM1024 回答时间:2019-1-17 14:13:40
MrJiu 发表于 2019-1-17 14:01! Y5 O2 S" a9 u
这个分析的仔细啊!!!

7 ^7 i. T4 J5 d6 A! l4 m  k5 E大佬过奖了~
STM1024 回答时间:2019-1-17 14:14:02
toofree 发表于 2019-1-17 12:17
; ^8 [( K$ I# i% C2 n  q/ P  i楼主厉害
' g7 L. q9 R2 T( U, j, \感谢分享

! U' l" s5 w( r- d1 C) B过奖了,学了点皮毛
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
  |5 I0 ^0 X: ^# M+ H这个文章中的,一位买了STLINK 主控是stm32gc102cb
* W/ m+ P6 R  l2 ]) B! g
12下一页

所属标签

相似分享

官网相关资源

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