在PC上编写过C语言的人都知道,printf可以向控制台输出,scanf可以从控制台获取输入,这里的printf/scanf都是标准库函数,利用这些函数,我们可以很方便的调试程序。

printf的方式有很多种,一般情况下,我们可以使用串口或其它接口重定向printf。参见之前的文章《串口printf和USB虚拟串口printf》。也可以使用Jlink等调试工具printf《Jlink使用技巧之RTT和J-Scope》。今天来介绍另外一种printf的方式:基于ITM机制的printf。

1.ITM简介

ITM,(英文:Instrumentation Trace Macrocell,指令跟踪宏单元),是一种针对MCU进行跟踪调试的新方法,与打断点(Breakpoint)不同,ITM方法不需要暂停程序运行,可以在程序全速运行的过程中实时输出变量的数值以便观察,即Trace功能。

2.硬件

ITM是一个硬件存在,Cortex-M3,M4,M7内核的单片机都支持(M0,M0+内核是不支持的),在代码调试过程中,它与Jlink或者ST-LINK等结合,可以实时跟踪MCU的运行状态,查看数据等。ITM只支持SWD接口,不支持JTAG接口,而且相比于一般的SWD调试接口需要SWDIO和SWCLK两根线,ITM则额外需要一个SWO端口。

3.软件

使用时,在工程设置中选择SW接口:

在Trace菜单下使能Trace功能,并设置MCU的内核频率,这里使用的是STM32F407,设置为168MHz,其它默认即可:

ITM机制有专门的几个函数用于收发字符串:

ITM_SendChar(ch)
ITM_CheckChar()
ITM_ReceiveChar()

将其重定向,然后就可以使用printf和scanf函数了。代码如下(别忘了包含stdio.h头文件):

struct __FILE { int handle; /* Add whatever needed */ };
FILE __stdout;
FILE __stdin;int fputc(int ch, FILE *f)
{return(ITM_SendChar(ch));
}volatile int32_t ITM_RxBuffer;
int fgetc(FILE *f)
{  while (ITM_CheckChar() != 1) __NOP();  return (ITM_ReceiveChar());
}

编写测试程序,测试printf和scanf函数:

while(1)
{printf("ITM test AD = %d\r\n",AD++);//打印数据scanf("%c",&c);//等待输入一个字符printf("you input a character \'%c\'\r\n",c);//打印输入的字符
}

进入调试模式后,打开Debug(printf)Viewer窗口:

然后运行程序,在窗口中会打印出调试信息,同时等待输入字符。在窗口中输入字符,程序会继续运行。运行结果如下:

相比于其它方式的printf,ITM还可以支持scanf功能,调试程序时非常方便。ITM功能还有许多实用的功能,比如显示波形等,有兴趣的可以自己探索。

推荐阅读:

STM32CubeMX系列教程

STM32定时器应用合集

几种常用的产生负电源的方法

再介绍一种低成本的负电源电路

欢迎关注公众号"嵌入式技术开发",大家可以后台给我留言沟通交流。如果觉得该公众号对你有所帮助,也欢迎推荐分享给其他人。

ITM机制-不用串口也能printf相关推荐

  1. (转)jLink使用ITM机制实现调试stm32单片机

    ----------------------------------------------------------------------------------------------- 作者:p ...

  2. 009:semihost/ITM机制浅析以及使用JLINK通过ITM调试stm32单片机(转)

    ----------------------------------------------------------------------------------------------- 作者:p ...

  3. semihost/ITM机制浅析以及使用JLINK通过ITM调试stm32单片机(转)

    ----------------------------------------------------------------------------------------------- 作者:p ...

  4. 使用ITM机制实现调试stm32单片机

    使用ITM机制实现调试stm32单片机,实现printf与scanf. 1. ITM简介 ITM机制是一种调试机制,是新一代调试方式,在这之前,有一种比较出名的调试方式,称为半主机(semihosti ...

  5. MDK硬件调试打印调试信息的实现方式---ITM机制的实现

    时调试代码的时候大家都喜欢用printf函数来输出一些打印信息,来提示自己代码的执行情况.在刚开始接触这个调试方法的时候,我采用的方式就是浪费一个芯片的串口,然后利用TTL转USB模块,在PC端的串口 ...

  6. semihost/ITM机制浅析以及使用JLINK通过ITM调试stm32单片机

    使用ITM机制实现调试stm32单片机,实现printf与scanf. ITM简介 ITM机制是一种调试机制,是新一代调试方式,在这之前,有一种比较出名的调试方式,称为半主机(semihosting) ...

  7. (实测可用)STM32CubeMX教程-STM32L431RCT6开发板研究串口通信(printf)

    一.开发板平台简介: 1.开发板资源简介 (1)开发板主芯片型号:STM32L431RCT6 (2)开发板主芯片封装:LQFP-64_10x10x05P (3)开发板主芯片内核:ARM® Cortex ...

  8. STM32中关于串口通信的printf()函数重定向问题

    在STM32串口通信程序中使用printf()函数发送数据非常方便,但是需要先进行简单的配置,下面介绍两种配置方法. 方法一.对工程属性进行配置 第1步:在main.c中包含"stdio.h ...

  9. java中不用impore导入的_java import机制(不用IDE)

    java包有两种导入机制 单类型导入 import java.lang.Object; 这个比较好理解 2. 按需类型导入 import java.lang.*; 这个不是把lang下面的所有的类都导 ...

最新文章

  1. java 文本编辑器替换特殊字符_linux中批量替换文本中字符串--转载
  2. Spring工厂注入例子
  3. php 判断update返回为0_PHP empty函数判断0返回真还是假
  4. [设计模式]中介者模式之Events消息传递实现
  5. linux 检测mysql链接_MySQL笔记
  6. C#中一些日期的相关操作
  7. 我经历的学术与论文写作
  8. 2021-06-18
  9. plt.text函数用法
  10. 修改服务器默认纸张尺寸,默认打印纸张尺寸设定
  11. Linux那些事儿之Linux sysfs -- 剖析版本虽旧,桃花依旧笑春风
  12. 用mission planner或者3drradioconfig软件配置X-ROCK数传电台
  13. 一些常用的网站或工具(二)
  14. 机器学习之线性回归模型的代价函数是凸函数的证明
  15. 用Qemu搭建x86学习环境
  16. R语言绘制矩阵散点图
  17. Python结合telnet命令实现自动化测试dubbo接口
  18. 对不起,我现在喜欢划船了,不喜欢爬山了
  19. Qt安装及配置资源链接
  20. SSWIDL——fits.fz格式批量解压简单方法__太阳数据处理

热门文章

  1. Centos8重启网卡的问题
  2. 四样融合!对东软刘积仁的战略布局,大写的服!
  3. 数字图像处理python实现-形态学处理
  4. 国产软件漏洞分析系列2:泛微OA e-cology 8/9 安全补丁分析之file
  5. R里面数字取整相关的操作有一组函数: ceiling ;floor;trunc; round; signif
  6. 基于PreSCAN Matlab/Simulink的智能驾驶联合仿真【详细图文】
  7. 最好的卡尔曼滤波讲解
  8. ava web开发 高并发处理
  9. 菜鸟学算法——动态规划(二)
  10. 关于遥感bil bsq bip三种格式互换