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

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

[复制链接]
STMCU-管管 发布时间:2025-3-26 13:24
01
前言
STM32CubeIDE的工程联调功能太好用了,特别是调试BOOT和APP的场景下,可以让大家清楚的看到程序是如何一步一步的从BOOT跳转到APP的,强烈的视觉冲击,让人眼前一亮,拨云见日,让bug无处遁形。
0 C0 x2 u) J) d' b/ H6 ~4 D
02
准备
刚好手上有一块STM32H563的NUCLEO板,那我们就基于该开发板来一步一步展现IAP工程联调的美妙吧。首先通过STM32CubeMX准备IAP的BOOT和APP的示例工程。
/ n1 o5 ^! W4 S; @7 m$ O" b0 T% Y4 y9 p% S1 e/ E- }! }5 C
& x4 K; S. c+ X- |  f
2.1. 制作BOOT工程) N3 l1 W8 H# R% r
& ]& U& E/ Z& Y* e- i; G! u

9 W! q/ F6 V: s* ^. nBOOT工程我们准备了常规的LED点灯程序,我们使能了ICACHE,配置了外部按键中断(并使能中断),以及板子上的三个LED灯(GPIO output),如下图所示。
5 f5 q9 }0 [3 T- V( _4 o. e1 t: Y) @6 T
" x1 c7 h" u; H- M. c: t2 Q8 R4 p  ?
12.png
▲ 图1. BOOT工程STM32CubeMX的配置
/ H! v" L  O  [* E$ ^

. B/ b  l8 H. h在生成的工程中,我们添加了按键检测,如果有按键按下,则进入IAP的跳转流程中,如下图所示。
$ ~2 z0 e0 C+ p; M( c: ?7 A, Y- \1 r% H" {% G
. X0 R. t9 c9 E5 L9 D- V# x7 E! R
13.png
▲ 图2. BOOT工程中的跳转代码

' z" m) g7 j) O3 P9 ?  \* Q; C; S

/ h4 `3 _6 }2 |) @/ f1 D* ^* P/ z上述代码涉及到的变量定义和函数的实现如下图所示:
4 V1 O4 f( W% H2 _) I
14.png
▲ 图3. BOOT工程相关的变量定义和函数实现

5 L9 f4 X7 O4 B3 B

' m4 f4 ]: Y+ ]3 A2.2. 制作APP工程
8 v0 I) g7 K, N# Q( K$ L% C, q6 p1 d3 @+ c; s5 h
APP工程的基本配置与BOOT工程完全一样,可以直接导入BOOT工程的STM32CubeMX的配置,故在此不重复展示。
2 U# d* U  d5 y9 ^7 `6 v5 j$ o  \2 e+ e& M; [

. z* [4 z9 v# ?; l" t% c在STM32CubeMX生成的工程中,APP工程还需要修改内存分散加载文件,以适配APP工程的内存偏移,如下图所示。
. e2 o4 x* P9 P& Q* M; j5 R! y  w3 b7 N

' \; Z: @4 e0 O7 b3 G
15.png
▲ 图4. 修改APP工程的内存分散加载链接文件
0 O9 d* J; c2 k1 G' `5 r' r/ X
: @+ v6 c) Z2 Q
修改代码里中断向量表的偏移地址,如下图所示:
4 C. m( l7 q. t+ `6 h) g
16.png
▲ 图5. 修改APP工程的中断向量表偏移值
" G9 Y" C4 M, J3 n1 P. m  A6 f
在APP的主循环中添加LD3的闪灯程序,如下图所示:, @- K; \' |3 i/ n, @& B
) i# r, G7 {; l+ r" s

0 l- e! [( O, ]0 \, W
17.png
▲ 图6. APP工程的主循环

1 {* ?, P+ d: S. S) [) m. C
03
调试配置

% \% x* ]1 ^/ a4 ?
准备好工程后,接下来我们就可以配置BOOT工程的调试选项了。在BOOT工程的调试选项中,新增APP工程的调试配置,如下图所示:9 j' \+ J- `. V/ Y
18.png
▲ 图7. BOOT工程的Debug Configuration选项
9 v" ?2 S( @8 g1 |

: I& x% o# y) x8 ~  x+ q( ~注意:这里的Step5中,我们去掉了“Perform build”和“Download”两个选项,目的是仅仅加载APP工程的symbols,不需要重新编译和下载工程。如果勾选这两个选项,调试器建立连接时,会产生错误。
4 ?+ p9 d0 H, w* c
6 ~3 \* q3 _* w* e( n/ C

$ s* C0 }. U% _添加完APP的调试配置后,会在BOOT工程的调试选项中看到如下图所示配置:
) X9 }: t" J* k, n! P" A0 |
* a: s7 ]3 p9 O4 ~, t: I% o

: R- k. ~# j. T
19.png
▲ 图8. BOOT工程的完整选项

; B0 U, y# F" Y' o2 D- K
4 e0 u' Q  P8 J' `& u
在演示工程联调之前,我们先通过STM32CubeIDE下载APP的工程(在APP工程的Debug configuration中下载程序,或者通过STM32CubeProgrammer下载),然后再通过BOOT的调试选项进入到调试界面。
. q% V: b, @. G1 F) R5 k' a
2 V/ {  _8 @: [8 Y+ P

2 T) ?5 s, Z( ^. N我们可以在BOOT工程中设置断点,同时也在APP的主循环中添加断点,然后运行程序,可以看到LD1在闪烁。
; C: ~8 S& V4 {9 `6 n& [7 a/ p" ^& v- i0 w2 A
) B/ a2 R* l$ h1 U9 z
此时按下开发板的蓝色用户按钮,可以看到LD2也会点亮1秒钟,然后工程停在BOOT工程的断点处。& C9 X4 Q( l4 q
/ `& P1 Z+ [$ T' [
" x5 q- D7 |: x2 @5 ?
在调试界面,我们配置调试为汇编单步执行,如下图所示:+ N  p" I2 s1 Z; ?) r) z

& v: Z: M/ I6 l9 }0 p9 \

, c5 s8 B) y0 y) e* s8 ?
20.png
▲ 图9. 配置APP工程的汇编单步执行
8 f  W3 v; j2 X8 P/ f" V
, f% N# U( U' \+ ^) o9 T6 g; O
这样我们就能清晰的看到程序从BOOT跳转到APP工程的Reset_Handler程序了。如果继续全速运行,可以看到LD1和LD2熄灭,LD3在间隔500毫秒闪烁。
- J/ |1 N5 ~3 D( J1 j* s- z
* s# |$ t9 z0 d4 M8 K# ~$ w3 }  F! \
8 _; {) x* K* B. g' z7 j4 e" l
04
小结
这里我列举出可能会出错的地方,方便大家顺利实验。
; g/ ?5 s2 I9 R5 i
! v: t8 s( f. j  c% B. ^
% K* C7 G: V& Q3 I- b4 y! G
1. 在准备好BOOT和APP的工程后,需要先通过STM32CubeIDE将APP的程序下载到开发板上。
/ J8 Z1 k6 R# t9 K7 S: {3 w0 c4 q2 t2. 本文档中的演示示例,BOOT工程在跳转到APP代码之前,需要失能ICACHE,因为在APP工程中,ICACHE的初始化函数如果判断到ICACHE是激活的话,会直接进入到错误处理函数,造成APP代码无法往后执行。8 Q2 T5 Z' w9 \3 e! u
) D) A3 H- A* ?6 Q
收藏 评论0 发布时间:2025-3-26 13:24

举报

0个回答

所属标签

相似技术帖

官网相关资源

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