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

STM32G071评测:Flash

[复制链接]
STM1024 发布时间:2019-1-16 20:42
本帖最后由 stm1024 于 2019-1-18 11:15 编辑 ' p/ P; A/ W# i  l
" w/ D5 n/ h+ @/ S  K8 i% n
Flash现已成为MCU的标配,Flash的特性在决定了MCU的一些功能,如代码大小、执行效率、FDU等。了解一款MCU的Flash显得很重要,这里测试一下G071的Flash。6 t, x9 i. `2 A( A9 P1 y- S$ W
先看看和F0存在的不同。flash的大小就没必要深究了,主要的区别如下:! i- A( _1 d; s7 _; B* t. V
2019-01-16_132545.png / T. Q* w6 Y% ?, G- n
1.指令缓存。Flash控制器含有一个8字节的预取指缓冲器和一个16字节的指令缓存。
$ @# E2 Z( F" P% u! P9 j2.OTP区域。所谓的OTP,也就是one time programming,这个区域可以按双字方式写入数据,而且只能写一次,如果写入的数据有一个bit不为0,则以后这个区域就不可更改了,可用于存取非擦写的用户数据。8 L" O) d) ^5 M' @5 j2 z
3.快速编程。官方给出的数据是22ms的擦除时间和写入每双字时间为82us。# g: _( I0 s- k3 [6 g3 q/ @
4.PCROP。这个是proprietary code readout protection的缩写,用于保护代码,其代码只能用来执行,而不能被读取或写入。至于Securable Memory,则是安全储存器,该区域不能被非安全区域外访问,
- J, \! c6 h) R% q8 L0 s5 X5.ECC。ECC是Error Correction and Checking,即错误检查和纠正。能检查2 bits的错误,并能纠正1 bit翻转错误。
/ p: I) F# W& d  O, M- F2 {$ N/ h8 {
再看看Flash的组织。见下图:
6 f5 Q  U7 x- i+ K1 r 2.png " u, j- P1 E' P+ N+ b# w5 c
Flash主要分为两块,分别是主块和信息块。主块就是常规使用的Flash,通常也是我们程序的入口地址,这一块可以随便使用。
7 h6 {6 v4 U) ?& B而信息块则包含了系统储存器,OTP区域和选项字节,Flash的操作方式按下图:5 }, P% c3 a1 l6 w7 C* Y& f
3.png " Y0 j' u9 U: N" v
编程需要一次写入8字节,也就是粒度为64bits(实际上是72bits,还有8bits的ECC)快速编程为256字节(仅支持Main Memory),快速编程因为不检查所写入的地址,因此比标准编程快了约37%。擦除可按2KB的页或者整个擦除(128KB),但花费的时间相当。
" Y$ }, t0 o5 b6 Q) k7 C1 H
! i1 b8 Q. D* e4 N$ ~在选项字节的配置上,和F0系列没有差别(或者我还没有发现)。3 K) U% M/ Q" Z5 e4 u4 F/ ]) z' V, |
8 ~) T& w; `- f4 n0 @8 D, w
以下Flash编程测试代码:+ o- U: }& Z+ A: D. ?7 Z
  1. int main(void)) t( G! `& ^5 D
  2. {" `0 o) l: y% ]. E$ v) }$ w
  3.     uint16_t i;
    ; V! W( D2 p" C. ]5 M9 K+ }  m9 r5 W
  4.     HAL_Init();8 \; }- m! O& o# Z( b0 |, F* m6 P! e
  5.     SystemClock_Config();9 @4 j( j! q" m+ D
  6.     MX_GPIO_Init();+ J# m5 J0 K. [: Y
  7.     HAL_FLASH_Unlock();    ' N) x$ Y. _8 K4 B8 U) a# n
  8.     EraseInitStruct.TypeErase   = FLASH_TYPEERASE_PAGES;
    1 U# b1 G6 a+ k. A" s9 ?! _
  9.     EraseInitStruct.Page        = GetPage(FLASH_USER_START_ADDR);' P2 }  w0 V& Q4 _( k, I. b
  10.     EraseInitStruct.NbPages     = 1;
    & c: g! H* t! h: c# [
  11.     HAL_FLASHEx_Erase(&EraseInitStruct, &PageError);
    ' L5 E" k; Y$ q/ y
  12.     //8*256=2KB,1 page   
    5 C7 h7 b3 V7 g7 F2 N- F2 G% x
  13.     for(i=0;i<0x100;i++)- @- |7 H. M& x( i" b
  14.         HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, FLASH_USER_START_ADDR+i*8, 0xefcdab8967452301);
    + g0 ~( u7 f* D
  15.     HAL_FLASH_Lock();8 W) R* R3 B7 l# k4 ^2 g2 q
  16.     while (1)
    . H3 w. U& l( l. ], N
  17.     {
    + o# o2 ?6 o% {9 \
  18. 1 A5 K" j. x+ x) K; z
  19.     }& b9 H% R, i9 {+ K, X0 w" K% P% \( n
  20. }
复制代码
效果嘛,就是把一页的数据都改写为0x012345678abcdef这种模式,因为ARM核是Little-Endian的,所以低字节在前,高字节在后:, J! e0 V( z, Z( i
4.png 5 S( @6 Y* {- n0 t; D! m
不得不说,有ST Link Utility就是好,直接Dump Flash。) v5 ~- d# w( A+ a$ {
此外,可以看到刚好改写数据是1页:1 S, y2 T  G0 P4 H
5.png
, w9 Y& p# M/ T9 }* {因为0x2000-0x1800=0x800,也就是1 Page的大小。5 j1 a* W9 p  o9 t: P! H8 A
6 \* @6 {( _$ K3 z8 U/ Z

7 K8 R" O. I5 C% ?. Y8 t: P* w% t( P( e, f
- u1 e7 e6 Y1 N( X! ~; R
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
# g4 k; e  T( t5 z" g8 U另外还有页设置的函数GetPage()是在哪个文件中定义的?我在编译时提示未定义。 ...

  F! L1 B7 u7 {# d: J+ H& s啊,这个没复制进去。; [) }+ b+ [% l! {# X) ]' G# T& v
一行代码:
1 K$ @- k: t5 v
  1. static uint32_t GetPage(uint32_t Addr)
    8 S. H- N8 V0 n9 O8 v
  2. {
    2 G. H" R% f( Y2 I
  3.   return (Addr - FLASH_BASE) / FLASH_PAGE_SIZE;;4 P0 ~( S2 V& k
  4. }
复制代码
STM1024 回答时间:2019-1-17 19:37:44
五哥1 发表于 2019-1-17 18:57
1 g' H! v; R7 f, ^- s  q6 E% G- \' a( k得一开发板,能换主控吗?|我爱单片机 - 数码之家 http://bbs.mydigit.cn/read.php?tid=2641715
; S. o$ |. m3 M0 H  b2 n这个文章中 ...

5 W3 T$ }# s0 U  l这命名方式不太符合ST家的风格,而且目前从官网看,也就只有G070,G071,G081三个大系列。# w9 h' k3 b+ r, l4 h' l* }
STM1024 回答时间:2019-1-17 11:45:40
hujjj 发表于 2019-1-16 22:25* E8 Q6 N7 \% I# r- L0 i& q
感谢楼主分享!请教楼主HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD函数的这个参数怎么设置?另外要读 ...
. |: k6 L, j3 V4 G# {6 i1 @
这个可以参考HAL库的文档,我都是调用的HAL库函数
老牛洋车 回答时间:2019-1-16 22:25:17
感谢楼主分享!请教楼主HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD函数的这个参数怎么设置?另外要读取指定地址的数据该如何写代码?' J; E$ I/ d1 U6 z+ g$ r

' y5 m% x9 l7 E! C% ^, G谢谢!
4 ]0 k9 j+ w3 V( f( }
老牛洋车 回答时间:2019-1-16 22:38:48
本帖最后由 hujjj 于 2019-1-17 17:24 编辑 6 Q/ F# B3 f5 ~5 C( B. `% p/ _
2 Y0 ^  U6 ~' B9 Y$ o
另外还有页设置的函数GetPage()是在哪个文件中定义的?我在编译时提示未定义。1 l3 S* y$ n% W1 u& y! k) U7 N' G
这个问题已经解决了,编译通过了。
8 }3 s/ i# O  I" {. I; J
五哥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
7 B. [+ p3 ?" L$ _4 Z1 ^听说,有最新的STLINK 是用STM32G系列的芯片的
( [$ y: k  e* O  M5 P) P
额,这个还没见到过,不过一般用的好像都是F103C8T6
七哥 回答时间:2019-1-17 12:17:49
楼主厉害   y8 y$ @( d" ^8 g, r/ e
感谢分享
MrJiu 回答时间:2019-1-17 14:01:57
这个分析的仔细啊!!!
STM1024 回答时间:2019-1-17 14:13:40
MrJiu 发表于 2019-1-17 14:01
/ I+ m( h7 {# u5 \3 y; Q4 }这个分析的仔细啊!!!

7 N9 v0 ?: K/ S* \* d) b3 k6 ^) k8 N大佬过奖了~
STM1024 回答时间:2019-1-17 14:14:02
toofree 发表于 2019-1-17 12:17
8 p, i. D& S4 s! ~' b# Y# l楼主厉害 + Z0 V0 r6 G' ~4 \" `
感谢分享

/ m( t3 N* Y. i$ t( x5 e: W0 E过奖了,学了点皮毛
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 & B/ b( d9 Q& _) ~
这个文章中的,一位买了STLINK 主控是stm32gc102cb
3 R' c" m( j# ]
12下一页
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版