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

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

[复制链接]
STMCU-管管 发布时间:2025-3-26 13:24
01
前言
STM32CubeIDE的工程联调功能太好用了,特别是调试BOOT和APP的场景下,可以让大家清楚的看到程序是如何一步一步的从BOOT跳转到APP的,强烈的视觉冲击,让人眼前一亮,拨云见日,让bug无处遁形。/ Y1 s  }5 h1 ^# j+ J( u4 {# F
02
准备
刚好手上有一块STM32H563的NUCLEO板,那我们就基于该开发板来一步一步展现IAP工程联调的美妙吧。首先通过STM32CubeMX准备IAP的BOOT和APP的示例工程。
4 u4 F6 s8 j! K9 S
+ Q( l0 n) ^! }

$ H8 B7 ]7 R1 t( x3 ?0 W0 Z( U- s: ~) s2.1. 制作BOOT工程; m, U6 k+ J* \# O3 h5 T3 B
& E* e) O" a, P$ Z/ U; A3 u
- t' O( d1 z; H
BOOT工程我们准备了常规的LED点灯程序,我们使能了ICACHE,配置了外部按键中断(并使能中断),以及板子上的三个LED灯(GPIO output),如下图所示。
, o3 S. h- y. @! ~
/ M) N  ?- l' n' T/ ~# G1 b& o
2 `1 J$ V' C! Z; n# x
12.png
▲ 图1. BOOT工程STM32CubeMX的配置
! t  J; D( p) d  n# i+ B1 B% I) @
) S! K+ N, ^% Q0 n! N
在生成的工程中,我们添加了按键检测,如果有按键按下,则进入IAP的跳转流程中,如下图所示。- h! A1 \1 g5 C- a& [. R

6 u0 }* h) y+ X) T6 c' u
) E% x6 ?& P; w+ Q4 Y3 ]/ s
13.png
▲ 图2. BOOT工程中的跳转代码
. u% S9 S( D( }/ v" f( T

3 N4 P6 j% Q, o" [" {; d. L上述代码涉及到的变量定义和函数的实现如下图所示:. G. f/ Z. y1 V3 D6 j
14.png
▲ 图3. BOOT工程相关的变量定义和函数实现
8 m  Z/ e/ O5 L4 |: D6 _
. J, j" I4 |# i
2.2. 制作APP工程
, L' t+ D) k& g7 `, d4 T: W4 T. K
4 Y! C) C) w! s# A  {/ U3 AAPP工程的基本配置与BOOT工程完全一样,可以直接导入BOOT工程的STM32CubeMX的配置,故在此不重复展示。! L* {3 P9 G% [5 ?8 G; O

% F- e  v! J9 h2 F( s
9 Z9 L6 ]; t7 U8 b+ x" _1 g
在STM32CubeMX生成的工程中,APP工程还需要修改内存分散加载文件,以适配APP工程的内存偏移,如下图所示。; ^% l1 h$ k0 w1 G$ T. Y/ P, x/ K& \
* k5 g- [: V) W6 f# x% p

) k0 {- u8 y' l9 A/ u" h1 Y% U5 v
15.png
▲ 图4. 修改APP工程的内存分散加载链接文件
# _5 ]: k( W6 b0 Y
  k5 }( @! N7 f7 @' J
修改代码里中断向量表的偏移地址,如下图所示:, J) V( }, J9 P  E! j8 \) X
16.png
▲ 图5. 修改APP工程的中断向量表偏移值
) J4 g: h% B  k0 @- h+ |8 [
在APP的主循环中添加LD3的闪灯程序,如下图所示:# c8 C/ W& l& h% m+ a7 A
% u, ^* t5 y9 @' Y0 C, h$ L# Z

4 d# G1 O8 `# p, p
17.png
▲ 图6. APP工程的主循环

4 V3 L! d1 ]3 X- |6 V3 G* \
03
调试配置

+ t; U9 ~# G! a2 T
准备好工程后,接下来我们就可以配置BOOT工程的调试选项了。在BOOT工程的调试选项中,新增APP工程的调试配置,如下图所示:1 o! O; O" v3 _1 H
18.png
▲ 图7. BOOT工程的Debug Configuration选项
- d7 i$ M" s6 x# X. P. I3 u# P
3 ^& y; o0 [* r4 B/ _. Z. |3 p
注意:这里的Step5中,我们去掉了“Perform build”和“Download”两个选项,目的是仅仅加载APP工程的symbols,不需要重新编译和下载工程。如果勾选这两个选项,调试器建立连接时,会产生错误。
4 R% z1 e8 e5 t" v" v3 g* t1 L2 r" S. g- t2 G% c) d+ p

  z7 w' Y6 F, [' M3 l( t3 ?添加完APP的调试配置后,会在BOOT工程的调试选项中看到如下图所示配置:8 v8 t* M# E* e, u2 h

) C) k# r: ]' w7 ]" G4 \3 X

* e: U4 e& }% L5 c$ P, N
19.png
▲ 图8. BOOT工程的完整选项
+ l! p1 ~8 X/ |2 g. m4 V  \1 D

* F1 [+ Q1 T1 B0 U4 f( i( B在演示工程联调之前,我们先通过STM32CubeIDE下载APP的工程(在APP工程的Debug configuration中下载程序,或者通过STM32CubeProgrammer下载),然后再通过BOOT的调试选项进入到调试界面。% p6 F* N! s+ P
$ ], X$ f0 w$ K8 E, S7 A2 }

$ R5 c. S3 H7 R" L" e9 |我们可以在BOOT工程中设置断点,同时也在APP的主循环中添加断点,然后运行程序,可以看到LD1在闪烁。0 _: n/ [! X$ \9 G* b9 V
, F5 u5 K6 X" c* ^/ B

, b; ]. ?6 O' G此时按下开发板的蓝色用户按钮,可以看到LD2也会点亮1秒钟,然后工程停在BOOT工程的断点处。( l' J! e# x2 D

$ E/ X: {' @! u& U

  L4 t0 O- O- t: d# t$ |, h在调试界面,我们配置调试为汇编单步执行,如下图所示:1 P8 A. u7 i( S  u
$ W6 y  U4 ?- k1 P+ m

. m3 {4 `0 ]+ n) m
20.png
▲ 图9. 配置APP工程的汇编单步执行
% c2 \% Z; m' e# S2 z
' t7 G  M* Y. Q" v) A
这样我们就能清晰的看到程序从BOOT跳转到APP工程的Reset_Handler程序了。如果继续全速运行,可以看到LD1和LD2熄灭,LD3在间隔500毫秒闪烁。  k; h% R1 s* ]  t* y
' ~  F2 g& @+ s6 Z. a
* P; k1 E( m+ A3 k
04
小结
这里我列举出可能会出错的地方,方便大家顺利实验。9 y  B. O  y5 \4 i  N
1 n+ s; g" q6 u

- i6 r6 D2 D9 C6 M7 Y- a% ~' C! V( G1. 在准备好BOOT和APP的工程后,需要先通过STM32CubeIDE将APP的程序下载到开发板上。$ h) p2 m) Y1 a3 `; ^
2. 本文档中的演示示例,BOOT工程在跳转到APP代码之前,需要失能ICACHE,因为在APP工程中,ICACHE的初始化函数如果判断到ICACHE是激活的话,会直接进入到错误处理函数,造成APP代码无法往后执行。( w  a- g2 B  M* ~/ ~/ X

  a0 T8 A# C; \+ o( r1 m
收藏 评论0 发布时间:2025-3-26 13:24

举报

0个回答

所属标签

相似分享

官网相关资源

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