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

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

[复制链接]
STMCU-管管 发布时间:2025-3-26 13:24
01
前言
STM32CubeIDE的工程联调功能太好用了,特别是调试BOOT和APP的场景下,可以让大家清楚的看到程序是如何一步一步的从BOOT跳转到APP的,强烈的视觉冲击,让人眼前一亮,拨云见日,让bug无处遁形。2 ^+ a9 d7 L, A' w, r
02
准备
刚好手上有一块STM32H563的NUCLEO板,那我们就基于该开发板来一步一步展现IAP工程联调的美妙吧。首先通过STM32CubeMX准备IAP的BOOT和APP的示例工程。
  R) i# s6 d& f5 A$ i* n# i" Q2 e9 u  \' e
6 h& _: C+ U6 |
2.1. 制作BOOT工程
, s5 {6 k) G5 ^$ k8 w4 [* @" z& X3 X4 Z; E

$ y' P7 t& |9 ^& S* C! K/ x4 FBOOT工程我们准备了常规的LED点灯程序,我们使能了ICACHE,配置了外部按键中断(并使能中断),以及板子上的三个LED灯(GPIO output),如下图所示。
, r  e. _0 S6 f& v
% r! H. a# q9 }, D

, _9 W- w: d$ i+ d( ?
12.png
▲ 图1. BOOT工程STM32CubeMX的配置
1 }" _* b8 G' F' N) \& a

: m8 g% P2 G, B& g在生成的工程中,我们添加了按键检测,如果有按键按下,则进入IAP的跳转流程中,如下图所示。' Z0 J: h8 U: {* h# u" ?
8 Q) g2 R; d; |" P1 K) t$ E  Y* a
% B1 O0 R3 |6 s+ H& S: u: _) C
13.png
▲ 图2. BOOT工程中的跳转代码
( B5 q9 o+ @" R* G  z
( E# S6 j# K# \% e: p6 i$ u1 ^9 U
上述代码涉及到的变量定义和函数的实现如下图所示:& U1 o, |% n# ~8 ], d: |
14.png
▲ 图3. BOOT工程相关的变量定义和函数实现

2 ^0 A3 l; e& E5 ?& m

$ r; }$ c0 D0 ^" }2.2. 制作APP工程4 e$ x$ ]. i+ S  ^
: G3 @9 q* g# G! `, p" R
APP工程的基本配置与BOOT工程完全一样,可以直接导入BOOT工程的STM32CubeMX的配置,故在此不重复展示。2 r7 R( `& A8 y9 N: }' J
. Y# a) p- ]5 Q* Y6 z7 z
8 \. }% ]' y1 r! }" y1 B/ G: X
在STM32CubeMX生成的工程中,APP工程还需要修改内存分散加载文件,以适配APP工程的内存偏移,如下图所示。
4 K* V- h, K' B
: [+ J, \7 r" w8 O$ z1 A

2 u: g/ U7 E+ R1 ^
15.png
▲ 图4. 修改APP工程的内存分散加载链接文件

& {: f% L- E0 j5 j0 C% p* ?
) \' E5 H" f; |
修改代码里中断向量表的偏移地址,如下图所示:  D) o, o6 \' v1 D+ u5 e- k
16.png
▲ 图5. 修改APP工程的中断向量表偏移值

+ R0 G6 H% m5 k$ g6 A1 L
在APP的主循环中添加LD3的闪灯程序,如下图所示:
3 A. z3 W2 l/ N
9 E& j( d0 ?2 x1 u9 ?& d% R. Y. T

4 X5 y% M5 A1 K: o+ y" z' F, s) Y
17.png
▲ 图6. APP工程的主循环
3 Q! m+ |' a3 s9 e* n+ T& E
03
调试配置
9 O7 l% N' {2 ~/ O% v1 `4 c
准备好工程后,接下来我们就可以配置BOOT工程的调试选项了。在BOOT工程的调试选项中,新增APP工程的调试配置,如下图所示:$ `3 Z$ f1 H& p( y" z/ A
18.png
▲ 图7. BOOT工程的Debug Configuration选项

4 O/ U$ H6 y: `" Y' V9 B0 L
+ D$ A! I9 X: j: ?' |# z/ m
注意:这里的Step5中,我们去掉了“Perform build”和“Download”两个选项,目的是仅仅加载APP工程的symbols,不需要重新编译和下载工程。如果勾选这两个选项,调试器建立连接时,会产生错误。
7 H% c1 c, Z5 M8 L1 \% J- ]# D/ v0 M8 E. C$ q& t+ _  H

5 ?: J! \0 U3 [/ ?! U添加完APP的调试配置后,会在BOOT工程的调试选项中看到如下图所示配置:" D, G; M' ]+ l  c1 K) [4 S5 F! f6 m& F

) N  F6 E, ~. J2 e+ S
# P* ~3 u% e% y' O3 h2 q7 g
19.png
▲ 图8. BOOT工程的完整选项
3 u+ j7 F; x, R  A- f4 N: H

1 t% Z# M  p" a" p7 `- Z在演示工程联调之前,我们先通过STM32CubeIDE下载APP的工程(在APP工程的Debug configuration中下载程序,或者通过STM32CubeProgrammer下载),然后再通过BOOT的调试选项进入到调试界面。2 L1 I0 f5 _, x
8 I& G2 j3 t/ |
; y! a& z7 A, C2 {. K* U+ l* |
我们可以在BOOT工程中设置断点,同时也在APP的主循环中添加断点,然后运行程序,可以看到LD1在闪烁。  P- s) b: [0 ^' l5 g  G
: i. G- t% H" U: h% P) R- T- Y

/ v' r- c0 M3 @+ v2 Z+ B4 i此时按下开发板的蓝色用户按钮,可以看到LD2也会点亮1秒钟,然后工程停在BOOT工程的断点处。$ R% g' ~' ?7 S4 J9 ^* b. G

9 k5 X" c+ }3 S' {6 M- m# n# o

# `, k# S7 b1 p5 T在调试界面,我们配置调试为汇编单步执行,如下图所示:0 J& n' F, v' A& Z; }( z, {" h3 r
1 v  G0 z' ]3 N7 B

+ a3 Y5 M. P$ g% g9 }9 |5 h
20.png
▲ 图9. 配置APP工程的汇编单步执行

  J0 B& o3 p. f! C+ j  q6 Z# B1 o
( ], T. `* E2 L
这样我们就能清晰的看到程序从BOOT跳转到APP工程的Reset_Handler程序了。如果继续全速运行,可以看到LD1和LD2熄灭,LD3在间隔500毫秒闪烁。1 F# ?& k4 d8 u

: [7 R) p4 O& N2 M

' G; B* z( U. r; ^4 H
04
小结
这里我列举出可能会出错的地方,方便大家顺利实验。
, E' @1 V- `1 V* q, C4 {
+ u6 f3 A( v/ D' F

6 v& v9 J4 n$ L- }2 U+ }; `1. 在准备好BOOT和APP的工程后,需要先通过STM32CubeIDE将APP的程序下载到开发板上。
% N% s. e0 \# O" S* M" i3 g, R2. 本文档中的演示示例,BOOT工程在跳转到APP代码之前,需要失能ICACHE,因为在APP工程中,ICACHE的初始化函数如果判断到ICACHE是激活的话,会直接进入到错误处理函数,造成APP代码无法往后执行。
- W& [* B; I$ ~8 @5 e& F- A& z$ E# d  ]5 I# d* C6 ?  r$ T* Q9 X. w
收藏 评论0 发布时间:2025-3-26 13:24

举报

0个回答

所属标签

相似分享

官网相关资源

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