
为什么要用printf,废话,不用你用啥? 我在下面的把printf换了一个名,LOG,少打3个字。您也可以换成您喜欢的字母组合,这不是重点。 说是“解决方案+史上最强”,也不过就是下面的几行代码。 笔者仅在CubeMX+HAL+MDK+AC5下,测试过F1和F4。 其他环境要修改后使用。
这里有4种方法重定向printf,必有一款适合你: 1. PRINTF_UART == 1,串口方法。 优点: 就是最多人使用的,大家也最熟悉。 配置简单,容易使用。 各种“PC终端软件”都能用。 缺点: 硬件上要有串口可以用,有时还需要UART转USB接口板(或者仿真器自带VCP/CDC的东东)配合。 2. PRINTF_RTT == 1,Segger_RTT 方法。 (笔者推荐此方法,至少值得尝试一次), 要安装RTT包,简单! 优点: 不占用额外的硬件资源, 据说速度超级快。 有多快,我不知道。 缺点: 要使用专用的PC软件接收,既然是仿真器大佬Segger的产品,自然是Segger的驱动程序功能多多。 使用J-LINK仿真器,就一定要用JLinkRTTViewer等终端软件。 使用CMSIS-DAP仿真器,可以用DRTTView终端软件, 多谢XIVN1987网友 ,不然DAP就不能用RTT了。 使用STLINK仿真器,对不起,用不了。 3. PRINTF_SWO == 1,SWO的方法,这个是启动内核的ITM功能。 优点: 对原程序流的影响最小。 标准的JTAG/SWD/STLINK连接器,都已经准备好了SWO线,也算方便。 缺点: 相比2线的SWD,需要硬件连接一条SWO的输出线。 不能实现双向通信(其他方法都能)。 软件配置SWO功能比较复杂很容易失败,重点是要做SWO速度匹配。 SWO方法不能在JTAG模式下使用,只能是SWD模式。另外,ARM Cotex-M0/M0+也不能用。 MDK/Keil有内置的SWO Viewer,不过不好用,一定要进入Debug模式,好处是各种仿真器都可以用。 J-LINK 和 STLINK 仿真器,有自己的独立的SWO Viewer,不需要Keil进入Debug模式那么麻烦。 4. PRINTF_CDC == 1, CDC的方法,比较逆天的,属于玩具级别,你想用我都拦不住。 优点: 用法与UART一样,各种串口终端软件通杀。 不占用串口。 利用IC本身的CDC-VCP节省了UART转USB接口板。 缺点: IC要有USB硬件,代码增加,软件复杂度增加。 实用中,还有一种方法,称为半主机模式(semihosting),据说速度慢和影响原程序运行严重,没有认真研究过。我甚至怀疑,上面的4种方法里面,有可能有后台使用了半主机模式,知道详情的朋友,请介绍一下。 毕竟printf指令对原程序流是多余的操作,或多或少都会干扰原程序流,特别是在一些速度比较慢的MCU上面。因此,printf的输出项要尽量简短,避免大量连续使用。 如果估计占用MCU时间太多,就要做需求评估。 附件是F103/F407用的完整的工程,与github上传的一样,上面的4种方法都有,可以试一试实现。 github:https://github.com/RadioOperator/STM32_HAL_retarget_printf |
STM32_HAL_retarget_printf-master.zip
下载1.36 MB, 下载次数: 12
多谢您的鼓励。
我还是把F407的例程放出来了,同时也上传了github,留个记录。