关注+星标公众号,不错过精彩内容
作者 | strongerHuang
微信公众号 | 嵌入式专栏
本文原创首发于公众号『嵌入式专栏』,为《printf系列教程》的一篇,后台回复“printf系列教程”更多该系列更多内容。
1写在前面
SWD:Serial Wire Debug,串行线调试
SWO:Serial Wire Output,串行线输出
SWV:Serial Wire Viewer,串行线查看器
ITM:Instrumentation Trace Macrocell,指令跟踪微单元。
SWO串行线输出是单引脚、异步串行通信,可在Cortex-M3/M4/M7上使用,并由主调试器探测支持。
它是利用Cortex内核中ITM模块来实现此功能。
连接引脚:
SWO输出,需要一根SWO(引脚)线,同时需要借助SWV(查看器)查看数据,我打算整理多种查看方法:
·基于Keil的『Debug(printf)Viewer』
·基于IAR的『Terminal IO』
·基于ST-LINK Utility的『Serial Wire Viewer』
·基于J-Link的『SWO Viewer』
·基于STM32CubeProg的『Serial Wire Viewer』
本文主要是第三种基于STM32CubeProg的『Serial Wire Viewer』,会结合STM32,ST-link工具讲述相关配置。
想更加了解ITM&#xff0c;请参看《printf系列教程03》中第二章节<关于ITM>。
2SWO引脚配置
SWO引脚可以理解为UART的Tx引脚&#xff0c;如果不连接此引脚&#xff0c;则&#xff08;SWV&#xff09;终端不会接收打印信息。
对于STM32而言&#xff0c;只要是Cortex-M3/M4/M7内核的MCU都有SWO引脚。
而Cortex-M0则没有此项功能&#xff0c;包含STM32F0、STM32L0和STM32G0等。
在STM32CubeMX工具中&#xff0c;Debug选项进行如下配置即可。
3SWO输出代码
在STM32CubeProg的『Serial Wire Viewer』显示打印信息 和 ST-LINK Utility类似&#xff0c;与Keil、IAR差异在于&#xff1a;显示的位置不同&#xff0c;MCU中代码其实一样。
3.1 重定义fputc
和UART实现printf打印输出区别就是&#xff1a;将重定义代码中UART发送字符&#xff0c;改为ITM发送字符。
int fputc(int ch, FILE *f)
{ITM_SendChar(ch);return ch;
}
ITM_SendChar说明
这个函数位于core_cm3.h&#xff08;或cm4 cm7&#xff09;中&#xff0c;直接调用即可。
修改ITM端口
比如&#xff1a;修改成使用ITM端口1&#xff0c;修改该函数对应值即可&#xff1a;
提示&#xff1a;若软件修改了ITM端口&#xff0c;需要使能对应ITM刺激(Stimulus)端口才能正常打印输出。
4SWV终端配置及输出
显示终端就是STM32CubeProg这个上位机软件。
STM32CubeProg下载地址&#xff1a;
https://www.st.com/en/development-tools/stm32cubeprog.html
(公号不支持外链接&#xff0c;请复制链接到浏览器打开&#xff09;
推荐阅读我的文章&#xff1a;STM32CubeProg介绍、下载、安装和使用教程
烧写程序到MCU&#xff0c;通过ST-Link连接&#xff0c;打开STM32CubeProg软件&#xff0c;从菜单进入SWV&#xff1a;
配置时钟和使能ITM端口&#xff1a;
提示&#xff1a;ITM端口默认使用port0&#xff0c;也可修改软件&#xff08;见上面软件&#xff09;&#xff0c;实现0~31任意端口。
4.1 输出效果
提示&#xff1a;
1.CPU时钟必须相同&#xff1b;
2.ITM端口号&#xff0c;软件和查看器&#xff08;SWV&#xff09;配置须一致&#xff1b;
5下载
为方便大家理解&#xff0c;提供源码工程下载&#xff0c;参考代码&#xff1a;
STM32F103&#xff08;HAL&#xff09;_SWO
STM32F411&#xff08;HAL&#xff09;_SWO
百度网盘&#xff1a;
https://pan.baidu.com/s/1aYBuHtOgtLqLvj6SsMYlQA
提取码&#xff1a;nbd3
提示&#xff1a;
1.公众号不支持外链接&#xff0c;请复制链接到浏览器打开。
2.源码仅供个人学习参考&#xff0c;不一定适用于实际项目。
3.若链接失效&#xff0c;请关注公众号&#xff0c;回复『printf系列教程』获取最新链接。
6
说明
1.该文档仅供个人学习使用&#xff0c;版权所有&#xff0c;禁止商用。
2.本文由我一个人编辑并整理&#xff0c;难免存在一些错误。
3.本文收录于公众号『嵌入式专栏』&#xff0c;关注微信公众号回复【printf系列教程】即可查看全系列教程。
------------ END ------------
推荐阅读&#xff1a;
USB PD快速充电通信原理
C语言实现面向对象的原理
无MMU抢占式操作系统的抢占工作原理
关注微信公众号『strongerHuang』&#xff0c;后台回复“1024”查看更多内容&#xff0c;回复“加群”按规则加入技术交流群。
长按前往图中包含的公众号关注
点击“阅读原文”查看更多分享&#xff0c;欢迎点分享、收藏、点赞、在看。