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

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

[复制链接]
STMCU-管管 发布时间:2025-3-26 13:24
01
前言
STM32CubeIDE的工程联调功能太好用了,特别是调试BOOT和APP的场景下,可以让大家清楚的看到程序是如何一步一步的从BOOT跳转到APP的,强烈的视觉冲击,让人眼前一亮,拨云见日,让bug无处遁形。$ d& k6 v" Z7 o
02
准备
刚好手上有一块STM32H563的NUCLEO板,那我们就基于该开发板来一步一步展现IAP工程联调的美妙吧。首先通过STM32CubeMX准备IAP的BOOT和APP的示例工程。
' J! B1 Y& u$ l* C) C4 \
! }% v# ^. K6 @' S- p! y: ?0 n5 b
, E% R- U8 D# B+ s3 m
2.1. 制作BOOT工程
4 V/ o1 \! L5 `$ L" w
, C. C0 g: t% K# e4 \
, |$ D: ~2 I* c6 E: Z; |$ b$ C
BOOT工程我们准备了常规的LED点灯程序,我们使能了ICACHE,配置了外部按键中断(并使能中断),以及板子上的三个LED灯(GPIO output),如下图所示。
6 H! {: y! Y% Q7 Y4 A! r6 A* f" ^- k5 J* E; M

1 b0 r8 F% [2 x$ a
12.png
▲ 图1. BOOT工程STM32CubeMX的配置

0 k* A2 L( [! O0 o3 U+ N
' y( J$ c6 b/ I
在生成的工程中,我们添加了按键检测,如果有按键按下,则进入IAP的跳转流程中,如下图所示。/ `  o, H9 ?  E* }. e: [
+ b" S4 z& r2 D+ {
% r+ Y- K' U$ |1 H: ?2 ?
13.png
▲ 图2. BOOT工程中的跳转代码
$ b# S, ]+ ]  s1 s+ L# _# E4 [, G* b
+ F  \; |$ V4 \. @) u$ m
上述代码涉及到的变量定义和函数的实现如下图所示:
% }* ], P/ Z9 W# R+ V! T* m5 \
14.png
▲ 图3. BOOT工程相关的变量定义和函数实现

. i: E5 i/ k' y$ |& M

