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

STM32调试利器之ITM

[复制链接]
STMCU小助手 发布时间:2022-11-25 14:15

STM32 有一个代码跟踪功能,即 ITM,这个调试功能非常强大,可以替代串口输入输出功能,而且只需要占用一根 I/O 线就可以实现。当然它的好处不仅仅体现在这里,在调试嵌入式操作系统代码时你会发现相当方便。不过本篇的重点不在如何利用它进行代码调试,而是如何使能这个功能(实际上只是因为才解决了这个问题,还没正式用它调试代码呢)。

对于 KEIL 的调试方法,我将总结三篇文章,这是第三部分“ITM调试”,第一部分为“基础调试”,第二部分为“数据观察点”。

现在来看一看 ITM 调试的效果图:

8 j% T+ q4 c1 D* A" U! N4 b& D0 F8 s

微信图片_20221125141146.png


! q9 l7 t  x" a4 h5 Q

微信图片_20221125141142.jpg


9 i! m2 S; E: Q6 b/ U1 c4 _

微信图片_20221125141138.jpg


" W% _6 G9 R0 j

微信图片_20221125141133.png


; U, l5 }4 L+ a0 n, _

以上所有的功能都是 KEIL 自带支持的。

1、如果你想观察一个变量的波形怎么办?看第一幅图;

2、如果你想知道中断处理时间怎么办?看第二幅图;

3、如果你想查看程序运行过程是怎样的?看第三幅图;

4、如果你想在电脑上输出调试信息、或者想利用电脑的键盘输入信息,怎么办?看第四幅图。

相信以上问题已经充分调动了你的好奇心了,那么现在正式开始讲述如何利用 ITM 实现以上功能。

首先需要知道一点的就是 STM32 支持多种调试器,这里我以 ST-LINK 为例进行说明。

一般的 ST-LINK 都是采用四线制,即VCC、GND、TMS/SWDIO、TCK/SWCLK,实际上只要再增加一根线就能实现 ITM 调试功能。那么这个神秘的 I/O 口是哪一个呢?


, H8 {& A, u% q) }

微信图片_20221125141124.png

7 C4 ]) i3 U5 i+ O2 s& r) {& M

就是 PB3 了,所以如果你需要使用 ITM 调试的话,你就需要保留这个 I/O 口了,不过这个 I/O 口的复用功能还挺多的,所以如果你想利用它的复用功能,就只能先用 ITM 调试其它的功能模块,和 PB3 有关的功能模块就留在最后用别的调试方法调试了。

对于实验室自制的 ST-LINK需要引出一根线,即 PA10,最后的引出线如下所示:


5 q$ B, {+ c) l" Q- ?- p

微信图片_20221125141117.jpg


' ?# Q- v* m! |! n1 N: g

这就是 ITM 的硬件支持了。这里再说一点,CMSIS-DAP 调试器并不支持这个功能,但是 J-LINK 是可以的。

现在再看看软件上需要怎么做。

首先在 KEIL 中启动这个功能:


  j' n' y5 K( L$ Z/ s3 Y

微信图片_20221125141111.jpg


1 c+ n# p: i6 {, A

微信图片_20221125141104.jpg


4 T2 G' z. i5 L# g# w

微信图片_20221125141059.jpg

5 R! C' M2 v& u6 ]- D% h

这样就可以了(这只是最简单的配置,更具体的可以通过上面的界面根据需要自行配置)。

为了实现调试信息的 printf 函数输出和 scanf 函数的输入功能,还需要在代码中增加一部分代码支持。可以采用如下最简单的代码实现:


9 S& O: q; D* j6 _

微信图片_20221125141054.jpg


/ M& ]9 h5 E$ [* l

根据网上比较规范的写法是这样的:


- |- h' ~# Q1 f) x

微信图片_20221125141050.jpg


9 ~7 c8 D& Z, z% f

这里的 ITM_CheckChar()、ITM_ReceiveChar()、ITM_SendChar() 函数在 core_cm3.h中。而上面部分代码可以从安装路径下的 X:KeilARMStartupRetarget.c 文件中进行修改。网上资料说 __backespace 函数也必须要实现,实际测试发现并不需要。

然后说一说 ITM_RxBuffer 这个变量,需要首先初始化为 ITM_RXBUFFER_EMPTY,这个变量用于缓存键盘输入的数据的,当你从 Debug(printf)Viewer 中输入数据时,每输入一个数据,都会实时传输到这个变量当中,单片机就从这个变量获取键盘数据(这个变量的数据写入应该是通过 ST-LINK 写入的,毕竟 ST-LINK 是可以在线更改内存数据的)。

现在进入 debug 模式:

; R! Z( w7 j% y1 }+ D/ p

微信图片_20221125141040.png

6 {- x0 V, G: f

点击这个图标,就可以进行程序下载和进入 Debug 模式。

通过以下方式开启输入输出窗口:


0 M8 R9 v6 X) M' ?

微信图片_20221125141029.jpg


6 c! L: m3 w# ]) b# H: |, X% f

然后就可以在这个窗口输入输出数据了:


/ e/ U! O  E$ Y: z0 d6 K6 F6 h

微信图片_20221125141024.jpg

, @: v$ _) c+ e; {+ s) E

然后是逻辑分析仪(这个功能将使用单独一小节进行介绍):

首先添加需要观察波形的变量:


6 d3 i' a$ ]4 Y9 H* K2 r6 M4 W

微信图片_20221125141017.jpg

! l6 V; ?) ]* L9 a  l! l, i/ F1 s

然后就能通过逻辑分析仪观察波形了:

6 h; J, ]. E, P8 y9 s! F

微信图片_20221125141010.jpg


6 q2 [3 H% p1 G

如果说不能观察波形,那么试试改这个参数:


) b+ n* s: r- L* e! q6 G4 N4 ?

微信图片_20221125141002.png

1 o3 v7 C6 h0 i

然后是跟踪功能窗口开启:


$ [: T9 ^* T9 w+ ~& L- P

微信图片_20221125140956.jpg


2 `# o- J2 _: `0 z4 }- B" b- W) Z

功能窗口:


& `* w: _1 s- C& t; {5 m, J

微信图片_20221125140951.jpg

1 i+ C8 t9 i" Y. i$ m

微信图片_20221125141740.png

. F$ L; t) Z, Y7 n  V& d$ u

微信图片_20221125140947.jpg


+ c: z& N! }1 `7 V

测试示例代码:


3 O. L) N: Y+ `9 Q

微信图片_20221125140943.jpg


0 S0 K% z" J3 {: x& e$ c- W6 ^7 O

现在有个问题就是有时候莫名其妙的就不能发送数据了,这个问题只能在深入调试机制后再看了。

ITM 的使用介绍基本就是这些了,后续将利用 uCOS II 操作系统实际调试一番!这里需要利用一个软件uCProbe,感兴趣的可以自行尝试。

' u: V) |2 d9 n  A& P/ u
转载自:Osprey

  \* d+ ?8 s% s" W, x2 R! o' t9 k+ _/ Q' @5 ?8 J1 |! P
赞 收藏 评论0 发布时间:2022-11-25 14:15

举报

0个回答

所属标签

相似技术帖

官网相关资源

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