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

【实战经验】STM32F0 不同代码区跳转时总失败…这些操作你...

[复制链接]
STMCU-管管 发布时间:2018-6-6 15:35
对于 STM32 用户,经常会涉及到通过用户启动程序实现对用户应用程序的更新升级。一般来讲,用户启动程序主要用来跟外界通信,获取新的用户程序代码并实现对用户代码区的应用程序升级。用户应用程序是指实现各种用户功能的代码。
1 t$ Z! J) |, t9 z2 D+ f8 V
( |! l" g- S# Q: N9 X( q在这个过程中,往往需要做从用户引导程序区(以下简称【BOOT 区】)到用户应用程序区(以下简称【APP 区】)的跳转,有时可能还需实现从用户应用程序区跳回到用户启动程序区,甚至不同用户程序区的互相跳转等操作。在这些跳转过程中,常常有人的开发工作在此遇到阻碍,甚至破费周折。7 Q4 [, \% Q# ~- t
6 Z5 m$ k& ]* Z, V# K# v% g
STM32F0 代码区跳转
- S. f& A# m' y* z( J% _" x8 ~, B
在此我们以 STM32F0 为例,就芯片内不同程序区的跳转问题做些交流与介绍,限于篇幅,这里仅直接介绍具体操作和注意事项,不做过多拓展介绍。相关知识点可阅读 STM32 芯片参考手册、STM32 相关内核编程手册。
4 n9 U- z9 L* s* e$ j4 r
9 I) N! W% g7 a: Q: d/ P+ `下面介绍中提及的集成编译环境是指 ARM MDK,硬件基于 STM32F072RB Nucleo 开发板。
$ V' n  k# n7 ?* W- n0 k: Y6 p0 F1 d
后面我将逐一介绍不同跳转操作的基本流程和注意事项,涉及以下三种情况:7 W3 Y# f2 U, `
1. 从【BOOT 区】跳转到【APP 区】
2 M6 f- F* \9 m9 w1 z- Z( [2. 从【APP 区】跳转到另外新【APP 区】8 U9 v! @. @8 A3 Z  R# @
3. 从【APP 区】跳回【BOOT 区】' A5 H  N1 Q5 c' [8 o; A
6 }6 G1 c! @1 b' d
一般来讲,不同区段的执行代码我们通过建立不同的工程项目来实现,最终将不同区段执行代码写入芯片。这里假定 BOOT 区对应的内部 FLASH 地址段为 0x8000000—0x8004000,APP1 区对应的内部 FLASH 地址段为 0x8004000—0x8008000, APP2 区对应的内部 FLASH 地址段为 0x8008000—0x800C000.
. i% Q0 T6 U+ [1 K
1.png
从【BOOT 区】跳转到【APP 区】
9 {0 \) F# `- c  ?7 B- _' l' b& R6 r* R. Y/ `$ X: D
先说从 BOOT 区跳转到 APP 区。这个跳转代码比较简洁、简单,注意跳转前要关闭刚才程序区开启过的所有中断使能,保证所有中断请求位都被清除,不是简单的关闭总中断,否则往往隐患多多。BOOT 区相关跳转代码如下:8 Z  P: }; S+ W* h: o
  1. If ( Jump_Condition Satisfied )' m! ^8 b* T/ h# B, J3 r- q
  2. { if(((*(__IO uint32_t*)APPLICATION_ADDRESS_APP) & 0x2FFE0000) == 0x20000000)5 ?0 y2 v$ u" P; |* a
  3. { /* Jump to user app */, R% p7 X0 e# b( d- _
  4. JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS_APP + 4
    8 O+ v0 v% ?1 o3 R2 }: S% _# w8 ~
  5. JumpToApplication = (pFunction) JumpAddress;- O. `$ R3 d" O# |* E
  6. __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS_APP);1 D+ R$ v9 H* `# M7 z
  7. JumpToApplication();
    5 N3 a& L* x4 z2 m" d7 @
  8. }
复制代码
这个从 BOOT 区到 APP 区的跳转最终能否成功,关键还是取决于 APP 区代码相关配置及准备工作。假设这里的 APP 区是上面提到的 APP1 区,内部 FLASH 地址段为 0x8004000—0x8008000,那么在 MDK 的 option 项里的 memory 配置板块要做正确配置,即 flash 空间与 ram 空间的配置,如下图所示:; v& \/ Q, X$ ]" ?6 Y$ v

9 p- I% h- s% b. Z# Y" w5 Z
2.png

* F: Q9 U& M0 y* ]! c% nIROM1 的配置就是 APP1 代码摆放的起始空间地址及长度。IRAM 的配置要注意先保留 48个字的空间用来存放中断矢量表的内容。因为 stm32F0 芯片的中断矢量表的大小就是 48个字(即 0xc0 字节)。至于剩下的内部 RAM 空间大小由芯片本身的 RAM 容量决定(这里是基于 STM32F072RB 芯片,其内部 RAM 总容量为 0x40000)。' a# s9 r; R2 B6 c0 n( d

+ u1 C6 W! o/ a$ x- F/ _另外一件很重要的事情就是做中断矢量表的拷贝。在 APP1 区的 main()程序开头部分,将放在 flash 程序空间起始部分的连续 48 个中断矢量地址表拷贝到内部 RAM 的起始地址段。
& S" L2 w# O. L: {& @0 n/ J; J/ I' n( U$ N( M4 N! }
即将矢量表从 0x8004000 地址开始拷到 0x20000000 开始的连续 48 个字空间(前面提到的存储配置正是为了配合这个拷贝操作)。基于 MDK 环境的参考代码如下:* i. w) L+ \3 z# o  S
; e0 D! L% {& X8 N$ ^: G) N  G4 I9 `
...
- i6 M! v) g( c; [7 ^/ {! [( o+ K! k7 H/ Y+ {1 a  @# H
了解更多,请下载后阅读
8 O# g0 f4 l4 R! S3 X8 e* s
9 Q1 ^. S5 B# S! U4 Y下载地址1>>        下载地址2>>         更多实战经验>>6 w+ `  H7 H. c) G4 c
5 u. z% L( B4 [, H! z6 i1 j4 }
赞 收藏 评论0 发布时间:2018-6-6 15:35

举报

0个回答

所属标签

相似技术帖

官网相关资源

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