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

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

[复制链接]
STMCU-管管 发布时间:2025-3-26 13:24
01
前言
STM32CubeIDE的工程联调功能太好用了,特别是调试BOOT和APP的场景下,可以让大家清楚的看到程序是如何一步一步的从BOOT跳转到APP的,强烈的视觉冲击,让人眼前一亮,拨云见日,让bug无处遁形。
) z- e: }8 u+ q& S/ E
02
准备
刚好手上有一块STM32H563的NUCLEO板,那我们就基于该开发板来一步一步展现IAP工程联调的美妙吧。首先通过STM32CubeMX准备IAP的BOOT和APP的示例工程。
! w1 O2 Z, O% ?, m
* f# j8 ^1 s, Y/ u; _; E8 _) e! i
' z  _/ N, K5 i- U
2.1. 制作BOOT工程! [4 v/ U: U! c7 g

0 C' k% L6 `0 _7 V) y0 N
' _' H" H2 r8 l3 H% }
BOOT工程我们准备了常规的LED点灯程序,我们使能了ICACHE,配置了外部按键中断(并使能中断),以及板子上的三个LED灯(GPIO output),如下图所示。
3 s" Z% J% c- I+ o7 ~8 D+ i1 Z+ j

' x+ z$ _) l5 ?' D, k! f+ F) @: U9 F
12.png
▲ 图1. BOOT工程STM32CubeMX的配置
. I2 ]8 o0 E0 }( ?  c

" A( R* Y$ F: B7 p( n) L) d  _+ y在生成的工程中,我们添加了按键检测,如果有按键按下,则进入IAP的跳转流程中,如下图所示。4 ]3 R7 v3 h. I2 t
$ p+ r5 P9 J3 Y1 r2 n

" T" d( c) U! T+ m' c
13.png
▲ 图2. BOOT工程中的跳转代码
0 z( X! p  C' P" |! Z

& E7 d$ r) L6 q6 e- v; O上述代码涉及到的变量定义和函数的实现如下图所示:. }0 Q/ n: d8 L: }$ H* {+ _* x9 n
14.png
▲ 图3. BOOT工程相关的变量定义和函数实现

4 o. b: Z  {( l' R

7 J( z: I. g* k& V" |2 F2.2. 制作APP工程' |5 X" L8 f$ ^$ k6 p4 @5 K8 \7 U; F

5 J1 O5 `9 T. `1 ~/ u$ {% B* z6 I2 t0 VAPP工程的基本配置与BOOT工程完全一样,可以直接导入BOOT工程的STM32CubeMX的配置,故在此不重复展示。
6 ^# ^" F5 t0 P/ O7 r: q
4 \& e+ R/ Y. |; h
2 q4 M; R( l' ]1 ?5 w  `
在STM32CubeMX生成的工程中,APP工程还需要修改内存分散加载文件,以适配APP工程的内存偏移,如下图所示。
3 |2 X; {9 T' Z1 |: Z/ L5 ]
; J( L$ u7 P) C$ `. J- O

& Z2 R& ?2 {0 {$ m
15.png
▲ 图4. 修改APP工程的内存分散加载链接文件
$ f* w: ]* B, D* r! c0 j" O

6 E- r( n" d% {: Q" C修改代码里中断向量表的偏移地址,如下图所示:, \& E- Z) q- \) J% b* T2 C
16.png
▲ 图5. 修改APP工程的中断向量表偏移值
0 T& b% \8 u1 f3 Q! Q! l
在APP的主循环中添加LD3的闪灯程序,如下图所示:
7 a" e* r# T9 L) d  f! X
9 D) b: _' d9 a/ Z6 f  C
6 `8 E* I2 B4 Y6 \# }4 D
17.png
▲ 图6. APP工程的主循环

4 H4 T0 m8 v) p0 Z
03
调试配置
; Q! T1 \; F8 h6 X
准备好工程后,接下来我们就可以配置BOOT工程的调试选项了。在BOOT工程的调试选项中,新增APP工程的调试配置,如下图所示:5 f  M/ P* u3 B% `! t
18.png
▲ 图7. BOOT工程的Debug Configuration选项

% {. W- }. R% g, i: X

7 J, b& T# H1 z1 N6 r3 f( o注意:这里的Step5中,我们去掉了“Perform build”和“Download”两个选项,目的是仅仅加载APP工程的symbols,不需要重新编译和下载工程。如果勾选这两个选项,调试器建立连接时,会产生错误。
' A% C. s5 v$ f8 A1 q& J: ~% [) g! j* M8 l
* W, m% T# C: \/ b
添加完APP的调试配置后,会在BOOT工程的调试选项中看到如下图所示配置:
; ]1 ^; k8 H, ~6 N$ i# ]
6 S8 m7 X; M. X6 E/ |( e4 y( A

4 U4 B5 p1 c( {$ u* e
19.png
▲ 图8. BOOT工程的完整选项
8 H- G$ F1 t% u5 v- z
1 ]" }5 V. D* w) }$ J
在演示工程联调之前,我们先通过STM32CubeIDE下载APP的工程(在APP工程的Debug configuration中下载程序,或者通过STM32CubeProgrammer下载),然后再通过BOOT的调试选项进入到调试界面。
- ~( N  a# D4 E4 I5 N1 F3 x# f
; d- L$ t, S* M! Y1 ?

' y% u* h6 }- x' p% x我们可以在BOOT工程中设置断点,同时也在APP的主循环中添加断点,然后运行程序,可以看到LD1在闪烁。
. c4 g0 u* {7 _5 [4 `+ w& U+ f3 @7 n1 s

; ~7 |8 Z. C7 Q1 F此时按下开发板的蓝色用户按钮,可以看到LD2也会点亮1秒钟,然后工程停在BOOT工程的断点处。
$ E* D) \1 J9 {: G* ~& c  ^9 p% h- V" M

, I6 t2 ?& T6 c+ Z* ~在调试界面,我们配置调试为汇编单步执行,如下图所示:
# `' l8 c6 H7 Y
9 v- L$ B; J' h4 x. j
; o; n! C; _. ?$ d$ P
20.png
▲ 图9. 配置APP工程的汇编单步执行

3 o$ e% J7 z6 F, o
  U9 T  ~& ]$ n) Q4 L# r# G
这样我们就能清晰的看到程序从BOOT跳转到APP工程的Reset_Handler程序了。如果继续全速运行,可以看到LD1和LD2熄灭,LD3在间隔500毫秒闪烁。" d+ t) {  v+ F6 l; |

" V2 s9 Y7 W3 N7 b6 ?& p

1 V5 }$ E0 G" M) j
04
小结
这里我列举出可能会出错的地方,方便大家顺利实验。6 a! t6 }, ~6 M; t8 Q
( o# s* ]/ ?' w
0 J9 F% k" B: ]" k( ]4 ^  M# ^3 D
1. 在准备好BOOT和APP的工程后,需要先通过STM32CubeIDE将APP的程序下载到开发板上。7 G- N: Z4 p9 @. L
2. 本文档中的演示示例,BOOT工程在跳转到APP代码之前,需要失能ICACHE,因为在APP工程中,ICACHE的初始化函数如果判断到ICACHE是激活的话,会直接进入到错误处理函数,造成APP代码无法往后执行。( C+ R( A0 |+ ^5 c  \$ ~- k

4 f: s* ]  p0 V4 E0 H" }
赞 收藏 评论0 发布时间:2025-3-26 13:24

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版