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

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

[复制链接]
STMCU-管管 发布时间:2025-3-26 13:24
01
前言
STM32CubeIDE的工程联调功能太好用了,特别是调试BOOT和APP的场景下,可以让大家清楚的看到程序是如何一步一步的从BOOT跳转到APP的,强烈的视觉冲击,让人眼前一亮,拨云见日,让bug无处遁形。
: r- K% q- w/ B, W6 [# i0 I1 i2 {  u
02
准备
刚好手上有一块STM32H563的NUCLEO板,那我们就基于该开发板来一步一步展现IAP工程联调的美妙吧。首先通过STM32CubeMX准备IAP的BOOT和APP的示例工程。
7 B4 V" L$ l7 \/ b) Y' B2 n3 |" k9 m
8 D' e9 o4 P: `& L( {
2.1. 制作BOOT工程' N; a) o; q0 {. }( A
# r8 L- H/ ?) n5 M

7 v0 \3 r: k( `6 X% _BOOT工程我们准备了常规的LED点灯程序,我们使能了ICACHE,配置了外部按键中断(并使能中断),以及板子上的三个LED灯(GPIO output),如下图所示。5 A& _2 H2 u  ^8 A2 H

6 ?9 [7 R' d) T* G$ b  {" o3 M
# R9 m3 P3 e- x
12.png
▲ 图1. BOOT工程STM32CubeMX的配置

8 y. a4 D3 }; D" G) t. `) e
7 t7 E9 V* T! \8 c0 I  _  |. S
在生成的工程中,我们添加了按键检测,如果有按键按下,则进入IAP的跳转流程中,如下图所示。
  I. \- `  k+ ]) d
, L7 `4 F9 z6 x2 C$ A# |

: y( k% B7 w. k+ h+ Y2 F* `# D
13.png
▲ 图2. BOOT工程中的跳转代码
; e- p: G! h. L' p! S

; I) S6 `/ W5 F9 p. ?3 W9 v上述代码涉及到的变量定义和函数的实现如下图所示:$ k3 |8 K$ F" t* D
14.png
▲ 图3. BOOT工程相关的变量定义和函数实现
. c3 e9 o, z! O  M# M/ t
  _2 b  t! ?) s- a8 J0 N- E
2.2. 制作APP工程
# K  z) k  I# u
. V/ [6 D- [- ?. G& qAPP工程的基本配置与BOOT工程完全一样,可以直接导入BOOT工程的STM32CubeMX的配置,故在此不重复展示。
0 M0 t) E. s- m( _* _) X6 q8 w: \+ e7 Y- s8 i
, r+ a( o# g& @% _# L0 f4 V7 ?
在STM32CubeMX生成的工程中,APP工程还需要修改内存分散加载文件,以适配APP工程的内存偏移,如下图所示。
( O5 M1 I; E# w8 Z! d0 I" o; x4 f# j5 K( \: w, U

7 k# a, Z+ g. p8 x4 P" h
15.png
▲ 图4. 修改APP工程的内存分散加载链接文件
2 [$ A' R! }$ _' v6 {9 W
" W; F( ]1 n* c1 Z& m' U# a$ S6 i
修改代码里中断向量表的偏移地址,如下图所示:0 P' q6 G% b! `
16.png
▲ 图5. 修改APP工程的中断向量表偏移值
+ b; H/ a" r( v* d. B
在APP的主循环中添加LD3的闪灯程序,如下图所示:
1 n3 S" A" p! x8 z! L5 f# Z2 l
3 `5 V) j$ b2 I
5 x9 b8 A& k8 y
17.png
▲ 图6. APP工程的主循环

% l; S/ i- j( M, A4 I7 V& W* i
03
调试配置
, i* a2 l& J' E- l# m
准备好工程后,接下来我们就可以配置BOOT工程的调试选项了。在BOOT工程的调试选项中,新增APP工程的调试配置,如下图所示:- F, g5 U/ Q9 S8 K
18.png
▲ 图7. BOOT工程的Debug Configuration选项
* D3 `! R! e4 k4 H
0 @/ W/ g6 |  \
注意:这里的Step5中,我们去掉了“Perform build”和“Download”两个选项,目的是仅仅加载APP工程的symbols,不需要重新编译和下载工程。如果勾选这两个选项,调试器建立连接时,会产生错误。, u3 ]0 ]4 i& k
  j3 s" G; i/ y8 u! m

; h4 R5 m4 Q; s8 W( Q$ W添加完APP的调试配置后,会在BOOT工程的调试选项中看到如下图所示配置:
% k- G  e  W/ y6 m* B7 `0 D. @, {$ F1 _2 X
5 d2 O1 K5 V; b7 {
19.png
▲ 图8. BOOT工程的完整选项

/ }. {5 Z: E  y  a! i5 h1 ^

, f$ i: l  s, m% m% i' W. Q在演示工程联调之前,我们先通过STM32CubeIDE下载APP的工程(在APP工程的Debug configuration中下载程序,或者通过STM32CubeProgrammer下载),然后再通过BOOT的调试选项进入到调试界面。
! c! q7 K7 Z) K9 Z5 j* S* p2 i3 V

8 h# C3 P+ [0 O$ ^; ^/ Y4 b我们可以在BOOT工程中设置断点,同时也在APP的主循环中添加断点,然后运行程序,可以看到LD1在闪烁。0 t: n  V0 i4 [' f8 |
. n9 U1 G% p, ~0 D' D0 }& x

; }1 U4 f, v% t此时按下开发板的蓝色用户按钮,可以看到LD2也会点亮1秒钟,然后工程停在BOOT工程的断点处。' D6 X# x. I$ B, c6 A& }
2 [$ n  c1 D. N- i

# d* q1 F% G. Q, O' G7 ^% p) A在调试界面,我们配置调试为汇编单步执行,如下图所示:
2 ^+ _# r6 K4 s5 N) [) S
- M, W- M9 X, v6 v2 Y& L! v( n
- u, T! S4 ~$ a- b# g; Z/ W
20.png
▲ 图9. 配置APP工程的汇编单步执行

1 T* P/ x6 ?5 K$ Q+ S4 E
, x- E/ [2 X% R. Y* i3 J
这样我们就能清晰的看到程序从BOOT跳转到APP工程的Reset_Handler程序了。如果继续全速运行,可以看到LD1和LD2熄灭,LD3在间隔500毫秒闪烁。
( S, s4 [: H  @
1 s, R$ d- g& X

1 n% S' M) J9 n0 f4 q
04
小结
这里我列举出可能会出错的地方,方便大家顺利实验。
5 t0 Z4 ^! x. g; C, D( R
1 I2 c& [( t' j3 Z

& O$ ]1 j2 v, D% X' j' H1. 在准备好BOOT和APP的工程后,需要先通过STM32CubeIDE将APP的程序下载到开发板上。
: H9 t6 E6 K! G& F  r3 D% w2. 本文档中的演示示例,BOOT工程在跳转到APP代码之前,需要失能ICACHE,因为在APP工程中,ICACHE的初始化函数如果判断到ICACHE是激活的话,会直接进入到错误处理函数,造成APP代码无法往后执行。
. M, U. l& u: Z2 W6 R8 p$ W' `- l% S( ~
收藏 评论0 发布时间:2025-3-26 13:24

举报

0个回答

所属标签

相似分享

官网相关资源

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