ITM机制-不用串口也能printf
在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相关推荐
- (转)jLink使用ITM机制实现调试stm32单片机
----------------------------------------------------------------------------------------------- 作者:p ...
- 009:semihost/ITM机制浅析以及使用JLINK通过ITM调试stm32单片机(转)
----------------------------------------------------------------------------------------------- 作者:p ...
- semihost/ITM机制浅析以及使用JLINK通过ITM调试stm32单片机(转)
----------------------------------------------------------------------------------------------- 作者:p ...
- 使用ITM机制实现调试stm32单片机
使用ITM机制实现调试stm32单片机,实现printf与scanf. 1. ITM简介 ITM机制是一种调试机制,是新一代调试方式,在这之前,有一种比较出名的调试方式,称为半主机(semihosti ...
- MDK硬件调试打印调试信息的实现方式---ITM机制的实现
时调试代码的时候大家都喜欢用printf函数来输出一些打印信息,来提示自己代码的执行情况.在刚开始接触这个调试方法的时候,我采用的方式就是浪费一个芯片的串口,然后利用TTL转USB模块,在PC端的串口 ...
- semihost/ITM机制浅析以及使用JLINK通过ITM调试stm32单片机
使用ITM机制实现调试stm32单片机,实现printf与scanf. ITM简介 ITM机制是一种调试机制,是新一代调试方式,在这之前,有一种比较出名的调试方式,称为半主机(semihosting) ...
- (实测可用)STM32CubeMX教程-STM32L431RCT6开发板研究串口通信(printf)
一.开发板平台简介: 1.开发板资源简介 (1)开发板主芯片型号:STM32L431RCT6 (2)开发板主芯片封装:LQFP-64_10x10x05P (3)开发板主芯片内核:ARM® Cortex ...
- STM32中关于串口通信的printf()函数重定向问题
在STM32串口通信程序中使用printf()函数发送数据非常方便,但是需要先进行简单的配置,下面介绍两种配置方法. 方法一.对工程属性进行配置 第1步:在main.c中包含"stdio.h ...
- java中不用impore导入的_java import机制(不用IDE)
java包有两种导入机制 单类型导入 import java.lang.Object; 这个比较好理解 2. 按需类型导入 import java.lang.*; 这个不是把lang下面的所有的类都导 ...
最新文章
- sqoop 基本使用
- 网站的容错性设计原则
- 去IOE:去掉“IE”就Ok?
- hadoop的运行机制
- 短款Apache Camel K
- 大型网站HTTPS 实践(一)| HTTPS 协议和原理
- 小汤学编程之JavaEE学习day04——EL表达式、JSTL
- 【CentOS 7笔记5】,主机互相登陆#
- aop+注解 实现对实体类的字段校验_SpringBoot2.0实战(6)整合hibernate-validator进行参数校验...
- 贷款利息及公积金知识点
- C#高仿腾讯QQ截图程序(改)
- 字节数组byte[]和整型,浮点型数据的转换——Java代码
- Sql*plus 联机文档学习
- mybatis如何处理参数
- 人工智能6.1 -- 机器学习算法篇(一)数据清洗、回归(含实践)
- mongodb执行sql脚本文件
- MCGS组态屏CRC16(Modbus)校验计算脚本
- 狂神HTML5学习笔记
- java 常量pi_Java-常量
- TikTok云控系统是什么,有什么功能
热门文章
- 基于MFC的Media Player播放器的制作(4---功能实现代码)
- Centos8重启网卡的问题
- 微信小程序之input 边框
- 强大、优秀的文件管理软件评测:图片管理、书籍管理、文献管理
- 自锁时间电路plc_起动、自锁和停止控制的PLC线路与梯形图
- c语言程序设计试题汇编第三版勘误,c语言程序设计基础教程----勘误记录.pdf
- The class file xxx contains a signature 'xxx;' ill-formed at position 6 问题的解决
- 协方差与皮尔森相关性系数
- 土豆网前任CTO开无人便利店,半年达500家
- Echarts 思维导图(二)