[STM32F4]

[STM32F413]ITM打印功能的使用

[复制链接]
2951|15
手机看帖
扫描二维码
随时随地手机跟帖
zhanzr21|  楼主 | 2017-1-21 10:38 | 显示全部楼层 |阅读模式
首先不是说嫌弃串口,串口调试大多数时候是最可靠的, 而且好多时候根本没有别的用,串口基本上永远是available的, 就像不离不弃的老朋友.

但是起码有如下几个时候用串口不方便:
1.引脚被占用
2.串口要接其他模块
3.需要打印实时性较强,串口设定得快也得考虑电脑串口的最高波特率, 一般情况下256000就是上限
4.就是不想接串口线...或者根本没有串口线....

那么这时候,就应该使用ITM打印了, 尤其是ST做的Nucleo,Discovery板子, 已经把SWO跟你接上了, 不用就是对不起ST.
当然也要提醒一下, ITM打印在某些M0的片子上没有, 比如XMC1100系列, 还有的同学只有那种最便宜的STlink,四根线那种,也没法用ITM
但总而言之,多掌握一种调试方法总是好的, 实际情况下有更大的自由度.

闲话结束, 步入正题.

首先把你的工程架起来, 我手上是STM32F413 Nucleo的板子, 事实上任何一个STM的Nucleo,Discovery板子都是一样设置.
这里假定你已经用CubeMX或者自己从头到尾建立起可用的F413工程起来了.

第一步:重定向STDOUT,如果是用MDK5新的Runtime的工程,点这里:
keil_runtime_pack.png
打开后选这里:
keil_retarget_itm.png
整好后,点确认.先不慌重新编译.

第二步:设置ITM监视Port
把项目的选项打开,到这界面来:
swo_setting.png
这几个地方注意点就可以了, 时钟要跟你HCLK一样, Trance Enable要打开, 下面的那些端口默认都是打开的,用两个一头一尾两端口就够了,多了会拖速度. 当然这个Trace功能一定会拖一点速度的.

第三步:加打印, 重新编译,调试
主循环中加一句比如这样的代码:
                printf("This is a printf Test %u\n", i++);
下载 调试.
打开这窗口:
debug_printf_viewer.png
看到有输出就可以确定功能设置好了.
当然你要调试的位置都得加打印, 其余工作就可以开展了.

除了Keil自己的prinf窗口 这个工具也能看输出:
stlink_utility_swo.png
个人人觉得能用这个窗口的情况, 尽量不要用串口打印来调试.
多谢观看.


mmuuss586| | 2017-1-21 11:44 | 显示全部楼层
谢谢分享

使用特权

评论回复
typeof| | 2017-1-21 17:23 | 显示全部楼层
一般都是直接调用出串口1作为输出。

使用特权

评论回复
typeof| | 2017-1-21 17:27 | 显示全部楼层
楼主如果使用的连续调试,这个的打印功能也能实现吗?

使用特权

评论回复
zhanzr21|  楼主 | 2017-1-21 17:41 | 显示全部楼层

使用特权

评论回复
jkl21| | 2017-1-21 17:48 | 显示全部楼层
typeof 发表于 2017-1-21 17:27
楼主如果使用的连续调试,这个的打印功能也能实现吗?

能实现打印功能。

使用特权

评论回复
jkl21| | 2017-1-21 17:51 | 显示全部楼层
typeof 发表于 2017-1-21 17:23
一般都是直接调用出串口1作为输出。

直接使用printf也可以吗?

使用特权

评论回复
snakeemail| | 2017-1-21 21:04 | 显示全部楼层
这个好久前都出了,但是用的人还是少

使用特权

评论回复
90houyidai| | 2017-1-21 21:26 | 显示全部楼层
mark,改天试试

使用特权

评论回复
michael_llh| | 2017-1-21 21:26 | 显示全部楼层
这个技巧赞!

使用特权

评论回复
lu_power| | 2017-1-22 00:55 | 显示全部楼层
很好,试试看

使用特权

评论回复
SULJE| | 2017-1-22 10:52 | 显示全部楼层
标记一下!谢谢分享

使用特权

评论回复
科技猎人| | 2017-1-22 11:40 | 显示全部楼层
百度一下“SEGGER_RTT”,替代串口实现高速双向输入输出,不占用额外引脚,对所有有SW调试接口的单片机都通用,比ITM更强。

使用特权

评论回复
zhanzr21|  楼主 | 2017-1-22 14:27 | 显示全部楼层
科技猎人 发表于 2017-1-22 11:40
百度一下“SEGGER_RTT”,替代串口实现高速双向输入输出,不占用额外引脚,对所有有SW调试接口的单片机都通 ...

还百度干什么, 就在这给我们讲一下啊

使用特权

评论回复
Stannis| | 2017-1-22 15:43 | 显示全部楼层

一般都是直接调用出串口1作为输出。

使用特权

评论回复
springvirus| | 2017-1-22 15:50 | 显示全部楼层
楼主辛苦了,改天试试

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:每天都進步

91

主题

1005

帖子

34

粉丝