在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. sqoop 基本使用
  2. 网站的容错性设计原则
  3. 去IOE:去掉“IE”就Ok?
  4. hadoop的运行机制
  5. 短款Apache Camel K
  6. 大型网站HTTPS 实践(一)| HTTPS 协议和原理
  7. 小汤学编程之JavaEE学习day04——EL表达式、JSTL
  8. 【CentOS 7笔记5】,主机互相登陆#
  9. aop+注解 实现对实体类的字段校验_SpringBoot2.0实战(6)整合hibernate-validator进行参数校验...
  10. 贷款利息及公积金知识点
  11. C#高仿腾讯QQ截图程序(改)
  12. 字节数组byte[]和整型,浮点型数据的转换——Java代码
  13. Sql*plus 联机文档学习
  14. mybatis如何处理参数
  15. 人工智能6.1 -- 机器学习算法篇(一)数据清洗、回归(含实践)
  16. mongodb执行sql脚本文件
  17. MCGS组态屏CRC16(Modbus)校验计算脚本
  18. 狂神HTML5学习笔记
  19. java 常量pi_Java-常量
  20. TikTok云控系统是什么,有什么功能

热门文章

  1. 基于MFC的Media Player播放器的制作(4---功能实现代码)
  2. Centos8重启网卡的问题
  3. 微信小程序之input 边框
  4. 强大、优秀的文件管理软件评测:图片管理、书籍管理、文献管理
  5. 自锁时间电路plc_起动、自锁和停止控制的PLC线路与梯形图
  6. c语言程序设计试题汇编第三版勘误,c语言程序设计基础教程----勘误记录.pdf
  7. The class file xxx contains a signature 'xxx;' ill-formed at position 6 问题的解决
  8. 协方差与皮尔森相关性系数
  9. 土豆网前任CTO开无人便利店,半年达500家
  10. Echarts 思维导图(二)