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

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

[复制链接]
STMCU-管管 发布时间:2018-6-6 15:35
对于 STM32 用户,经常会涉及到通过用户启动程序实现对用户应用程序的更新升级。一般来讲,用户启动程序主要用来跟外界通信,获取新的用户程序代码并实现对用户代码区的应用程序升级。用户应用程序是指实现各种用户功能的代码。3 H0 h. @% L  t$ {
: e4 K, ~, _4 ?! Z, X* c
在这个过程中,往往需要做从用户引导程序区(以下简称【BOOT 区】)到用户应用程序区(以下简称【APP 区】)的跳转,有时可能还需实现从用户应用程序区跳回到用户启动程序区,甚至不同用户程序区的互相跳转等操作。在这些跳转过程中,常常有人的开发工作在此遇到阻碍,甚至破费周折。
$ Y/ u, [$ `  d: Z
' M% u! t& q% e5 K2 [STM32F0 代码区跳转
3 ~% g, ^& ^) V+ f$ l( H/ v- i! k, t0 {/ Y0 R
在此我们以 STM32F0 为例,就芯片内不同程序区的跳转问题做些交流与介绍,限于篇幅,这里仅直接介绍具体操作和注意事项,不做过多拓展介绍。相关知识点可阅读 STM32 芯片参考手册、STM32 相关内核编程手册。/ v6 ]1 Y5 t0 W- \

- j% t4 p/ y+ r+ ~下面介绍中提及的集成编译环境是指 ARM MDK,硬件基于 STM32F072RB Nucleo 开发板。
9 J1 Q: w( M2 ~( r; `2 J
7 f  q9 p7 w8 z& F$ J& e" [后面我将逐一介绍不同跳转操作的基本流程和注意事项,涉及以下三种情况:' G8 i/ w8 R( Z9 ]$ K5 R4 Z* x
1. 从【BOOT 区】跳转到【APP 区】: y2 ?! e8 ?: @
2. 从【APP 区】跳转到另外新【APP 区】1 M- @0 R, a) R' y1 p; B: B( z+ S
3. 从【APP 区】跳回【BOOT 区】% \$ C& a5 p: V6 G* _
0 T! S, G8 e* z/ `8 h; O& a, b, j
一般来讲,不同区段的执行代码我们通过建立不同的工程项目来实现,最终将不同区段执行代码写入芯片。这里假定 BOOT 区对应的内部 FLASH 地址段为 0x8000000—0x8004000,APP1 区对应的内部 FLASH 地址段为 0x8004000—0x8008000, APP2 区对应的内部 FLASH 地址段为 0x8008000—0x800C000.
4 F/ ?1 u4 V$ P; B8 s
1.png
从【BOOT 区】跳转到【APP 区】5 m* ^+ I0 ^: M1 D/ j+ a

1 u- @4 X( E- A8 e  {, B- ~7 D先说从 BOOT 区跳转到 APP 区。这个跳转代码比较简洁、简单,注意跳转前要关闭刚才程序区开启过的所有中断使能,保证所有中断请求位都被清除,不是简单的关闭总中断,否则往往隐患多多。BOOT 区相关跳转代码如下:  M2 _+ T1 l, I. E3 U- [
  1. If ( Jump_Condition Satisfied )2 s, ?, d/ y2 p* f9 _
  2. { if(((*(__IO uint32_t*)APPLICATION_ADDRESS_APP) & 0x2FFE0000) == 0x20000000)
    , s1 Q+ m0 v, Z3 U- j. a, U
  3. { /* Jump to user app */
    ' h3 V+ l. O% w+ `8 d
  4. JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS_APP + 4- t4 N* K' |+ Z+ w: y1 d
  5. JumpToApplication = (pFunction) JumpAddress;, ^$ G5 h8 \: B
  6. __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS_APP);
    7 G2 S. ?/ P' h
  7. JumpToApplication();! D' p/ O, K, K  |) t2 i6 i
  8. }
复制代码
这个从 BOOT 区到 APP 区的跳转最终能否成功,关键还是取决于 APP 区代码相关配置及准备工作。假设这里的 APP 区是上面提到的 APP1 区,内部 FLASH 地址段为 0x8004000—0x8008000,那么在 MDK 的 option 项里的 memory 配置板块要做正确配置,即 flash 空间与 ram 空间的配置,如下图所示:1 P8 Z; K" T; X! k: ]2 K$ \/ F
$ t: M4 s* F$ K0 D0 ?
2.png
7 Y4 v! i4 F- ~0 a  ]
IROM1 的配置就是 APP1 代码摆放的起始空间地址及长度。IRAM 的配置要注意先保留 48个字的空间用来存放中断矢量表的内容。因为 stm32F0 芯片的中断矢量表的大小就是 48个字(即 0xc0 字节)。至于剩下的内部 RAM 空间大小由芯片本身的 RAM 容量决定(这里是基于 STM32F072RB 芯片,其内部 RAM 总容量为 0x40000)。) j$ G& X4 w% R/ m( N3 e5 }0 q* d

8 @$ d3 C3 \" d/ G! K) i5 ^& U另外一件很重要的事情就是做中断矢量表的拷贝。在 APP1 区的 main()程序开头部分,将放在 flash 程序空间起始部分的连续 48 个中断矢量地址表拷贝到内部 RAM 的起始地址段。$ ^3 c) V3 g2 r, u0 H

; e6 J7 v* W4 F) ^5 [1 x% z即将矢量表从 0x8004000 地址开始拷到 0x20000000 开始的连续 48 个字空间(前面提到的存储配置正是为了配合这个拷贝操作)。基于 MDK 环境的参考代码如下:
( q. w# x. X( X$ z) {
" \) Y, Q8 g# W! N...
$ }/ o- B" a5 w
1 k9 V1 n# g7 w! s+ O了解更多,请下载后阅读4 w4 z% t" @6 u

$ ~3 S5 O7 g% @9 ?6 i下载地址1>>        下载地址2>>         更多实战经验>>
& ^$ O* q4 X( D8 B5 F! Q6 [2 o0 \
9 T7 c! V6 b  |, o% ]1 Z
收藏 评论0 发布时间:2018-6-6 15:35

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版