你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32开发,通过SWO功能输出Printf函数到Utility

[复制链接]
STMCU小助手 发布时间:2022-5-6 09:33
1 概述
1.1 资源概述

开发板:ST官方NUCLEO-F103RB开发板
CUBEMX版本:1.3.0
MDK版本:5.23
主控芯片型号:STM32F103RBT6

{X`AM`Z~~2LPEW)NPKLWW.png

1.2 SWO功能简介
SWO也叫做trace(跟踪)功能,通过此功能,只需要在SWD调试基础上增加一条SWO线缆,就可以实现类似串口输出功能,配合printf函数打印相应的信息到utility窗口中。此功能不占用串口资源,无需在中断中执行。

1.3 ITM(指令跟踪微单元)简介
我们此次功能实现是通过调用ITM实现的。
ITM是一应用驱动的跟踪源,它支持printf类的调试手段来跟踪操作系统(OS)和应用事件,并发布判定的系统信息。ITM以包的形式发布跟踪信息,它由以下部分组成:
● 软件跟踪:软件可以通过直接写ITM激发寄存器来发布包信息。
● 硬件跟踪:ITM会发布由DWT产生的信息包。
● 时间戳:时间戳被发布到相应的包上。ITM包含一个21位的计数器以产生时间戳。Cortex-M3的时钟或串行线观测器(Serial Wire Viewer)的位时钟率给计数器提供时钟。
由ITM发送的信息包输出到TPIU(Trace Port Interface Unit),TPIU再添加一些额外的包(参考TPIU),然后输出完整的包序列给调试器。1

1.4 实现功能
本次程序实现的功能如下
1、复位后,向Serial Wire Viewer(utility)打印信息;
2、按按键BUTTON,LED2灯实现翻转;
对于第二条实现,此次文档不详细描述。

2 硬件连接以及CUBEMX配置

2.1 硬件连接

开发板内部已经将线接好,如下图所示

对于目标板与STLINK仿真器分开的情况,我们需要使用5根线进行连接,如下表所示。

~S)7I4Z$OBTE~(VAQ4~J%6R.png

2.2 CUBEMX配置
选择异步跟踪模式,此时PB3将会自动定义为SWO端口。

2BNOGTP)$Y@7M7@$JB07H`W.png

3 软件开发
3.1 KEIL软件设置

KEIL软件设置如下,这里由于程序使用的内部HSI,系统频率是64MHz,因此填写64MHz,需要根据实际情况进行填写。

94R{}LIQZ%R][HD_M_VT6$A.png

3.2 程序设计
使用CUBEMX生成代码。在主函数中进行修改。
主程序中包含stdio.h函数的头文件,否则将不能识别printf函数。

  1. #include "stdio.h"
复制代码

fputc 函数宏定义。

  1. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
复制代码

函数定义,由于printf调用的是fputc函数,通过这么一个转换,printf函数就能调用ITM函数实现输出功能。
  1. PUTCHAR_PROTOTYPE
  2. {
  3.   ITM_SendChar(ch);
  4.   return ch;
  5. }
复制代码

TIM_Sendchar()函数在core.cm3.h头文件中有进行定义,如下所述

  1. __STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch)
  2. {
  3.   if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) &&      /* ITM enabled */
  4.       ((ITM->TER & 1UL               ) != 0UL)   )     /* ITM Port #0 enabled */
  5.   {
  6.     while (ITM->PORT[0U].u32 == 0UL)
  7.     {
  8.       __NOP();
  9.     }
  10.     ITM->PORT[0U].u8 = (uint8_t)ch;
  11.   }
  12.   return (ch);
  13. }
复制代码

在主函数main()中增加printf函数,实现输出。

  1. printf("** Test finished successfully. ** \n\r");
复制代码

4 实验结果与总结

4.1 实验结果

打开utility软件,点击printf via SWO viewer。

Z_BSU4B137~`(900%S_WI$Y.png

设置频率,点击Start,将调试板复位(程序设置只运行一次printf,因此每输出一次均需要重新复位),即可发现SWV窗口输出了相应的信息。

S(7WHRURI(F7U{YX34V5_GO.png

4.2 总结
在传统的调试中,我们可能偏向于断点分析或者LED灯的亮灭来判定程序运行状态,但是都不是太直观,对于程序越大越不好操作。使用这个SWO功能能很大程序解决这个问题。我们可以在各种错误处理函数增加相应的提示信息,协助我们进行软件开发工作。



8P7$UNOG]BI_8I709}5B_B0.png
SZZ~WX0Z5%N4N8T8R1BSDAU.png
收藏 评论0 发布时间:2022-5-6 09:33

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版