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

STM32G071评测:Flash

[复制链接]
STM1024 发布时间:2019-1-16 20:42
本帖最后由 stm1024 于 2019-1-18 11:15 编辑 6 F& G2 ~! ~+ C* q2 Q
4 Q' V1 r/ u" `; X
Flash现已成为MCU的标配,Flash的特性在决定了MCU的一些功能,如代码大小、执行效率、FDU等。了解一款MCU的Flash显得很重要,这里测试一下G071的Flash。0 l& c' A, s' h, k7 c1 M8 @# Y7 J
先看看和F0存在的不同。flash的大小就没必要深究了,主要的区别如下:
' V% L- X% S" C8 ~ 2019-01-16_132545.png
$ e" ~- v: B# z& B0 ^1.指令缓存。Flash控制器含有一个8字节的预取指缓冲器和一个16字节的指令缓存。! o7 R" g+ m8 }+ w7 C
2.OTP区域。所谓的OTP,也就是one time programming,这个区域可以按双字方式写入数据,而且只能写一次,如果写入的数据有一个bit不为0,则以后这个区域就不可更改了,可用于存取非擦写的用户数据。
; I+ G/ i( g& B1 }* }  U# l3.快速编程。官方给出的数据是22ms的擦除时间和写入每双字时间为82us。
; M+ E" i; ^$ |# C4.PCROP。这个是proprietary code readout protection的缩写,用于保护代码,其代码只能用来执行,而不能被读取或写入。至于Securable Memory,则是安全储存器,该区域不能被非安全区域外访问,3 y5 h7 K3 s7 v
5.ECC。ECC是Error Correction and Checking,即错误检查和纠正。能检查2 bits的错误,并能纠正1 bit翻转错误。
6 ~8 U, Z! {: {) \0 L' b3 _0 d( \4 y  h+ p
再看看Flash的组织。见下图:
& [/ B0 J' J( I3 H 2.png
( k; u3 g+ R& LFlash主要分为两块,分别是主块和信息块。主块就是常规使用的Flash,通常也是我们程序的入口地址,这一块可以随便使用。  g0 B2 ?8 o+ G5 f1 W
而信息块则包含了系统储存器,OTP区域和选项字节,Flash的操作方式按下图:; u3 D2 e( C5 c' r0 ~; r
3.png
% e1 X2 P. Q" V4 S* T. U" h编程需要一次写入8字节,也就是粒度为64bits(实际上是72bits,还有8bits的ECC)快速编程为256字节(仅支持Main Memory),快速编程因为不检查所写入的地址,因此比标准编程快了约37%。擦除可按2KB的页或者整个擦除(128KB),但花费的时间相当。- C1 D* M% }) ~
. B7 d! ?$ n0 N: K, y
在选项字节的配置上,和F0系列没有差别(或者我还没有发现)。
4 c0 E  |9 l! w
, H) I/ a8 R  {" p以下Flash编程测试代码:# T  v4 `: q( G7 m  ^
  1. int main(void)7 c# _, N8 U1 _5 T: ~
  2. {4 F5 g, O5 ?0 D* {% q$ Z' M
  3.     uint16_t i;
    + c" @' z/ j, M( U
  4.     HAL_Init();
    * R. _/ E! W' l, _+ j
  5.     SystemClock_Config();! ~  n- L4 N% I7 J( ~, u7 Q
  6.     MX_GPIO_Init();
    & ^% y6 a8 O% u( g
  7.     HAL_FLASH_Unlock();   
    : G- o5 Y* k+ m+ v1 N: C8 b
  8.     EraseInitStruct.TypeErase   = FLASH_TYPEERASE_PAGES;
    ; h0 {/ u# y3 v" k. n5 E4 z6 [0 L
  9.     EraseInitStruct.Page        = GetPage(FLASH_USER_START_ADDR);. y3 ~! j. W# Y, ]6 N- a* W
  10.     EraseInitStruct.NbPages     = 1;
    ( N. U3 ^1 I" N3 O! J
  11.     HAL_FLASHEx_Erase(&EraseInitStruct, &PageError); ' r1 s0 S. V2 ~. Y8 b9 ?6 }
  12.     //8*256=2KB,1 page    * ^/ ?: A+ b; O, M, c/ \- {
  13.     for(i=0;i<0x100;i++)1 a4 }# j% {! p! e( t' s
  14.         HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, FLASH_USER_START_ADDR+i*8, 0xefcdab8967452301);
    6 v1 C7 V% Q& h' [: Q
  15.     HAL_FLASH_Lock();
    5 r* z( G2 L' H+ D
  16.     while (1); Y0 r5 @7 p, g; w8 V
  17.     {
    8 O3 G7 |) @7 b
  18. * Y% {2 z4 `# L9 [
  19.     }  u4 e. ^7 Z7 [9 @/ l# s0 `
  20. }
复制代码
效果嘛,就是把一页的数据都改写为0x012345678abcdef这种模式,因为ARM核是Little-Endian的,所以低字节在前,高字节在后:
' Z+ W8 R* N+ `# n/ b 4.png
6 q0 f( o5 R- P9 J7 b不得不说,有ST Link Utility就是好,直接Dump Flash。3 _2 T# z+ R( [4 p; f; r
此外,可以看到刚好改写数据是1页:7 Z/ a0 d5 v5 Y( |6 \, a& m$ T( L3 [
5.png
0 V" I% j- S# m4 K因为0x2000-0x1800=0x800,也就是1 Page的大小。1 P; [/ y& Z- _; u; g( H
; D, |- D- b5 M& C) `5 ?

* k& \2 [0 Y4 Z6 ?6 Y& N: y# n, X( s$ {7 B0 ~, `

0 w5 P- Z8 E7 E9 u9 K' C
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- Y" Z  q' r$ Y+ ^! P9 w+ B
另外还有页设置的函数GetPage()是在哪个文件中定义的?我在编译时提示未定义。 ...
. U3 U2 Z+ f9 L6 P, a8 m* M4 |
啊,这个没复制进去。" R& e0 J! N2 w2 C
一行代码:- L7 y1 Q) @+ E/ ]0 j4 W" D
  1. static uint32_t GetPage(uint32_t Addr)
    7 U$ \  b) E& p4 X4 ~8 J
  2. {
    ' @$ v( n, S$ a% }" N
  3.   return (Addr - FLASH_BASE) / FLASH_PAGE_SIZE;;
    & s0 [- D  F7 y; K0 t
  4. }
复制代码
STM1024 回答时间:2019-1-17 19:37:44
五哥1 发表于 2019-1-17 18:572 C% y5 D1 `1 ^5 P- d9 G( w" A# w9 f
得一开发板,能换主控吗?|我爱单片机 - 数码之家 http://bbs.mydigit.cn/read.php?tid=2641715
$ K+ \# \. G5 J& C  u这个文章中 ...

! C' B9 n  o  J9 {3 k4 l+ t这命名方式不太符合ST家的风格,而且目前从官网看,也就只有G070,G071,G081三个大系列。( F' Z, r9 C2 m/ U+ r
STM1024 回答时间:2019-1-17 11:45:40
hujjj 发表于 2019-1-16 22:25/ P9 Z* _4 t; I. k! o# x
感谢楼主分享!请教楼主HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD函数的这个参数怎么设置?另外要读 ...
" U" d& ]+ Z3 k$ m
这个可以参考HAL库的文档,我都是调用的HAL库函数
老牛洋车 回答时间:2019-1-16 22:25:17
感谢楼主分享!请教楼主HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD函数的这个参数怎么设置?另外要读取指定地址的数据该如何写代码?
6 U8 R) q! m" O+ n. S" C$ G' W
9 r; I3 `& u# |' v谢谢!
; j0 M" e+ v) i" u0 X+ F' x/ p
老牛洋车 回答时间:2019-1-16 22:38:48
本帖最后由 hujjj 于 2019-1-17 17:24 编辑 9 k9 H1 H, X" j! j
% Z3 p- l* B+ F/ ~# X0 g3 `
另外还有页设置的函数GetPage()是在哪个文件中定义的?我在编译时提示未定义。8 M: r4 E4 F. ^$ w. k9 z8 |4 P
这个问题已经解决了,编译通过了。* Y3 I) Q+ b+ e/ L* z! J9 |, x
五哥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
' U2 w3 }4 R1 R- j0 ^. ~9 U6 d4 B) u听说,有最新的STLINK 是用STM32G系列的芯片的
; c# l+ e" W0 b! M
额,这个还没见到过,不过一般用的好像都是F103C8T6
七哥 回答时间:2019-1-17 12:17:49
楼主厉害
" A' R1 |7 E$ f% P9 l感谢分享
MrJiu 回答时间:2019-1-17 14:01:57
这个分析的仔细啊!!!
STM1024 回答时间:2019-1-17 14:13:40
MrJiu 发表于 2019-1-17 14:019 }8 |. l0 C* N
这个分析的仔细啊!!!
% D: t2 B6 {: Z- g; }7 P
大佬过奖了~
STM1024 回答时间:2019-1-17 14:14:02
toofree 发表于 2019-1-17 12:17$ v2 C& L6 C2 H/ {' `
楼主厉害
9 w9 y3 n0 c) k5 V* ~5 r2 Q3 Y1 y感谢分享
( D8 G$ m/ }: |. M
过奖了,学了点皮毛
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
2 j3 B9 _4 {" H; h2 q) ?) {8 v( m0 h这个文章中的,一位买了STLINK 主控是stm32gc102cb1 S5 w$ V# [2 L- M+ `
12下一页

所属标签

相似技术帖

官网相关资源

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