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引脚。

7  联系我们

  如果您在学习SWO调试时遇到了什么问题,淘宝店铺搜索《万般电子》,通过旺旺联系我们,我们将尽心尽力为您解答、解决。

本文档由万般电子编写,版权所有。仅供个人学习使用,未经许可不得用于其它任何用途,否则追究相应责任。

使用SWO代替UART,实现Printf打印功能的更多相关文章

  1. 【安富莱专题教程第7期】终极调试组件Event Recorder,各种Link通吃,支持时间和功耗测量,printf打印,RTX5及中间件调试

    说明:1.继前面的专题教程推出SEGGER的RTT,JScope,Micrium的uC/Probe之后,再出一期终极调试方案Event Recoder,之所以叫终极解决方案,是因为所有Link通吃.  ...

  2. stm32_f103使用gcc编译的环境下printf打印函数的实现

    前记   gcc编译使用的printf打印函数需要的底层函数是和其他编译器不同的,以前的是无法使用的,这里有两种方法,一种是使用gcc库里面的printf函数,自己实现底层IO函数_write.另外一 ...

  3. jQuery:实现网页的打印功能

    实现的打印功能大致跟浏览器的 Ctrl+P 效果一样 一.直接上代码 <!DOCTYPE html> <head> <meta charset="utf-8&q ...

  4. C#程序调用CodeSoft预先设计好的标签模块实现打印功能

    if (this.tbSetLabel.Text.Trim() == "") { MessageBox.Show("请先 Enter 选择标签模板文件!", & ...

  5. 完美演绎DevExpress XtraPrinting Library 的打印功能

    完美演绎DevExpress XtraPrinting Library 的打印功能 2010-05-14 17:40:49|  分类: 默认分类|字号 订阅     设计报告不仅费时间,而且还乏味!但 ...

  6. printf 打印 unit32_t

    今天在网上找了老半天终于找到了:printf 打印 uint32_t 类型  uint32_t domainId; printf("\ndomainId=========%lu", ...

  7. web页面实现指定区域打印功能

    web页面实现指定区域打印功能 使用CSS,定义一个.noprint的class,将不打印的内容放入这个class内. 详细如下: <style media=print type="t ...

  8. vc 实现打印功能

    Visual C++6.0是开发Windows应用程序的强大工具,但是要通过它实现程序的打印功能,一直是初学者的一个难点,经常有朋友询问如何在VC中实现打印功能,他们往往感到在MFC提供的框架内实现这 ...

  9. 开源的javascript实现页面打印功能,兼容所有的浏览器(情况属实)

    这篇文章完全是属于技术文章,也是记录一下自己在项目当中遇到的坑爹问题啊,因为是B/S的程序,所以打印功能还是必须要有的,对于打印我选择了一个js插件,发现非常的简单和方便,所以这里拿出来和大家分享一下 ...

随机推荐

  1. MyBatis的关联查询

    关联映射的一对多 //查询经理角色 以及 该角色下对应的员工集合 public SmbmsRole getRoleAndUser(Integer id); <resultMap id=" ...

  2. sql 存储过程set nocount on 的作用

    在存储过程中,经常用到SET NOCOUNT ON: 作用:阻止在结果集中返回显示受T-SQL语句或则usp影响的行计数信息.当SET ONCOUNT ON时候,不返回计数,当SET NOCOUNT ...

  3. iSCSI引入FC/SAN

    由 cxemc 在 2013-9-24 上午9:10 上创建,最后由 cxemc 在 2013-9-24 上午9:10 上修改 版本 1 集成iSCSI 和FC SAN有五种常见的方法,各有优缺,适应 ...

  4. Splay P3369 【模板】普通平衡树(Treap/SBT)

    题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删除一个) 查询x数的排名(排名定义为比当前数小的数的个数+1.若有多 ...

  5. 2019暑期金华集训 Day1 组合计数

    自闭集训 Day1 组合计数 T1 \(n\le 10\):直接暴力枚举. \(n\le 32\):meet in the middle,如果左边选了\(x\),右边选了\(y\)(且\(x+y\le ...

  6. [线性代数] 线性子空间入門 Basic Vector Subspaces

    导语:其他集数可在[线性代数]标籤文章找到.线性子空间是一个大课题,这里先提供一个简单的入门,承接先前关于矩阵代数的讨论,期待与你的交流. Overview: Subspace definition ...

  7. [转载]virtual topology虚拟拓扑

    原文地址:topology虚拟拓扑">virtual topology虚拟拓扑作者:一丝尘埃 topology虚拟拓扑" title="[转载]virtual to ...

  8. Java类的变量初始化顺序

    大家在去参加面试的时候,经常会遇到这样的考题:给你两个类的代码,它们之间是继承的关系,每个类里只有构造器方法和一些变量,构造器里可能还有一段代码对变量值进行了某种运算,另外还有一些将变量值输出到控制台 ...

  9. mysql中查询某个字段重复的数据

    SELECT corp_name,count(*) as sums FROM corp_tax WHERE corp_year = 2018 AND corp_month = 8 group by c ...

  10. JVM的内存配置参数

    JVM的结构问题:JVM分两块:PermanentSapce和HeapSpace, HeapSpace = [old + new{=Eden,from,to}] PermantSpace主要负责存放加 ...