原创: 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的更多相关文章

  1. php调试利器之phpdbg

    信海龙的博客 php调试利器之phpdbg 简介 PHPDBG是一个PHP的SAPI模块,可以在不用修改代码和不影响性能的情况下控制PHP的运行环境. PHPDBG的目标是成为一个轻量级.强大.易用的 ...

  2. 移动端调试利器之vconsole

    说明 由于移动端项目在手机中调试时不能使用chrome的控制台,而vconsole是对pc端console的改写 使用方法 使用 npm 安装: npm install vconsole 使用webp ...

  3. PHP 调试利器之 PHPDBG

    简介 PHPDBG是一个PHP的SAPI模块,可以在不用修改代码和不影响性能的情况下控制PHP的运行环境. PHPDBG的目标是成为一个轻量级.强大.易用的PHP调试平台.可以在PHP5.4和之上版本 ...

  4. 调试利器之tcpdump详解

    简介你执行 man tcpdump 命令,你会看到文档中对tcpdump的说明是“dump traffic on a network”.可见,tcpdump是一个根据使用者的定义对网络上的数据包进行截 ...

  5. Win下必备利器之Cmder

    诚言,对于开发码字者,Mac和Linux果断要比Windows更贴心;但只要折腾下,Windows下也是有不少利器的.之前就有在Windows下效率必备软件一文中对此做了下记载:其虽没oh-my-zs ...

  6. C#编程利器之二:结构与枚举(Structure and enumeration)【转】

    C#编程利器之二:结构与枚举(Structure and enumeration) 在上一篇文章中,介绍了类如何封装程序中的对象.而实际中,出了类可以封装对象外,结构和枚举也可以封装一些对象,本文将着 ...

  7. 大数据并行计算利器之MPI/OpenMP

    大数据集群计算利器之MPI/OpenMP ---以连通域标记算法并行化为例 1 背景 图像连通域标记算法是从一幅栅格图像(通常为二值图像)中,将互相邻接(4邻接或8邻接)的具有非背景值的像素集合提取出 ...

  8. 后台任务利器之Hangfire

    后台任务利器之Hangfire 一.简述 Hangfire作为一款高人气且容易上手的分布式后台执行服务,支持多种数据库.在.net core的环境中,由Core自带的DI管理着生命周期,免去了在NF4 ...

  9. Android开发利器之ActivityTracker

    版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/113 Android开发利器之ActivityTracke ...

随机推荐

  1. uva 1400 "Ray, Pass me the dishes!" (区间合并 最大子段和+输出左右边界)

    题目链接:https://vjudge.net/problem/UVA-1400 题意:给一串序列,求最大子段,如果有多个,输出字典序最小的那个的左右端点 思路: 之前写过类似的,这个麻烦点需要输出左 ...

  2. Hadoop 单节点(或集群)基本配置信息

    1. 默认配置文件: 存放于Hadoop对应的jar包中 core-default.xml hdfs-default.xml yarn-default.xml mapred-default.xml 2 ...

  3. 《你必须知道的495个C语言问题》读书笔记之第1-2章:声明和初始化

    1. C标准中并没有精确定义数值类型的大小,但作了以下约束: (1) char类型可以存放小于等于127的值: (2) short int和int可以存放小于等于32767的值: (3) long i ...

  4. 小菜鸟之java基础

    1. javac 命令的作用: javac 编译器解析 Java 源代码,并生成字节码文件的过程 2. java为什么可以跨平台: ava有虚拟机(JVM),JAVA程序不是直接在电脑上运行的,是在虚 ...

  5. Win10默认输入法怎么打顿号

    这个问题发现于一个月之前,解决于今天,方式百度. 一.主要是想纪念一下我这一个月的蠢操作(贴图证蠢): 这一个月我的顿号都是这样打出来的,(′д` )…彡…彡 二.闲话少叙,说一下解决方式: 之前用的 ...

  6. (六)mybatis 全局配置文件讲解

    目录 properties (属性) settings 全局参数配置 typeAliases 别名设置 typeHandlers 类型处理器 mapper (映射器) 细节 properties (属 ...

  7. (二十二)自定义简化版JDBC(Dbutils框架的设计思想)

    目录 元数据概念 DataBaseMetaData ParameterMetaData ResultSetMetaData 编写简化版的JDBC O-R Mapping 概念 自定义简化版JDBC 元 ...

  8. 排序之希尔排序(JS)

    希尔排序(Shell's Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法.该 ...

  9. javascript中用&&跟||来简化if{}else{}的写法

    原文:javascript中用&&跟||来简化if{}else{}的写法 目录 javascript中用&&跟||来简化if{}else{}的写法 1. if else ...

  10. win10下面opencv安装

    记得以前是安装好的,但是用了conda更新所有包以后,cv2不好用了,试验了很多方法都不管用,最后只能卸载opencv然后重新安装了. 如果电脑上安装了很多版本的python,比如我就安装了pytho ...