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

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

[复制链接]
STMCU-管管 发布时间:2025-3-26 13:24
01
前言
STM32CubeIDE的工程联调功能太好用了,特别是调试BOOT和APP的场景下,可以让大家清楚的看到程序是如何一步一步的从BOOT跳转到APP的,强烈的视觉冲击,让人眼前一亮,拨云见日,让bug无处遁形。
6 U9 L6 M7 r0 k4 L1 I) r9 N
02
准备
刚好手上有一块STM32H563的NUCLEO板,那我们就基于该开发板来一步一步展现IAP工程联调的美妙吧。首先通过STM32CubeMX准备IAP的BOOT和APP的示例工程。
% l* l( C( p  ~  p6 z6 L. ~  Z; D% l

8 Y/ B0 M* i& h7 h" X2.1. 制作BOOT工程6 A3 \; t& W0 E. @  c+ w+ Q

- B; `& i, n& U) @0 e" [

$ A: U$ A1 U" g, }5 z% O6 pBOOT工程我们准备了常规的LED点灯程序,我们使能了ICACHE,配置了外部按键中断(并使能中断),以及板子上的三个LED灯(GPIO output),如下图所示。2 C% h% X# E! W6 u

. g( S4 f9 g* D3 ?" `( d+ K# M
' g4 W. U0 y; N" W+ T8 i* o( v
12.png
▲ 图1. BOOT工程STM32CubeMX的配置

; \, M) R5 {, g; D/ b; L* R2 X

# u9 R8 T8 Y% M. y" D" v- ~0 x在生成的工程中,我们添加了按键检测,如果有按键按下,则进入IAP的跳转流程中,如下图所示。
9 [) c+ ?( y. ^1 ]$ Y8 \* M
! d4 t: c7 Y" b9 ]6 T  m

$ `! |- a) B( u  n7 }& E. ]
13.png
▲ 图2. BOOT工程中的跳转代码
3 T1 D. Z& W5 b/ s6 F

1 u' l. c1 l5 [! N上述代码涉及到的变量定义和函数的实现如下图所示:
" j) W. Z) z( A  A4 ]- ^* y" t6 x7 Z
14.png
▲ 图3. BOOT工程相关的变量定义和函数实现

; O) q0 V- V( D6 `  h0 c
4 y9 y: G* a' ~, L, O9 h
2.2. 制作APP工程
& z3 T5 Z) R# `0 o! ?+ Z0 w, R6 J" {' B
APP工程的基本配置与BOOT工程完全一样,可以直接导入BOOT工程的STM32CubeMX的配置,故在此不重复展示。
3 Q+ k" V# m. n; l+ ^/ b9 R- c$ ^
2 x7 a# l/ Q2 G
- ~. f6 u. P, L) B; g* T! d, z6 \
在STM32CubeMX生成的工程中,APP工程还需要修改内存分散加载文件,以适配APP工程的内存偏移,如下图所示。5 n$ L- Q' j9 |6 V9 |- c8 c

0 M* ^" H( \/ S* y8 O

; Q; a8 r1 ]1 L1 h5 ?% k, s
15.png
▲ 图4. 修改APP工程的内存分散加载链接文件

+ z2 V: w* Q+ ~3 `' e

0 S/ o0 Y9 @# u" U& y" ?1 V! G( g( r修改代码里中断向量表的偏移地址,如下图所示:3 D) }6 ^) F& K& S- ^# T
16.png
▲ 图5. 修改APP工程的中断向量表偏移值

+ B3 ^- w6 s: S
在APP的主循环中添加LD3的闪灯程序,如下图所示:
) _) q# R* z' S$ U
" v% p" v$ F, |7 k2 ~: ~

# f( h( G7 t# C; O* t6 P; f1 I
17.png
▲ 图6. APP工程的主循环

/ p, ]& d, i! P& h: f
03
调试配置
; Q; t; K/ ?2 c# x# I. f+ P/ `1 m
准备好工程后,接下来我们就可以配置BOOT工程的调试选项了。在BOOT工程的调试选项中,新增APP工程的调试配置,如下图所示:! ]& r# I0 K7 Y! Z' o5 t6 v
18.png
▲ 图7. BOOT工程的Debug Configuration选项

