之前曾经写过一篇 魔改国产ST-LINK V2仿真器,增加SWO支持 的博文,记录了给山寨ST-LINK V2增加SWO引脚引出的方法,而今天要说的是,这个方法在合宙的AIR32系列MCU上实测并不不好用,原因在于:https://wiki.luatos.com/chips/air32f103/switchFromSxx.html#debug-sw-jtag ,这里合宙官方的文档上描述了AIR32与STM32的JTAG关断差异,简单说就是SWD和JTAG同气连枝,要开都开,要关都关,而后面又有关于SWO的描述:https://wiki.luatos.com/chips/air32f103/switchFromSxx.html#traceswo-printf,要使用SWO则必须关掉JTAG但保留SWD(这个目前我理解是SWO的printf输出依赖SWD调试),但是尴尬的是:https://wiki.luatos.com/chips/air32f103/switchFromSxx.html#jtag-jtrst,调试状态关JTAG会导致程序复位,这几个情况叠加在一起就造成了我试验时的现象:接上魔改的ST-LINK V2的SWO,一通配置Keil调试设置和代码设置(具体不写了,百度一搜一大堆),然后调试启动后确实能看到SWO的输出,但是过一小会儿,程序就重置了。。。😂于是,我又开始寻找其它方案(其实最后还是换了带串口的DAP-LINK,走UART打log了,这里记录的是研究过程),最终使用Keil的中间件(应该是这么叫吧)Event Recorder实现了既不依赖SWO,也不用串口,就SWD那几根儿线打log的功能:
首先,这个方法的官网介绍在此:https://www.keil.com/pack/doc/compiler/EventRecorder/html/er_use.html,百度上也有查Event Recorder这个关键字也能搜出不少中文教程说明,大致思路就是EVR中间件会在MCU的内存里开辟一块空间(大小用户指定,越大越不容易丢log),然后打印log的代码不断往这块内存的描述的队列里写,SWD调试不断地读(并移除),然后在IDE上的er窗口中显示出来。
在Keil的Run-Time组件管理中也可以很方便的指定上STDOUT到EVR的重定向,代码中程序入口处做好
EventRecorderInitialize(EventRecordAll, 1U);
EventRecorderStart();
初始化,后面printf就可以了,同时还支持像:EventStartA,EventStopA这类的事件型log API,可以很方便的评估某段逻辑的执行时间等。
最后记录下试验EVR时遇到的一个小坑,最开始用的5.23版本(网上号称的稳定版),死活都看不到EVR的输出,最后在一个国外网站上看到有人问类似的问题,答案说是版本问题,随后直接升级到了5.38,果然,一切正常了。。。😂
最后的最后,这只是个探索过程的记录,最后博主还是又买了一个合宙的AIR32小黑板,刷上最新的DAP-LINK固件(现在又出了个DAP-LINK专用的迷你版,略坑),接上UART的两根线,用中断方式的串口收法数据方式来调试了,毕竟是双向的,而且之前用atmega328p的arduino时也都是这样双向串口调试的,不依赖于SWD调试,可能更方便一些吧。
博主友情提示:
如您在评论中需要提及如QQ号、电子邮件地址或其他隐私敏感信息,欢迎使用>>博主专用加密工具v3<<处理后发布,原文只有博主可以看到。