使用SWO代替UART,实现Printf打印功能

转载自这里,作者写的不错,担心丢了,所以转载,版权归原作者所有。
JTAG接口中,有个SWO引脚,一直没有在意,也没有去研究过是干嘛用的。直到发现ST-LINK V2-1上也有个SWO引脚,于是去研究学习它的作用,用起来相比UART方得便多。

本文内容已经整理成PDF,提供给大家下载:

https://pan.baidu.com/s/1EhJulPbD6Cp5OohzpQY0Fg&shfl=sharepset 提取码:h43c

1 写在前面

SWO:Serial Wire Output,串行线输出

SWV:Serial Wire Viewer,串行线查看器

ITM:Instrumentation Trace Macrocell,仪器跟踪宏单元

在Cortex-M3\M4\M7系列MCU中,内核的调试组件有一个仪器跟踪宏单元(ITM)。ITM的主要用途是调试信息的输出(例如printf格式输出)。

SWO是单引脚、异步串行通信,可在Cortex-M3\M4\M7内核的MCU使用,由调试器探测支持,利用MCU内核中ITM模块实现。

对于STM32,Cortex-M3\M4\M7内核的MCU都有SWO引脚。Cortex-M0内核的MCU没有此功能,例如STM32F0、STM32L0等。

2 硬件平台

将ST-LINK V2-1与核心板连接,SWO引脚连接到PB3。

如果核心板/开发板为JTAG接口,则可以这样接。JTAG接口中的SWO引脚实际上就是PB3引脚。

查看STM32F103的数据手册,PB3引脚的复用功能为TRACESWO。

3 代码部分

和UART实现printf打印输出类似,UART是重定向printf到UART,而这里是重定向到ITM。只需这两行代码就能实现SWO输出,不像UART一样还要编写UART驱动。(此函BSP_SWO.c文件中)

其中的ITM_SendChar函数位于core_cm3.h(或cm4 cm7)中,直接调用即可。

4 Keil SWO输出配置

4.1 打开Keil工程,进行如图所示的配置。

4.2 把Use MicroLIB勾上。

4.3 配置完成后,先编译通过,然后进入调试模式。

4.4 打开Debug (printf) Viewer窗口。

4.5 点全速运行,就可以看到MCU通过ST-LINK V2-1向编译器输出打印信息了。当然,单步调试也是可以的。

4.6 提供两份配置好的、完整的例程,供大家参考学习。要在您的工程中使用SWO调试,只需将BSP_SWO.c和BSP_SWO.h这个两个文件添加到工程中即可。

5 STM32 ST-LINK Utility SWO输出配置

5.1 运行STM32 ST-LINK Utility,进行如图所示的配置,点击Start就可以了。

5.2 使用Keil下载程序之前,需要断开与STM32 ST-LINK Utility的连接。

否则不能下载,提示连接错误。

6 写在后面

打印信息用串口也可以做到,SWO的优势是什么?

  1. 串口是MCU的片内外设,占用一个外设资源,而SWO不占用外设

  2. 使用不同的MCU需要重新编写串口的驱动,而SWO不需要写驱动

  3. 串口输出一般使用中断方式发送,调试时可能需要在中断中观察某些信息,这样中断嵌套就容易出现问题,而SWO没有中断问题

  4. SWO的速度比串口快得多,在时序要求较高的情况下对代码的影响较小。发送相同的字符串,SWO的速度是串口的8.7倍。

虽然SWO不能像串口那样双向传输,而我们用串口调试很多时候也只是使用TX输出而已。这样看来,SWO引脚用更好的方式替代了串口的TX引脚。

本文档仅供个人学习使用,未经许可不得用于其它任何用途,否则追究相应责任

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值