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

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

[复制链接]
STMCU-管管 发布时间:2025-3-26 13:24
01
前言
STM32CubeIDE的工程联调功能太好用了,特别是调试BOOT和APP的场景下,可以让大家清楚的看到程序是如何一步一步的从BOOT跳转到APP的,强烈的视觉冲击,让人眼前一亮,拨云见日,让bug无处遁形。
. N/ Y- _1 k, c/ Y' D  `" i
02
准备
刚好手上有一块STM32H563的NUCLEO板,那我们就基于该开发板来一步一步展现IAP工程联调的美妙吧。首先通过STM32CubeMX准备IAP的BOOT和APP的示例工程。2 H( P/ z4 Y' X

) U2 r( A0 S5 \, U! |  n

* b' m8 X2 u( {' d4 }, O/ T! b2.1. 制作BOOT工程/ m7 Z. x6 [( `7 i# G( ~

5 R( h+ g7 ~! e$ {

& W, z" j: Q) F$ W8 @BOOT工程我们准备了常规的LED点灯程序,我们使能了ICACHE,配置了外部按键中断(并使能中断),以及板子上的三个LED灯(GPIO output),如下图所示。
$ M6 j; U* @+ y" e5 h, @" N' Q. v5 K, D2 n% B7 F) X7 e% [

; B0 H1 y6 a6 {
12.png
▲ 图1. BOOT工程STM32CubeMX的配置

4 r# e8 w, R" n/ h. z8 T: E

, C; j9 q- b: I* p在生成的工程中,我们添加了按键检测,如果有按键按下,则进入IAP的跳转流程中,如下图所示。
" B1 \3 k/ n7 C+ @3 u& W6 p
7 f  y% K1 J* q3 S7 _; W/ R% T
# U# A1 m5 f9 G8 w
13.png
▲ 图2. BOOT工程中的跳转代码
, v" [* f+ E- n/ k/ G0 m+ X
8 I+ l3 L' Q& p1 X
上述代码涉及到的变量定义和函数的实现如下图所示:' j5 s, d* z1 p! N. ]- j5 ^- M1 O
14.png
▲ 图3. BOOT工程相关的变量定义和函数实现

+ P, v2 h  J1 c% {

8 g& ~0 i" V5 W+ @' i( F' U2.2. 制作APP工程# K4 e$ K( A" E2 s- n- D* Y
" ^! f8 y9 b3 f, F& [5 l3 G
APP工程的基本配置与BOOT工程完全一样,可以直接导入BOOT工程的STM32CubeMX的配置,故在此不重复展示。# ?3 ^' q7 K' x* o
* q! |6 @5 w4 i1 C# u" R; @+ ^

6 \& F* [! Q9 p在STM32CubeMX生成的工程中,APP工程还需要修改内存分散加载文件,以适配APP工程的内存偏移,如下图所示。
5 h) d0 X- {$ K7 w* X- c4 @0 h+ t7 }
# ~$ [9 S" c0 ^5 O
15.png
▲ 图4. 修改APP工程的内存分散加载链接文件

, w" I  K/ ?9 Q( r  K
3 j, k7 G% f& G- a  y
修改代码里中断向量表的偏移地址,如下图所示:
! }" Q; {  n8 N1 w* {
16.png
▲ 图5. 修改APP工程的中断向量表偏移值

/ i% r* I2 [( o/ Q% B
在APP的主循环中添加LD3的闪灯程序,如下图所示:2 b6 Y( b% l  G5 r$ K
4 B2 I0 k0 l$ u: I0 H7 }, q: a; A
% x- J% d) O. X( o. m
17.png
▲ 图6. APP工程的主循环

- V( b$ _# T9 G5 I1 x6 P( H; U8 \
03
调试配置

4 I* [3 o2 W2 U# y1 D3 v9 y" |
准备好工程后,接下来我们就可以配置BOOT工程的调试选项了。在BOOT工程的调试选项中,新增APP工程的调试配置,如下图所示:
0 Y# f8 g6 _) F, v# f8 d
18.png
▲ 图7. BOOT工程的Debug Configuration选项
/ \: S# t1 |, ]7 L& v: [# _% Y

5 y6 ?% T: |+ i& A, ?$ N注意:这里的Step5中,我们去掉了“Perform build”和“Download”两个选项,目的是仅仅加载APP工程的symbols,不需要重新编译和下载工程。如果勾选这两个选项,调试器建立连接时,会产生错误。
+ l6 i( c$ v6 A: O" @) s/ p5 v
( W# E( n7 B+ q

0 f5 G- ]( c/ Q$ R3 t添加完APP的调试配置后,会在BOOT工程的调试选项中看到如下图所示配置:
: X1 u  Q" P- A1 |7 h: T6 Y1 v$ v
" U! L) S: I4 o+ d
( ~( _$ U- ?8 g7 K5 k
19.png
▲ 图8. BOOT工程的完整选项
( J% j) n2 |- H3 h& {8 J

) e& v: M( C2 y: i在演示工程联调之前,我们先通过STM32CubeIDE下载APP的工程(在APP工程的Debug configuration中下载程序,或者通过STM32CubeProgrammer下载),然后再通过BOOT的调试选项进入到调试界面。( d: U: n2 D+ w8 v

: f6 y8 }+ f4 t! C2 [" C
. D) R1 Q. R. ^6 R+ i0 t
我们可以在BOOT工程中设置断点,同时也在APP的主循环中添加断点,然后运行程序,可以看到LD1在闪烁。
- C: Q3 M& P" y5 A- t+ \# z+ _
5 w7 U9 O& W/ _, ]6 K; W7 M7 S/ L  P
此时按下开发板的蓝色用户按钮,可以看到LD2也会点亮1秒钟,然后工程停在BOOT工程的断点处。. f0 ^9 {6 s/ `2 M$ i2 T9 ]

* Z. w% l$ a6 J& ]  }
  E; W2 v0 `- [4 A$ E+ H7 k
在调试界面,我们配置调试为汇编单步执行,如下图所示:
  C* d" r% x; g+ f
% @* x2 ]6 d3 k: L

* j: ^3 M; C$ p- r" i6 C) m
20.png
▲ 图9. 配置APP工程的汇编单步执行

0 R& s; k, k: M1 Y' l6 \* q

$ @. g4 ~9 d4 d8 e/ w' Y' G+ k. `" y" F这样我们就能清晰的看到程序从BOOT跳转到APP工程的Reset_Handler程序了。如果继续全速运行,可以看到LD1和LD2熄灭,LD3在间隔500毫秒闪烁。" g4 e2 M' P* Q7 z) d8 r& s
  v" M  Z, o! n' m2 \

. m/ |* D6 b5 H9 G/ y
04
小结
这里我列举出可能会出错的地方,方便大家顺利实验。
; L3 {6 N. w! {( b) U% X) [) s7 N2 H5 I7 B; V$ S7 p
3 M6 f% g6 C' |1 ^1 {, H0 |
1. 在准备好BOOT和APP的工程后,需要先通过STM32CubeIDE将APP的程序下载到开发板上。
# ~& e5 o- h* i  U+ E* W2. 本文档中的演示示例,BOOT工程在跳转到APP代码之前,需要失能ICACHE,因为在APP工程中,ICACHE的初始化函数如果判断到ICACHE是激活的话,会直接进入到错误处理函数,造成APP代码无法往后执行。& R: G# m6 c2 a' l8 h8 n
6 r6 I+ \0 U# D; S8 X7 @* N. _
收藏 评论0 发布时间:2025-3-26 13:24

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版