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

【经验分享】关于STM32G0B1CCT6的flash内存使用注意事项

[复制链接]
STMCU小助手 发布时间:2021-11-8 15:15
STM32G0B1CCT6是相对比较新的MCU,属于G系列,不支持标准库,所以下文用的是hal库或者ll库。

9 e# R. k- f  J9 \5 U# h1 I. n
" L  u6 ~( q6 q3 x1 x+ }9 {2 T: ^6 z首先STM32G0B1CCT6是有256kflash的,每页2k,而规格书里面只提到0-63page,相当于128kflash。
! n3 G7 D% t$ M4 R, c9 p2 o对于后128k的flash其实需要切换bank2才能使用。8 l3 H" ~: G( @% S' A
下图为STM32G0B1CCT6的flash构成
: `! H8 Q) a( J# c
9e9d9cd5e964425dbe9403edb8b70e89.png
! F" R( k! X) w% P( Y
; x& u, {  a3 s1 n7 |4 |
然后我们先看正常如果要擦除第一页的代码
. ]5 h% [2 R: V/ h/ C- g3 C
  1. FLASH_EraseInitTypeDef My_Flash; //声明 FLASH_EraseInitTypeDef 结构体为 My_Flash1 ]8 ]3 i$ R, \( _8 A( {4 i! P
  2. uint32_t PageError = 0; //设置PageError,如果出现错误这个变量会被设置为出错的FLASH地址( q% E- ?9 g/ a% ?8 l

  3. " j6 i. t8 m# [# X4 f6 c  n
  4. HAL_FLASH_Unlock();+ {0 U0 l+ _" @) }

  5. * |: J( F& t' M7 E! \! o- A
  6. My_Flash.TypeErase = FLASH_TYPEERASE_PAGES; //标明Flash执行页面只做擦除操作# h7 L3 N7 p& t- g8 r
  7. My_Flash.Page = 0; //声明要擦除的页
    . k) z* Z* V3 i) o: l  m
  8. My_Flash.NbPages = 1; //说明要擦除的页数,此参数必须是Min_Data = 1和Max_Data =(最大页数-初始页的值)之间的值
    + ?, T% a2 l0 J) a- I, U: M6 b
  9. My_Flash.Banks = FLASH_BANK_1;/ P& a; s9 e0 i9 {8 g
  10. ) ]4 P0 r, R; p& i' Q& a
  11. //调用擦除函数0 S) `5 d, D4 d3 z# `5 i
  12. if(HAL_FLASHEx_Erase(&My_Flash, &PageError) == HAL_OK)4 S$ D. v) @; x9 {7 C7 a
  13. {! @; _2 ]  Q% I+ ?) w% ]
  14. //3、对FLASH烧写: a9 Y3 b1 c' x, \- W3 s
  15. //MEM_WRITE(FLASH_SYSTEM_DATA_ADDR, buf, 5);
    9 D2 T1 s9 \2 s4 L9 Q4 @
  16. }: g. h) ^: g# D
  17. //4、锁住FLASH# W2 J* i) ~* o$ |
  18. HAL_FLASH_Lock();
复制代码
$ b0 `/ d  q- J
当我们要擦除后128k的第一页的时候,即第64页时,需要把FLASH_BANK_1切换到FLASH_BANK_2) z2 O8 r, m1 x
不能直接在FLASH_BANK_1声明擦除第64页,切换到FLASH_BANK_2后,相应的页数为总页数减64页。
; e9 `" |# U- \% N" m) ~( k9 d
  1. FLASH_EraseInitTypeDef My_Flash; //声明 FLASH_EraseInitTypeDef 结构体为 My_Flash
    ! D1 j- ^3 d3 J% ?2 W
  2. uint32_t PageError = 0; //设置PageError,如果出现错误这个变量会被设置为出错的FLASH地址/ g0 T! X" Y0 R# p9 W' e

  3. 8 E" d5 v- |( ?  m$ C) g7 _- |3 z
  4. HAL_FLASH_Unlock();
    & z& m$ K$ q6 e2 R
  5. & E3 b* {2 e& h. P7 i# W7 F
  6. My_Flash.TypeErase = FLASH_TYPEERASE_PAGES; //标明Flash执行页面只做擦除操作
    ) l0 Y! e1 Z( K( |
  7. My_Flash.Page = 0; //声明要擦除的页' L2 ^5 ]( Z# y3 [, ]$ R
  8. My_Flash.NbPages = 1; //说明要擦除的页数,此参数必须是Min_Data = 1和Max_Data =(最大页数-初始页的值)之间的值
      }- v2 H0 z" q# k" H+ p9 {
  9. My_Flash.Banks = FLASH_BANK_2;, _# A: i6 {- J

  10. & q# v2 M5 B/ G" v# V$ N" i* D. [
  11. //调用擦除函数
    3 \' n) v8 t* L- O' ^' i
  12. if(HAL_FLASHEx_Erase(&My_Flash, &PageError) == HAL_OK)
    ! ^7 ]$ Q- c4 Y9 }6 v/ W$ Y5 S
  13. {! ~) R' C0 m5 Q. d, K
  14. //3、对FLASH烧写$ F* M! ^, F+ r+ T( U8 g% c9 b
  15. //MEM_WRITE(FLASH_SYSTEM_DATA_ADDR, buf, 5);# ^- z. U% \. g( |  [! y5 {# `
  16. }
    ; Y6 i- s" |; g  x4 ^
  17. //4、锁住FLASH! Q" q- M+ o, `& D: E' z% v
  18. HAL_FLASH_Lock();
复制代码

* n3 s4 r: E8 w' m* y/ e- ^' h0 P) C" I% A6 f# @8 q1 V  X
最后再附上一个ST-programmer和iar的一个小bug。我将这些问题均已反馈到原厂了。
0 \: `5 {+ s: u  s/ L2 S1、如果ST-programmer要单独擦除后128k是擦除失败的,因为软件本身没有切换bank2& _" f) C) l% z5 U
2、IAR烧录时该次使用到了后128k,则也是擦除失败导致烧录失败。第一次烧录成功,但是从第二次开始需要擦除到相应flash时,擦除失败就无法下载了(keil应该也是一样)
" q$ ^" W8 ?, n- [5 T4 s& A
! L! m& f: F! z! N+ q3 I3 f& H# ?; |) K& P+ g6 a* Q7 S% W

( ?' S$ P1 C( q* F. y" K+ a" N
收藏 评论0 发布时间:2021-11-8 15:15

举报

0个回答

所属标签

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