" }8 @! h1 E; Y4 x  e) n2.2. 制作APP工程% b2 e0 c4 z# P. R
6 Q" W' \6 a) B: f' {
APP工程的基本配置与BOOT工程完全一样,可以直接导入BOOT工程的STM32CubeMX的配置,故在此不重复展示。
2 a( K  \2 ~! @3 C% G
3 z8 f/ R9 F! J9 L" i& m

$ p6 M+ b& |% d1 Y( Z8 x1 c在STM32CubeMX生成的工程中,APP工程还需要修改内存分散加载文件,以适配APP工程的内存偏移,如下图所示。
* N( l, O9 Q9 `5 N1 Y& K, W, R* t3 ~+ [: f. T% l! h" O5 K! s
$ J7 l$ Y4 ?' _' x
15.png
▲ 图4. 修改APP工程的内存分散加载链接文件
6 E: v8 x/ f8 p: ~
$ e2 ~. ~/ t, m  K; ]
修改代码里中断向量表的偏移地址,如下图所示:
6 s' p7 c9 x  V* k; A& o! `  I: g% v
16.png
▲ 图5. 修改APP工程的中断向量表偏移值
' c2 P# M* w7 ?. A, u6 Z, V
在APP的主循环中添加LD3的闪灯程序,如下图所示:# r  Q: Z5 x6 D& T. w
* w; S- U) N6 Z( v7 K& i& A
/ B/ f2 o% Q0 ]& B
17.png
▲ 图6. APP工程的主循环

- c) b* U8 K/ d3 G( p0 B7 ]
03
调试配置
) {0 R; c; P3 y+ a, A, n
准备好工程后,接下来我们就可以配置BOOT工程的调试选项了。在BOOT工程的调试选项中,新增APP工程的调试配置,如下图所示:
2 |! r2 P3 |) C3 f$ }2 n1 Q3 C( J
18.png
▲ 图7. BOOT工程的Debug Configuration选项
: P5 n/ ?4 R% ]
( k) z" p" g2 l
注意:这里的Step5中,我们去掉了“Perform build”和“Download”两个选项,目的是仅仅加载APP工程的symbols,不需要重新编译和下载工程。如果勾选这两个选项,调试器建立连接时,会产生错误。4 W0 u) G# i% P2 ?7 ^9 D" A
. {8 J2 z, U+ e* n2 s* h

7 Z3 S  n7 n9 R& o; Q添加完APP的调试配置后,会在BOOT工程的调试选项中看到如下图所示配置:4 k6 \3 a$ M) t9 x0 }
9 N, G. v6 _% O/ Q' G# u
  {# U# `& F) E( n% B2 E  e  j+ Y4 M
19.png
▲ 图8. BOOT工程的完整选项
5 L+ u, D# L( s* {+ D7 N' g: r( ?

5 {2 x7 v% M& {3 ^) R1 l8 P% t3 [在演示工程联调之前,我们先通过STM32CubeIDE下载APP的工程(在APP工程的Debug configuration中下载程序,或者通过STM32CubeProgrammer下载),然后再通过BOOT的调试选项进入到调试界面。
1 @! w: e+ Q$ i4 l: J& T. Q
3 e+ O2 k' W' G, ?  @
% K: b# Z$ J# e2 H; y: Y
我们可以在BOOT工程中设置断点,同时也在APP的主循环中添加断点,然后运行程序,可以看到LD1在闪烁。" U! }- i; U8 A

3 c) Y% u+ p% w
  m5 N% |9 q4 r) S! X: h( p
此时按下开发板的蓝色用户按钮,可以看到LD2也会点亮1秒钟,然后工程停在BOOT工程的断点处。: j5 j6 i: e0 n- B9 ?
. J6 A3 k+ {2 m- T$ T
* ^' z) l# R+ b
在调试界面,我们配置调试为汇编单步执行,如下图所示:
, f* S$ B6 J& t% q, F
/ Z3 v9 L' ]5 Z7 u4 K1 F8 {; [
$ r; k# z+ `5 B( L3 q/ `
20.png
▲ 图9. 配置APP工程的汇编单步执行
, r. Q$ _1 m# b/ r6 d! e: o+ p5 m
- s2 I' M2 Y+ f9 q" v
这样我们就能清晰的看到程序从BOOT跳转到APP工程的Reset_Handler程序了。如果继续全速运行,可以看到LD1和LD2熄灭,LD3在间隔500毫秒闪烁。
" t2 V# j( g; m3 X9 |' h5 X* t
4 m; I, F, f* J* s. _9 K5 k
; g$ W& |) Q) ?$ d% y( |$ ]
04
小结
这里我列举出可能会出错的地方,方便大家顺利实验。
  @' u) y( _+ [+ Y. V) c. j7 n) T
5 V5 Y- q- J5 L+ v  F4 L1 l7 N
1. 在准备好BOOT和APP的工程后,需要先通过STM32CubeIDE将APP的程序下载到开发板上。( M7 \+ O& a3 H/ @! H. K" k# ]2 }
2. 本文档中的演示示例,BOOT工程在跳转到APP代码之前,需要失能ICACHE,因为在APP工程中,ICACHE的初始化函数如果判断到ICACHE是激活的话,会直接进入到错误处理函数,造成APP代码无法往后执行。
  R9 u4 N9 N! A/ s: a2 u8 j4 ~; Z2 _" U0 S
收藏 评论0 发布时间:2025-3-26 13:24

举报

0个回答

所属标签

相似分享

官网相关资源

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