6 V/ L1 P0 h; r% G& ?$ q

4 o; g* W3 j( f2 ^8 ~$ X2 N! K- m# i注意:这里的Step5中,我们去掉了“Perform build”和“Download”两个选项,目的是仅仅加载APP工程的symbols,不需要重新编译和下载工程。如果勾选这两个选项,调试器建立连接时,会产生错误。; G5 d2 b) |! z, l/ h: i) K

3 W5 }' H( {2 e0 g& r( u

' Y' U+ R% v8 k- `* e2 Q% r添加完APP的调试配置后,会在BOOT工程的调试选项中看到如下图所示配置:
4 N0 P  b/ }( J0 ]5 j5 t5 P" x2 A  v3 o# K% `) {9 t& t

8 t! K1 H& d9 o) p* G* _
19.png
▲ 图8. BOOT工程的完整选项

. c0 c7 }0 c; H% H1 n5 H+ `* w; q3 Y8 `1 C
/ |  c2 V& g. ?8 B/ X9 G0 V
在演示工程联调之前,我们先通过STM32CubeIDE下载APP的工程(在APP工程的Debug configuration中下载程序,或者通过STM32CubeProgrammer下载),然后再通过BOOT的调试选项进入到调试界面。
" _+ y1 N( O5 s2 g: k* m) h8 F6 g+ M
3 c! x; R- ]2 \3 l! h8 D$ f2 N
" ?5 U  m+ O% Y# U5 M
我们可以在BOOT工程中设置断点,同时也在APP的主循环中添加断点,然后运行程序,可以看到LD1在闪烁。
# Y* ~" @" T( s, |- E4 n
8 T  d2 w# }" y4 R5 Z0 R

" A6 O4 D  C( c2 [% S. k此时按下开发板的蓝色用户按钮,可以看到LD2也会点亮1秒钟,然后工程停在BOOT工程的断点处。2 E! s" o6 _* q( _& D$ l. J" M4 w

% ~5 I, I% `1 u( ]$ l

! p* \  i6 I* `$ V1 F3 i* o在调试界面,我们配置调试为汇编单步执行,如下图所示:
% U% O% U, l+ G3 o% \5 e$ {
6 c( `8 E  i2 P; ~$ C
; P) V) j, I0 D& h0 _
20.png
▲ 图9. 配置APP工程的汇编单步执行

7 \7 {5 c, e" c( p2 b9 Y

8 v0 @+ W2 P! F+ w. R9 _& H3 r这样我们就能清晰的看到程序从BOOT跳转到APP工程的Reset_Handler程序了。如果继续全速运行,可以看到LD1和LD2熄灭,LD3在间隔500毫秒闪烁。+ A) Q6 W/ x. V) c: V+ g

4 \' A4 y! m( m4 r. g: N

2 g8 _* L' ?2 M1 }0 }
04
小结
这里我列举出可能会出错的地方,方便大家顺利实验。
7 G" G: w7 i, K9 R3 C0 E8 t- r3 ~2 j5 a
6 D9 k2 H6 u7 \" `) P' X# W# @# t' [
1. 在准备好BOOT和APP的工程后,需要先通过STM32CubeIDE将APP的程序下载到开发板上。: @8 k2 _0 ~3 P% x  y4 _9 |2 K& [
2. 本文档中的演示示例,BOOT工程在跳转到APP代码之前,需要失能ICACHE,因为在APP工程中,ICACHE的初始化函数如果判断到ICACHE是激活的话,会直接进入到错误处理函数,造成APP代码无法往后执行。
' g6 P# W: e- [/ Y& j& r5 ]( z# f1 T0 T) z
收藏 评论0 发布时间:2025-3-26 13:24

举报

0个回答

所属标签

相似技术帖

官网相关资源

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