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

实战经验 | STM32CubeIDE实用技巧之工程联调

[复制链接]
STMCU-管管 发布时间:2025-3-26 13:24
01
前言
STM32CubeIDE的工程联调功能太好用了,特别是调试BOOT和APP的场景下,可以让大家清楚的看到程序是如何一步一步的从BOOT跳转到APP的,强烈的视觉冲击,让人眼前一亮,拨云见日,让bug无处遁形。; o$ v& m3 R/ J
02
准备
刚好手上有一块STM32H563的NUCLEO板,那我们就基于该开发板来一步一步展现IAP工程联调的美妙吧。首先通过STM32CubeMX准备IAP的BOOT和APP的示例工程。0 h0 ]$ g7 n' F
. ], s" g' o$ j: ]# ~) {
4 R$ [- [$ m: ?, _9 N4 ?5 _
2.1. 制作BOOT工程" @& l# R+ J- G: W% E3 i; |; {+ R
" q+ L1 a9 f/ g. I& Q
: q; m/ R/ V. g* B" C4 r. d! O
BOOT工程我们准备了常规的LED点灯程序,我们使能了ICACHE,配置了外部按键中断(并使能中断),以及板子上的三个LED灯(GPIO output),如下图所示。
- }% r3 I& V" N) D" O( C- l. G' B; {+ I

$ T4 n& t- U5 r0 M/ r: b
12.png
▲ 图1. BOOT工程STM32CubeMX的配置
; |$ d0 ]* ]9 O

* n$ V. C: Z0 {0 P在生成的工程中,我们添加了按键检测,如果有按键按下,则进入IAP的跳转流程中,如下图所示。6 Q5 q. r) E2 N5 y. j
3 B( s2 R$ u9 G8 L3 |# [: I

- A/ t1 S6 g; R* f6 e+ p
13.png
▲ 图2. BOOT工程中的跳转代码

" d; ~- R3 c3 k* Q$ k( c0 V

$ L) |" e/ }( W5 e上述代码涉及到的变量定义和函数的实现如下图所示:0 l7 R# W) R9 d( A# a' }6 [9 G
14.png
▲ 图3. BOOT工程相关的变量定义和函数实现

1 e/ E1 e- A. \+ a* ?: q/ [

! B( D+ Z& U# _* W/ @- G2.2. 制作APP工程
; \% a) S, C" s% S, l5 `$ `% X' X  a4 m, D6 Z6 S
APP工程的基本配置与BOOT工程完全一样,可以直接导入BOOT工程的STM32CubeMX的配置,故在此不重复展示。
5 i: P2 w* O- l1 G8 f# o( \; y" F

3 `9 P9 A( h' ]1 ]' `在STM32CubeMX生成的工程中,APP工程还需要修改内存分散加载文件,以适配APP工程的内存偏移,如下图所示。
8 z7 x2 s# @; u+ U
  ?, `$ d0 l4 S  M0 ~/ D6 C. T: p2 Y
; h% T6 s( w7 `7 v7 k
15.png
▲ 图4. 修改APP工程的内存分散加载链接文件
4 s5 P  Q6 {8 X. z* l

7 h4 X0 x% G) W4 u' V# Z+ R* u+ D# T修改代码里中断向量表的偏移地址,如下图所示:! u3 E" f$ a, s; I/ P% _% @
16.png
▲ 图5. 修改APP工程的中断向量表偏移值
& u/ T. t- }/ `; Z' k/ [: \
在APP的主循环中添加LD3的闪灯程序,如下图所示:
; ]3 y2 l' K  H6 ]+ h! {
) @* g1 i% k% a( h' C

: T0 R8 y  q6 E( M
17.png
▲ 图6. APP工程的主循环
" Q3 ^+ e' Z. U
03
调试配置

& h/ _6 J; s5 M' W
准备好工程后,接下来我们就可以配置BOOT工程的调试选项了。在BOOT工程的调试选项中,新增APP工程的调试配置,如下图所示:! F* G7 H5 R$ x( }( ?
18.png
▲ 图7. BOOT工程的Debug Configuration选项
/ K3 ?0 M2 k& l" b; s

% ^' Q! g( [) M5 k- d, Z注意:这里的Step5中,我们去掉了“Perform build”和“Download”两个选项,目的是仅仅加载APP工程的symbols,不需要重新编译和下载工程。如果勾选这两个选项,调试器建立连接时,会产生错误。
0 E5 }: K& u$ F3 w# x/ `! C4 y
; q# j4 p# O6 ^
添加完APP的调试配置后,会在BOOT工程的调试选项中看到如下图所示配置:
  q/ k  e' J8 \2 _  R: j7 k( x
: E; S& d6 M% n4 ~9 E' O* k1 K
3 n% M6 x+ O7 W
19.png
▲ 图8. BOOT工程的完整选项

! O! D5 p  b9 ~4 ~. A6 ~

' n) i6 p% p9 K5 S( z1 ]在演示工程联调之前,我们先通过STM32CubeIDE下载APP的工程(在APP工程的Debug configuration中下载程序,或者通过STM32CubeProgrammer下载),然后再通过BOOT的调试选项进入到调试界面。
! Z% H  z5 n7 ~! a
: `; F4 j6 k- I( H: P

% T9 s3 l: B9 [4 t$ ^: [9 ~我们可以在BOOT工程中设置断点,同时也在APP的主循环中添加断点,然后运行程序,可以看到LD1在闪烁。8 [( z! ]( V& S0 M/ @& s

2 }# E+ \& n' \" c0 J4 ~

" P6 D7 v3 Q1 {9 C此时按下开发板的蓝色用户按钮,可以看到LD2也会点亮1秒钟,然后工程停在BOOT工程的断点处。4 J/ @2 L9 ], R) g  a9 p! `

8 D5 y2 q) g; }3 B. y, a$ N  P8 X

2 j0 ]! A) E! S* L" m在调试界面,我们配置调试为汇编单步执行,如下图所示:. f& x8 V/ S. k/ r9 C8 @2 g& l
' z$ c& i2 s/ ?( ^) r+ \/ H
* A, ~" H' o: w" o+ y  T* C" E
20.png
▲ 图9. 配置APP工程的汇编单步执行

& _) B  v' S' k6 o: J# P# k; j. q
; k5 S6 W  Z" k% X6 X1 R  p2 x
这样我们就能清晰的看到程序从BOOT跳转到APP工程的Reset_Handler程序了。如果继续全速运行,可以看到LD1和LD2熄灭,LD3在间隔500毫秒闪烁。
6 w+ V  g+ w- L8 O& X7 b, N  v, e' _$ Y7 {: U

5 {5 _2 K( @# _! F7 Y: l- l
04
小结
这里我列举出可能会出错的地方,方便大家顺利实验。! E0 }+ b& S/ R6 N2 L% a4 }; W' f

$ I. X( a, l7 d& z" Z, Q7 M
3 I: O  S1 m: c7 P* Q& Y) P& G
1. 在准备好BOOT和APP的工程后,需要先通过STM32CubeIDE将APP的程序下载到开发板上。. w3 t. y4 {" z$ q( \! }3 p
2. 本文档中的演示示例,BOOT工程在跳转到APP代码之前,需要失能ICACHE,因为在APP工程中,ICACHE的初始化函数如果判断到ICACHE是激活的话,会直接进入到错误处理函数,造成APP代码无法往后执行。
# M( T8 v) c9 ?  h
( L$ J3 ?7 N4 C: O' @" S
赞 收藏 评论0 发布时间:2025-3-26 13:24

举报

0个回答

所属标签

相似技术帖

官网相关资源

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