STM32调试利器之ITM
原创: Osprey 鱼鹰谈单片机 2月17日
STM32 有一个代码跟踪功能,即 ITM,这个调试功能非常强大,可以替代串口输入输出功能,而且只需要占用一根 I/O 线就可以实现。当然它的好处不仅仅体现在这里,在调试嵌入式操作系统代码时你会发现相当方便。不过本篇的重点不在如何利用它进行代码调试,而是如何使能这个功能(实际上只是因为才解决了这个问题,还没正式用它调试代码呢)。
对于 KEIL 的调试方法,我将总结三篇文章,这是第三部分“ITM调试”,第一部分为“基础调试”,第二部分为“数据观察点”。
现在来看一看 ITM 调试的效果图:
以上所有的功能都是 KEIL 自带支持的。
1、如果你想观察一个变量的波形怎么办?看第一幅图;
2、如果你想知道中断处理时间怎么办?看第二幅图;
3、如果你想查看程序运行过程是怎样的?看第三幅图;
4、如果你想在电脑上输出调试信息、或者想利用电脑的键盘输入信息,怎么办?看第四幅图。
相信以上问题已经充分调动了你的好奇心了,那么现在正式开始讲述如何利用 ITM 实现以上功能。
首先需要知道一点的就是 STM32 支持多种调试器,这里我以 ST-LINK 为例进行说明。
一般的 ST-LINK 都是采用四线制,即VCC、GND、TMS/SWDIO、TCK/SWCLK,实际上只要再增加一根线就能实现 ITM 调试功能。那么这个神秘的 I/O 口是哪一个呢?
就是 PB3 了,所以如果你需要使用 ITM 调试的话,你就需要保留这个 I/O 口了,不过这个 I/O 口的复用功能还挺多的,所以如果你想利用它的复用功能,就只能先用 ITM 调试其它的功能模块,和 PB3 有关的功能模块就留在最后用别的调试方法调试了。
对于实验室自制的 ST-LINK需要引出一根线,即 PA10,最后的引出线如下所示:
这就是 ITM 的硬件支持了。这里再说一点,CMSIS-DAP 调试器并不支持这个功能,但是 J-LINK 是可以的。
现在再看看软件上需要怎么做。
首先在 KEIL 中启动这个功能:
这样就可以了(这只是最简单的配置,更具体的可以通过上面的界面根据需要自行配置)。
为了实现调试信息的 printf 函数输出和 scanf 函数的输入功能,还需要在代码中增加一部分代码支持。可以采用如下最简单的代码实现:
根据网上比较规范的写法是这样的:
这里的 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 模式:
点击这个图标,就可以进行程序下载和进入 Debug 模式。
通过以下方式开启输入输出窗口:
然后就可以在这个窗口输入输出数据了:
然后是逻辑分析仪(这个功能将使用单独一小节进行介绍):
首先添加需要观察波形的变量:
然后就能通过逻辑分析仪观察波形了:
如果说不能观察波形,那么试试改这个参数:
然后是跟踪功能窗口开启:
功能窗口:
测试示例代码:
现在有个问题就是有时候莫名其妙的就不能发送数据了,这个问题只能在深入调试机制后再看了。
ITM 的使用介绍基本就是这些了,后续将利用 uCOS II 操作系统实际调试一番!这里需要利用一个软件uCProbe,感兴趣的可以自行尝试。
STM32调试利器之ITM的更多相关文章
- php调试利器之phpdbg
信海龙的博客 php调试利器之phpdbg 简介 PHPDBG是一个PHP的SAPI模块,可以在不用修改代码和不影响性能的情况下控制PHP的运行环境. PHPDBG的目标是成为一个轻量级.强大.易用的 ...
- 移动端调试利器之vconsole
说明 由于移动端项目在手机中调试时不能使用chrome的控制台,而vconsole是对pc端console的改写 使用方法 使用 npm 安装: npm install vconsole 使用webp ...
- PHP 调试利器之 PHPDBG
简介 PHPDBG是一个PHP的SAPI模块,可以在不用修改代码和不影响性能的情况下控制PHP的运行环境. PHPDBG的目标是成为一个轻量级.强大.易用的PHP调试平台.可以在PHP5.4和之上版本 ...
- 调试利器之tcpdump详解
简介你执行 man tcpdump 命令,你会看到文档中对tcpdump的说明是“dump traffic on a network”.可见,tcpdump是一个根据使用者的定义对网络上的数据包进行截 ...
- Win下必备利器之Cmder
诚言,对于开发码字者,Mac和Linux果断要比Windows更贴心;但只要折腾下,Windows下也是有不少利器的.之前就有在Windows下效率必备软件一文中对此做了下记载:其虽没oh-my-zs ...
- C#编程利器之二:结构与枚举(Structure and enumeration)【转】
C#编程利器之二:结构与枚举(Structure and enumeration) 在上一篇文章中,介绍了类如何封装程序中的对象.而实际中,出了类可以封装对象外,结构和枚举也可以封装一些对象,本文将着 ...
- 大数据并行计算利器之MPI/OpenMP
大数据集群计算利器之MPI/OpenMP ---以连通域标记算法并行化为例 1 背景 图像连通域标记算法是从一幅栅格图像(通常为二值图像)中,将互相邻接(4邻接或8邻接)的具有非背景值的像素集合提取出 ...
- 后台任务利器之Hangfire
后台任务利器之Hangfire 一.简述 Hangfire作为一款高人气且容易上手的分布式后台执行服务,支持多种数据库.在.net core的环境中,由Core自带的DI管理着生命周期,免去了在NF4 ...
- Android开发利器之ActivityTracker
版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/113 Android开发利器之ActivityTracke ...
随机推荐
- Linux回收站的路径在哪里?
linux 回收站的路径:-/.local/share/Trash
- C++零散知识笔记本
目录 1.符号 1.1符号输出 1.2运算符 2.基本内置类型 wchar_t 3.内置类型所占字节数 内置类型的简写 4.变量的本质 变量与指针的故事 (1)malloc函数 (2)new关键字 5 ...
- [Cometoj#3 A]比赛_枚举/堆
比赛 题目链接:https://cometoj.com/contest/38/problem/A?problem_id=1534 数据范围:略. 题解: 原题没啥意思,就是个暴力枚举. 出了个加强版, ...
- redis单机连接池
一.配置文件 1. db.properties配置文件#IP地址 redis.ip = 127.0.0.1 #端口号 redis.port= #最大连接数 redis.max.total= #最大空闲 ...
- 【Python基础】10_Python中的字典
1.字典的定义 和列表的区别 列表是 有序 对象的集合 字典是 无序 对象的集合 字典用 {} 定义 键 key 是索引 值 value 是数据 键 和 值 之间用 :分割 键 必须是唯一的 值 可以 ...
- Go入门所踩过的坑:cannot find package "" in any of
问题:cannot find package "" in any of.现已按照博客解决,分享一种自己踩得坑欢迎大神指导交流! 首先使用go env查看当前环境变量,新手入门出现找 ...
- C#向远程地址发送数据
static string proxyIpAddress = AppConfig.GetProxyIpAddress; static string proxyUserName = AppConfig. ...
- 3037 插板法+lucas
先说下lucas定理 1)Lucas定理:p为素数,则有: (2)证明: n=(ak...a2,a1,a0)p = (ak...a2,a1)p*p + a0 = [n/p]*p+a0 (注意 这里( ...
- http GET 和 POST 请求的优缺点和误区
(1)post更安全(不会作为url的一部分,不会被缓存.保存在服务器日志.以及浏览器浏览记录中) (2)post发送的数据更大(get有url长度限制) (3)post能发送更多的数据类型(get只 ...
- 函数——es6函数扩展(二)
一.声明 1. let(变量) 可以只声明不给值(默认为undefined),或者是先声明后给值,但是必需声明后再使用,可以重复赋值,可以防止变量泄露: 同一作用域里不能重复的声明,不同作用域里可以, ...