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

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

[复制链接]
STMCU-管管 发布时间:2025-3-26 13:24
01
前言
STM32CubeIDE的工程联调功能太好用了,特别是调试BOOT和APP的场景下,可以让大家清楚的看到程序是如何一步一步的从BOOT跳转到APP的,强烈的视觉冲击,让人眼前一亮,拨云见日,让bug无处遁形。
& B1 K$ h8 s  E7 D5 w) s7 |
02
准备
刚好手上有一块STM32H563的NUCLEO板,那我们就基于该开发板来一步一步展现IAP工程联调的美妙吧。首先通过STM32CubeMX准备IAP的BOOT和APP的示例工程。; m6 M' X1 v0 [1 k

8 C5 @( S) ^7 w- {* e. C- X

( x' n# t! P7 y9 _8 S: e2.1. 制作BOOT工程
# S4 p9 ?5 _$ ]9 d/ b( z
; U' p' E, }' N
' n* f  Y8 }# R& g+ l4 b
BOOT工程我们准备了常规的LED点灯程序,我们使能了ICACHE,配置了外部按键中断(并使能中断),以及板子上的三个LED灯(GPIO output),如下图所示。" ^5 I6 a; D% l" {$ {. C1 t
: R: D& Y5 e% g4 B# J" F/ U- I
  x5 U# u1 h& o% N7 P( C
12.png
▲ 图1. BOOT工程STM32CubeMX的配置

' r. u# L0 n' @" v! e9 M

2 \' A" O/ R1 h在生成的工程中,我们添加了按键检测,如果有按键按下,则进入IAP的跳转流程中,如下图所示。" w" J, U) o3 y
" J3 J( }' F& w: p

: K& y, T2 x- H8 T* c
13.png
▲ 图2. BOOT工程中的跳转代码

( |' X! a0 W9 E' I% p" D

! f) a: C) F! L0 v% D上述代码涉及到的变量定义和函数的实现如下图所示:
, P2 l6 t+ ^* w6 j* {. w; X
14.png
▲ 图3. BOOT工程相关的变量定义和函数实现
" W( ]0 V5 d6 G+ T

& y& q- E6 P/ r: h( f, ]0 ~2.2. 制作APP工程
+ H) R. O7 C% {& D) e
* T& X* z* A5 f  u4 e  Z8 pAPP工程的基本配置与BOOT工程完全一样,可以直接导入BOOT工程的STM32CubeMX的配置,故在此不重复展示。
& a1 O: ]  X5 z9 T! J# S
  D% b; z6 F5 e3 h9 b$ J2 J# F

7 s$ b7 G2 g8 Q9 k- g在STM32CubeMX生成的工程中,APP工程还需要修改内存分散加载文件,以适配APP工程的内存偏移,如下图所示。7 B$ N% X* {0 O. Y& x/ n; h" E2 ~0 L

5 C9 I; m, {0 k+ E. A$ o$ C

. j) U' b- ?6 g
15.png
▲ 图4. 修改APP工程的内存分散加载链接文件

% Y0 A) {+ M4 K; P

8 v" w) c" H' j# D# E# A修改代码里中断向量表的偏移地址,如下图所示:6 j3 K* M+ G" e  q; I$ O
16.png
▲ 图5. 修改APP工程的中断向量表偏移值
( f5 U9 K% N/ n9 m, y0 c
在APP的主循环中添加LD3的闪灯程序,如下图所示:$ ]. s8 u; U! B+ J4 _
, I, ~2 D0 X; u
# ?7 s5 S  O% \" I/ O/ z: s
17.png
▲ 图6. APP工程的主循环
! }+ s( W1 \8 u( ~  h& H5 U: q/ P
03
调试配置
5 S& A( q0 M1 g% p6 s; _$ G9 ]: H
准备好工程后,接下来我们就可以配置BOOT工程的调试选项了。在BOOT工程的调试选项中,新增APP工程的调试配置,如下图所示:+ V& [% r* a, T# O
18.png
▲ 图7. BOOT工程的Debug Configuration选项

& i) S6 {4 m; V' E% J
+ q" M  E- `6 X% m* k- h0 J
注意:这里的Step5中,我们去掉了“Perform build”和“Download”两个选项,目的是仅仅加载APP工程的symbols,不需要重新编译和下载工程。如果勾选这两个选项,调试器建立连接时,会产生错误。
* E0 F! D  e7 _0 G
- g0 |" U' _+ u

% x8 r7 f4 Y* }5 o: s添加完APP的调试配置后,会在BOOT工程的调试选项中看到如下图所示配置:
  P9 U4 I9 X8 |4 i5 D% u' Z, h' ~6 y0 I6 ]; A

4 H7 I7 E& |: K2 |6 P' r7 e* `
19.png
▲ 图8. BOOT工程的完整选项
' [( J6 Q* `: p# ~- |

6 m) P. S' M, n8 W2 R$ ^& ]在演示工程联调之前,我们先通过STM32CubeIDE下载APP的工程(在APP工程的Debug configuration中下载程序,或者通过STM32CubeProgrammer下载),然后再通过BOOT的调试选项进入到调试界面。& O( g$ _. B0 b8 v
9 M- R/ ^, _) c. t* X& E9 h
1 Y  m9 N) w; k: G; g
我们可以在BOOT工程中设置断点,同时也在APP的主循环中添加断点,然后运行程序,可以看到LD1在闪烁。  H" N2 ~3 z1 A, i

1 L( I, x4 `3 y+ G& ]

, `. |1 a: x* G此时按下开发板的蓝色用户按钮,可以看到LD2也会点亮1秒钟,然后工程停在BOOT工程的断点处。' r, m6 n! c# P6 U5 p/ ]% P; w: B. s% Q4 F

' t  |) f8 N: N
; ~  S! A/ B% B% R. N. W
在调试界面,我们配置调试为汇编单步执行,如下图所示:
) \1 r3 d5 k$ U( d& r7 I+ [3 ?0 ~9 P4 `& X8 V' Y  A! a* ^
, b6 {9 J" }3 T# s& m: [3 L
20.png
▲ 图9. 配置APP工程的汇编单步执行
/ A, l9 X# n) Y; g! e

/ ^. z. @7 H9 X; r& R3 ~0 U2 z这样我们就能清晰的看到程序从BOOT跳转到APP工程的Reset_Handler程序了。如果继续全速运行,可以看到LD1和LD2熄灭,LD3在间隔500毫秒闪烁。
' R/ r* K! d+ u) h! `, ?
: r, V) M$ J, [
, ^' R0 F- o6 k- u; |
04
小结
这里我列举出可能会出错的地方,方便大家顺利实验。4 c2 x8 ^: f. r

7 C/ x+ g2 x6 D

% ~3 K* |% A  ?1. 在准备好BOOT和APP的工程后,需要先通过STM32CubeIDE将APP的程序下载到开发板上。
+ r, Q6 o* t+ M& d3 C8 t5 ~2. 本文档中的演示示例,BOOT工程在跳转到APP代码之前,需要失能ICACHE,因为在APP工程中,ICACHE的初始化函数如果判断到ICACHE是激活的话,会直接进入到错误处理函数,造成APP代码无法往后执行。
' K' |( P0 E" Q7 O' u. b
2 A' l- Z) M) E; ~4 G9 u6 R/ c
收藏 评论0 发布时间:2025-3-26 13:24

举报

0个回答

所属标签

相似分享

官网相关资源

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