STM32F469I discovery板卡打印输出调试
-----东方青
声明:之所以写此文,原因是在使用STM32F469I discovery板卡进行调试时,浪费了我的一点时间,所以将其记录下来。
关于输出打印对硬件调试的重要性,好像我已经在不止一篇文章中重点讲过了(不包括本文),但是在这里还是要在说一次,打印输出对硬件的调试非常重要,我认为它的重要性和存在性在很多时刻要搞过J-Link、ST-Link等等仿真器。具体的不在论证。那么对于STM32F469I discovery板卡,很明显,扩展出来的和GPIO直接相关的外扩接口有Arduino接口、IIC接口和CN12外扩端口。在调试中我们经常使用USART/UART作为打印输出,而关于CN12扩展口也的确扩展出了和USART/UART相关的端口,不过,要使其在电脑PC上打印,那么还需要一个TTL转COMS电平的转换芯片,比如PL2303等。但是由于以前我在调试STM32F7 Discovery板卡时,并没有像CN12的扩展口,那么只有两种选择,从Arduino接口外扩USART/UART接口,或者是选择使用ST-Link自带的ITM接口。我很果断的选择了后者,原因是ST-Link的miniUSB接口集供电、ST-Link输入和打印输出功能于一身,非常好。对于STM32F469I discovery板卡而言,也是基于这个原因,所以我需要使用ITM作为调试端口。
因为前面有过使用的经验了,所以只需要移植一下程序,就可以直接使用了,于是乎我就写了一小段代码,如下图:
没错,就是如上代码,那么疑问就来了,ITM_SendChar ( ch);函数调用时几个意思?它是从哪个疙瘩里冒出来的!具体的我不再解释,可以搜索找到我的文章或者是在MCU的参考手册和ST-Link用户手册能找到答案。ITM_SendChar ( ch);出自core_cm4.h内核头文件。如下图:
没错就是上图了,在内核文件中已经进行了这种方式的支持。
当移植好Demo后,我就尝试使用printf函数进行打印,函数调用如下:
在使用ST-Link工具STM32 ST-LINK Utility_v3.7.0进行打印,如下图:
如上图:首选先选好MCU的工作时钟频率,这里用的是STM32F469的最高时钟频率180MHz。然后Start就开始 了,当程序执行,就会有打印!但是很遗憾,在此板卡中不能打印,呵呵!那么原因是什么呢?那么久需要谈及一个我本不想谈的问题,因为如果不是因为它,我是不会写下此文的。
没错,就是ITM的硬件接口是什么?(在此主要是解决问题,我不再详述),对的,如果我们在某宝上淘到的ST-Link小板,通常就四个接口,分别为SWD、CLK、GND、VCC,这样的小板是不能实现ITM打印输出功能的,在ST-Link标准接口中,还存在SWO这样的一个接口,这可以在STM32各个系列的MCU的参考手册中的关于GPIO口复用的章节可以查找到相应说明,关于ITM的使用,主要在ST-Link的用户手册中说明。所以在硬件上,我们需要找到此端口,那么就得参看STM32F469I Discovery板卡的硬件原理图了。如下图:
如上图,SWO对应的MCU端口就是PB3口,但是在此板卡上,此端口在硬件上进行了复用,即可以作为I2S3的时钟线。所以这两个功能是不能同时使用的,因为现在还没有调试到使用I2S3端口,所以我还是选择使用ITM功能,因为方便,等到使用I2S3口时,在将ITM功能关闭即可。但是想要使用ITM功能,就必须将跳线SB7进行连接,在STM32F7NG Discovery板卡上是默认连接的,但是很悲催,经过仔细查找,在STM32F469I Discovery板卡上,默认连接 但是SB6,SB7断开,这就是为毛我前面不能打印的原因,将其使用一个0欧电阻焊接即可,SB6也没必要拆掉。就此,ITM打印功能就能用了,在这里我只实现了打印功能,如果想接受数据,一样的道理,仔细参看core_cm4.h内核文件的关于ITM的内联函数即可。如下图为我显示结果:
总结:调试硬件就是这样,必须保证软硬件相互配合。此文我只是简单的记录了一下ITM的使用过程,如果需要知详情,可参看我的帖子(http://bbs.ickey.cn/group-topic-id-55581.html),在此声明,此举并非打广告,只是为了方便求知者学习。