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

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

[复制链接]
STMCU-管管 发布时间:2025-3-26 13:24
01
前言
STM32CubeIDE的工程联调功能太好用了,特别是调试BOOT和APP的场景下,可以让大家清楚的看到程序是如何一步一步的从BOOT跳转到APP的,强烈的视觉冲击,让人眼前一亮,拨云见日,让bug无处遁形。
7 b2 |* Q$ P( S8 I5 \
02
准备
刚好手上有一块STM32H563的NUCLEO板,那我们就基于该开发板来一步一步展现IAP工程联调的美妙吧。首先通过STM32CubeMX准备IAP的BOOT和APP的示例工程。1 U4 @) D4 V# ^6 Q* i; U& a6 L

$ w! G( k1 _0 g; d6 f' r" g

+ _) C& u: F! b2.1. 制作BOOT工程
  |- s/ j1 z8 X# J2 a1 O) c1 g$ F$ _  e- t! H7 `

8 S; ^4 S9 D+ r/ ^+ `4 @7 DBOOT工程我们准备了常规的LED点灯程序,我们使能了ICACHE,配置了外部按键中断(并使能中断),以及板子上的三个LED灯(GPIO output),如下图所示。
, {% z7 G6 m5 a7 f6 w5 p5 V; O+ i$ g. `: k6 N, Z- E# g

( S- T- t) ?. ~
12.png
▲ 图1. BOOT工程STM32CubeMX的配置

1 ?: p) }0 Y$ D: l, b3 u
; f" d4 y# t8 k& e6 S: a
在生成的工程中,我们添加了按键检测,如果有按键按下,则进入IAP的跳转流程中,如下图所示。
9 {# S+ X0 P; `* S4 {  Q* B! g0 A5 O2 I; T3 P6 L

7 {1 y: B5 P! f& [- k- t
13.png
▲ 图2. BOOT工程中的跳转代码
7 z$ c9 K+ m: J/ s9 L
4 B9 y; S# i$ g
上述代码涉及到的变量定义和函数的实现如下图所示:
2 A4 x6 z8 L' f$ ^
14.png
▲ 图3. BOOT工程相关的变量定义和函数实现

3 i4 A9 r- j- A! b5 ?) ]

! D- e/ S$ m! N$ H" m2.2. 制作APP工程! l( A: W$ P7 x" L) \3 E1 N* w

6 `2 H1 C9 }! K. f8 u8 ?APP工程的基本配置与BOOT工程完全一样,可以直接导入BOOT工程的STM32CubeMX的配置,故在此不重复展示。" q! d* Z% |0 l* U
9 Q) H; y! {1 D

: j+ E  Y: k: ]/ O$ C在STM32CubeMX生成的工程中,APP工程还需要修改内存分散加载文件,以适配APP工程的内存偏移,如下图所示。
( u- Q( I; `7 S
$ S3 d1 S  r# m( P

/ P$ ~' ]8 o6 U3 k
15.png
▲ 图4. 修改APP工程的内存分散加载链接文件

' C! x7 w9 X8 F  X3 ^$ D+ P. I
9 S9 V4 C0 N6 f4 V
修改代码里中断向量表的偏移地址,如下图所示:
# x2 \. Z5 A2 U8 _& Y0 v
16.png
▲ 图5. 修改APP工程的中断向量表偏移值

: R+ `  d! {& f' Y( R, C
在APP的主循环中添加LD3的闪灯程序,如下图所示:3 k: y; `8 a- x+ g- {6 z0 M" H

7 E+ n+ w, v3 G: ~+ t. @

4 P9 d! {: v  o2 }/ H2 ?
17.png
▲ 图6. APP工程的主循环
! s% f. Q9 ~4 t( e+ a5 Z
03
调试配置
" H& i1 g- R5 ~7 C* t7 @
准备好工程后,接下来我们就可以配置BOOT工程的调试选项了。在BOOT工程的调试选项中,新增APP工程的调试配置,如下图所示:. ^2 I, m5 k3 W  a' x
18.png
▲ 图7. BOOT工程的Debug Configuration选项

7 `- D8 r4 T! j3 r! M3 R* Y

! A1 D$ g% ~7 [. e注意:这里的Step5中,我们去掉了“Perform build”和“Download”两个选项,目的是仅仅加载APP工程的symbols,不需要重新编译和下载工程。如果勾选这两个选项,调试器建立连接时,会产生错误。3 p0 L2 c4 T) p

5 S+ a* w  j: ]; t  J5 Q: F% H

5 Y6 R9 Q7 y0 ^- k$ D7 A9 F. y添加完APP的调试配置后,会在BOOT工程的调试选项中看到如下图所示配置:& P) ]& c/ L. a9 |! D9 t3 |' o- K
7 z- Z7 B) x3 p3 @, d

$ g: {! y7 O; `8 m& c
19.png
▲ 图8. BOOT工程的完整选项

% I* [, t& @% B/ r0 X

' o8 R6 ]) m0 p( ~在演示工程联调之前,我们先通过STM32CubeIDE下载APP的工程(在APP工程的Debug configuration中下载程序,或者通过STM32CubeProgrammer下载),然后再通过BOOT的调试选项进入到调试界面。" J. j( K# n" R  z7 |

% M1 b7 A# g2 y! k5 N2 S& E* n
! U' t3 a8 E1 E3 x$ M
我们可以在BOOT工程中设置断点,同时也在APP的主循环中添加断点,然后运行程序,可以看到LD1在闪烁。
1 ^2 I/ c! i& P( l1 T) V  E5 N9 l6 {+ }% ^( h  S% T

, h$ D0 |# S5 Z5 v此时按下开发板的蓝色用户按钮,可以看到LD2也会点亮1秒钟,然后工程停在BOOT工程的断点处。
* v& @0 b; \2 }! m# t( v/ M  Z! w( M2 U, O! n* e

. z+ A% B1 D  U- |/ S7 B在调试界面,我们配置调试为汇编单步执行,如下图所示:$ d4 b6 `/ F6 _

+ o7 J- R+ B  z. u

4 @' u7 B( O' U% m# J7 S% o( N
20.png
▲ 图9. 配置APP工程的汇编单步执行

3 p' q' T+ M& ]5 m" e& e: c- F3 P

4 ~) P% |0 Z2 h: C- T/ P5 W这样我们就能清晰的看到程序从BOOT跳转到APP工程的Reset_Handler程序了。如果继续全速运行,可以看到LD1和LD2熄灭,LD3在间隔500毫秒闪烁。* M& i" B* q; Z  ]) G- j

$ j  @2 e6 r3 w4 ~; u8 g/ K$ p
: X$ W+ L; s; r7 a7 o. T9 v- |
04
小结
这里我列举出可能会出错的地方,方便大家顺利实验。
2 r# g! H! ]  b, T* o9 t5 K- c3 H- B$ W' x
0 F2 v& L$ w2 l+ S4 j9 D
1. 在准备好BOOT和APP的工程后,需要先通过STM32CubeIDE将APP的程序下载到开发板上。
! L% H( E6 \& u2. 本文档中的演示示例,BOOT工程在跳转到APP代码之前,需要失能ICACHE,因为在APP工程中,ICACHE的初始化函数如果判断到ICACHE是激活的话,会直接进入到错误处理函数,造成APP代码无法往后执行。
# l/ j, Q) i1 Q0 ^7 N: P7 p
% X* [( i1 @4 e
赞 收藏 评论0 发布时间:2025-3-26 13:24

举报

0个回答

所属标签

相似技术帖

官网相关资源

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