不知道有多少人跟我一样不喜欢用断点仿真器什么的,长期以来我唯一的调试工具就是串口打印信息,
但串口打印有以下几个问题:
1:占用串口,这个,完全无解...
2:速度慢,真的很慢....
2:串口输出一般都是用中断方式发送,而经常调试的时候就是需要在中断中观察某些信息,中断的嵌套容易出问题,尤其是在RTOS环境下.
3:RTOS环境下还要考虑Thread Safe,这个倒是可以搞定,驱动上把互斥量用好就行了.
其实STM32之类的Cortex芯片都支持SWO输出,而我们用串口调试很多时候也只是使用TX输出而已,完全可以把Printf的串口TX Retarget到SWO这个脚上,直接使用ST-Link就可以查看打印信息了.
SWO的优势是什么呢?
1:速度快,ARM官方描述的速度:高性能数据速率 - 4 M 字节/秒 @ 50 MHz
2:不占用串口
,其实如果你是用JTAG口的,改成SWD调试,一个脚都不会多占用.
3:因为速度快,所以基本上只需要用Block方式输出,没有中断问题
4:还是因为是Block输出,资源互斥的问题也一起被解决了
硬件条件:你得把芯片的SWO脚接到调试口上,按JTAG接线的话,这个默认已经接上了,不过很多人可能自己只用SWD的两根线,这个就没接了.
代码条件:你得把Printf的输出函数,替换成SWO输出函数,其实这个函数在CMSIS库里已经提供了,就在core_cm4.h里面,如下: 这个会通过ITM 通道0(具体是啥我也没研究
)输出一个字符,很多人用Keil的话,Printf的都是把一个Putchar函数改成了USART的输出字符的函数吧,改成这个就行了.
我的printf以前是自己写的,代码如下: 怎么用:
PC上安装 最新版 的ST-Link Utility,从菜单的ST_LINK那项下面,选择Printf via SWO,就可以打开SWO查看器了
填写正确的芯片速度,后的的Port就是前面的0,如果你先用别的Port,自己查一下对应的寄存器应该怎么改吧,点Start就可以看到SWO的Printf数据了
这里可以看到SWO的速度是2Mbps(说好的4M byte呢
),已经很快了,凑合着用吧,要什么自行车啊!
但串口打印有以下几个问题:
1:占用串口,这个,完全无解...
2:速度慢,真的很慢....
2:串口输出一般都是用中断方式发送,而经常调试的时候就是需要在中断中观察某些信息,中断的嵌套容易出问题,尤其是在RTOS环境下.
3:RTOS环境下还要考虑Thread Safe,这个倒是可以搞定,驱动上把互斥量用好就行了.
其实STM32之类的Cortex芯片都支持SWO输出,而我们用串口调试很多时候也只是使用TX输出而已,完全可以把Printf的串口TX Retarget到SWO这个脚上,直接使用ST-Link就可以查看打印信息了.
SWO的优势是什么呢?
1:速度快,ARM官方描述的速度:高性能数据速率 - 4 M 字节/秒 @ 50 MHz
2:不占用串口
![](https://i-blog.csdnimg.cn/blog_migrate/505a2dda575959002ac46fa81fc93f64.gif)
3:因为速度快,所以基本上只需要用Block方式输出,没有中断问题
4:还是因为是Block输出,资源互斥的问题也一起被解决了
硬件条件:你得把芯片的SWO脚接到调试口上,按JTAG接线的话,这个默认已经接上了,不过很多人可能自己只用SWD的两根线,这个就没接了.
代码条件:你得把Printf的输出函数,替换成SWO输出函数,其实这个函数在CMSIS库里已经提供了,就在core_cm4.h里面,如下: 这个会通过ITM 通道0(具体是啥我也没研究
![](https://i-blog.csdnimg.cn/blog_migrate/d935f0c1a893cb39a8b0d5a99e39748b.gif)
我的printf以前是自己写的,代码如下: 怎么用:
PC上安装 最新版 的ST-Link Utility,从菜单的ST_LINK那项下面,选择Printf via SWO,就可以打开SWO查看器了
填写正确的芯片速度,后的的Port就是前面的0,如果你先用别的Port,自己查一下对应的寄存器应该怎么改吧,点Start就可以看到SWO的Printf数据了
这里可以看到SWO的速度是2Mbps(说好的4M byte呢
![](https://i-blog.csdnimg.cn/blog_migrate/cd4b6e10542efac37c295a8876a6b346.gif)