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

STM32F0 不同代码区跳转时总失败…这些操作你做对了吗?

[复制链接]
STMCU小助手 发布时间:2022-8-2 19:45
对于 STM32 用户,经常会涉及到通过用户启动程序实现对用户应用程序的更新升级。一般来讲,用户启动程序主要用来跟外界通信,获取新的用户程序代码并实现对用户代码区的应用程序升级。用户应用程序是指实现各种用户功能的代码。
! u+ C8 Z& @$ U4 S& h' ^4 }' I9 V* ]在这个过程中,往往需要做从用户引导程序区(以下简称【BOOT 区】)到用户应用程序区(以下简称【APP 区】)的跳转,有时可能还需实现从用户应用程序区跳回到用户启动程序区,甚至不同用户程序区的互相跳转等操作。在这些跳转过程中,常常有人的开发工作在此遇到阻碍,甚至破费周折。
, }. c1 ?  J: S( f) W- X, S5 U" Q- d. t5 H! [

) R5 q* D1 T* r; i. i# fSTM32F0 代码区跳转* G* C; {4 O5 V6 O5 A
在此我们以 STM32F0 为例,就芯片内不同程序区的跳转问题做些交流与介绍,限于篇幅,这里仅直接介绍具体操作和注意事项,不做过多拓展介绍。相关知识点可阅读 STM32 芯片参考手册、STM32 相关内核编程手册。& j: y2 j& ~2 [: R  G
下面介绍中提及的集成编译环境是指 ARM MDK,硬件基于 STM32F072RB Nucleo 开发板。
( Z, e* ^6 B3 R7 t: a后面我将逐一介绍不同跳转操作的基本流程和注意事项,涉及以下三种情况:( j) {, q, D3 R5 B4 u- M# V6 K" W
 从【BOOT 区】跳转到【APP 区】 $ W! r( D8 D# q# _- `- z
 从【APP 区】跳转到另外新【APP 区】
6 O* D3 e" V7 D; D0 ` 从【APP 区】跳回【BOOT 区】
3 a1 ^$ S! L, j/ |! Y: p' K一般来讲,不同区段的执行代码我们通过建立不同的工程项目来实现,最终将不同区段执行代码写入芯片。这里假定 BOOT 区对应的内部 FLASH 地址段为 0x8000000—0x8004000,APP1 区对应的内部 FLASH 地址段为 0x8004000—0x8008000, APP2 区对应的内部 FLASH 地址段为 0x8008000—0x800C000.4 L1 h6 |  h5 b4 M. i
# g$ k+ q7 C/ K7 ~- {4 h
R~3%B{2Q1211G7IV@GYNEUC.png 2 C! R! \' p) O1 F  @) j

/ p' }! t% o1 m! V% g- W) q  o

; k8 b& f4 I" w5 p  g; W4 j% U从【BOOT 区】跳转到【APP 区】
; R$ r7 Q6 R1 z& y8 M  C- F先说从 BOOT 区跳转到 APP 区。这个跳转代码比较简洁、简单,注意跳转前要关闭刚才程序区开启过的所有中断使能,保证所有中断请求位都被清除,不是简单的关闭总中断,否则往往隐患多多。BOOT 区相关跳转代码如下:' Q" S- p' W4 |% V
If ( Jump_Condition Satisfied )  V5 c. M# @% K6 m
{ if(((*(__IO uint32_t*)APPLICATION_ADDRESS_APP) & 0x2FFE0000) == 0x20000000)
- {4 l( U& \( F" t0 d* c  X9 ] { /* Jump to user app */
: l# }. N$ n1 k( q JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS_APP + 47 s, }8 N  D( Y; G8 l% ~7 Z% ^& W
JumpToApplication = (pFunction) JumpAddress;
9 S8 P  Q* ?' O) p, R8 D __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS_APP);
8 J7 {. A/ {  h& u+ \' O JumpToApplication();1 V: R' d1 M5 e; p0 c& E# Q
}
( ?7 C+ N0 `0 R9 v; ]6 {这个从 BOOT 区到 APP 区的跳转最终能否成功,关键还是取决于 APP 区代码相关配置及准备工作。假设这里的 APP 区是上面提到的 APP1 区,内部 FLASH 地址段为 0x8004000—0x8008000,那么在 MDK 的 option 项里的 memory 配置板块要做正确配置,即 flash 空间与 ram 空间的配置,如下图所示:
" C5 `/ O  u4 v! o# f
; h8 C" q" l% q, |6 u: \5 {% w

& I) W& d3 V) @$ @; {. E 3(3C}H`EFI6U22)73L{P{3D.png : U4 Q; J" Z6 M* ~' _

2 T* s' y; }8 a5 {! h

0 k& T+ g% g/ C" D" \! B' UIROM1 的配置就是 APP1 代码摆放的起始空间地址及长度。IRAM 的配置要注意先保留 48个字的空间用来存放中断矢量表的内容。因为 stm32F0 芯片的中断矢量表的大小就是 48个字(即 0xc0 字节)。至于剩下的内部 RAM 空间大小由芯片本身的 RAM 容量决定(这里是基于 STM32F072RB 芯片,其内部 RAM 总容量为 0x40000)。' S7 r& l) X1 P! ^- H  s
另外一件很重要的事情就是做中断矢量表的拷贝。在 APP1 区的 main()程序开头部分,将放在 flash 程序空间起始部分的连续 48 个中断矢量地址表拷贝到内部 RAM 的起始地址段。 即将矢量表从 0x8004000 地址开始拷到 0x20000000 开始的连续 48 个字空间(前面提到的存储配置正是为了配合这个拷贝操作)。基于 MDK 环境的参考代码如下:! ~& j7 Y) Z0 }* ]/ W. x) N" |2 J
#define APPLICATION_ADDRESS4 (uint32_t)0x080040007 n. Q! y: n$ f1 z/ C
__IO uint32_t VectorTable[48] __attribute__((at(0x20000000)));& r9 y' a* t3 P- K4 T3 j% z
int main(void)
' L- u1 M0 ^  Q) m) {+ ]% E{ HAL_Init();# j0 j* m7 f, G* a
SystemClock_Config();7 K" |- J$ F9 D& c
for(i = 0; i < 48; i++), ~% \, p* Y( b7 G; p! g. g/ s0 G
{ VectorTable= *(__IO uint32_t*)(APPLICATION_ADDRESS4 + (i<<2)); }
% k) `4 m  {" D /* Enable the SYSCFG peripheral clock*/ __HAL_RCC_SYSCFG_CLK_ENABLE(); //使能 SYSCFG 外设6 l. P6 l; ]  Y3 U" n& h5 \" `& f
__HAL_SYSCFG_REMAPMEMORY_SRAM();//将内部 SRAM 映射到 0x00000000 地址
; X0 R" [1 @: | 。。。。。。 后面为用户功能代码。。。。。。
: A8 G2 Q8 ^) u& W. I. P. T$ L1 |* |# ?
上面代码中绿色语句就是实现中断矢量表从内部 flash 到内部 RAM 的拷贝,而红色语句则是为了实现将程序执行的 0 地址域的重映射,即将程序运行的 0 地址从内部 flash 的 0x8000000 通过重映射机制切换到 0x20000000,为的是在 APP1 区发生中断时 CPU 能从正确的地方准确获取相应中断矢量地址去执行中断服务程序。
/ V& v! C$ n- f- q到此,从 BOOT 区跳转到 APP1 区就算完成了。
+ v; o9 q! l! d
5 T# j# I' _5 T. z9 T1 g完整版请查看:附件
. S9 s# q" C" a7 g8 Q3 }( x$ ^7 ^4 v4 D  e) Q
' [5 r/ |# J: u

+ z. _' a0 q9 k3 @5 z# I

Jumping topic about different procedure code zone based on STM32F0.pdf

下载

565.26 KB, 下载次数: 1

赞 收藏 评论0 发布时间:2022-8-2 19:45

举报

0个回答

所属标签

相似技术帖

官网相关资源

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