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

STM32G0 快速编程要点

[复制链接]
STMCU小助手 发布时间:2022-7-31 22:21
前言
# K4 `: ]& D4 f% K0 r% G在一些新的 STM32 系列中,比如 STM32L4、STM32G0、STM32G4 等,除了 Flash 标准编程之外,还可以支持 Flash 的快速编程,那么对于 STM32G0 来说,在使用快速编程时,有哪些需要注意的地方呢?! s! d7 @# c! B0 K- t% \

4 P& t" C+ k1 G4 |& |7 C

3 m' p% x: z& Z+ l# M# J2 n问题 8 E6 e! J6 s; m" ]0 k4 u" O
某客户在其产品的设计中,使用了 STM32G070RBT6。客户希望在进行代码升级的时候使用快速编程来提高编程速度,但是在写代码中遇到很多问题,而在目前的 STM32G0 的 Cube 库中并没有 FLASH_FastProgram 例程,所以客户希望得到一个参考例程来加速他的设计。
$ r8 V$ l! B/ M  U' z1 L0 p& f
: j) z8 F+ R8 q6 P* y6 _  u+ ?
8 _) m) y: \: |2 ], M" l) s
调研 2 j  C( ]9 ^# O: e# C/ @2 |
1.了解问题
! X' t+ d3 s) z6 A; Z) N, [/ U检查最新版本的 STM32Cube_FW_G0_V1.3.0/Projects/STM32CubeProjectsList.html 文件,确实可以看到在现有的STM32G0Cube 库中并没有 FLASH_FastProgram 例程,所以学习一下参考手册,参考\STM32Cube_FW_L4_V1.16.0\Projects\NUCLEO-L452RE\Examples\FLASH\FLASH_FastProgram 例程,对\STM32Cube_FW_G0_V1.2.0\Projects\NUCLEO-G070RB\Examples\FLASH\FLASH_EraseProgram 进行修改以移植代码。6 v9 q5 u8 d# a% I0 S0 |! U
在撰写例程代码的时候,确实会遇到一些需要注意的问题,下面简单地介绍一下。0 U( K( c- `. y6 \
2.分析问题
# e, A, a% |4 [7 k. E) w$ I首先,先来看一下 STM32L4 中 FLASH_FastProgram 例程中 readme.txt 对本示例的解释,可以看到这是一个演示如何配置和使用 API 函数对内部 Flash 存储器进行擦除和快速编程的示例。
0 o, N+ @" M5 I/ {9 r- z0 o先来看一下 FastProgram 最核心的函数 FLASH_Program_Fast()。 在 STM32L4Cube 中的 stm32l4xx_hal_flash,它是这么定义的:1 F) M2 J, u/ d( Z/ }1 g" Y
  1. static void FLASH_Program_Fast(uint32_t Address, uint32_t DataAddress)
复制代码
, Q2 Y2 {+ I* `7 R" O5 k
而在 STM32G0Cube 中的 stm32g0xx_hal_flash,它是这么定义的:
+ Q( U6 m& E% `; s) H* X
  1. static __RAM_FUNC void FLASH_Program_Fast(uint32_t Address, uint32_t DataAddress)
复制代码

" y) _5 ~& i! O什么区别呢?就是在 STM32G0Cube 库中使用了__RAM_FUNC 指明了这个函数是位于 RAM 区域的。为什么呢?! Q- C+ A8 _% y# A/ r& y
第一个要点:对 Flash 进行快速编程的时候不允许对 Flash 进行读取,所以需要将这个快速编程的代码放置于 RAM 中运行,以避免对 Flash 进行命令读取。
$ @4 e; |. f; w那么,大家可能又有疑问了,那为什么 STM32L4Cube 中并没有使用__RAM_FUNC 关键字,STM32L452 的 Flash 是 single bank,难道它就不需要放到 RAM 里边了吗?但是大家如果细心的话,可以看到 STM32L4 这个例程中的链接文件是 stm32l452xx_sram.icf,在 icf 文件中定义了 ROM 的地址为 0x20000000~0x20015FFF,也就是说这个示例代码是跑在 RAM的,所以就不需要在这边使用__RAM_FUNC 关键字了。还可以在 STM32L4 示例代码中看到对整片 Flash 进行擦除而猜到这一点。& }3 W" h; T& E9 K# b6 j2 X* Y
从 STM32G0Cube 库中 FLASH_Program_Fast()这个函数的定义,可以看出它是可以直接使用 stm32l452xx_flash.icf 将快速编程核心代码以外的其他代码都放在 Flash 上面跑的,这个可能更符合用户做 IAP 升级的习惯,当然,在这个情况下,我们就可能需要在程序中使用页擦除而不是整片擦除了。
  J2 U6 }1 \& W3 E' G第二个要点:因为 Flash 进行快速编程的时候不允许对 Flash 进行读取,所以还需要注意快速编程的源数据应该位于 RAM 而 非 Flash,以避免对 Flash 进行数据读取。因为在 Flash 快速编程的时候,需要将 64 个 word 一个行(256 Bytes)的数据写到目标地址中,所以也就是说在快速编程的时候,还会去访问源数据,如果源数据放在 Flash 就会导致问题产生。- Q/ o- n; ^9 [. }: g2 g" w
所以,在这边聊一个移植中遇到的问题。
- p% h% k" c% f
! _, q6 G: b" A3 v0 d' _; [: I

3 D  T/ T( l1 z2 B. h, c( }" j
+ K% y! m/ Z" F% ]+ R' E

; H4 o, \! T% h# I1 g" `  b完整版请查看:附件* Y/ d# e/ J% B: |5 K  J
3 x& N  E. e$ k- w% e' x/ j; {# n

8 D. l, V5 `' A$ h% {' }! ^- i

STM32G0使用快速编程的要点_V1.pdf

下载

258.7 KB, 下载次数: 12

赞 收藏 评论0 发布时间:2022-7-31 22:21

举报

0个回答

所属标签

相似技术帖

官网相关资源

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