0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32Cube SWV实时跟踪调试方法

冬至子 来源:聊点嵌入式 作者:聊点嵌入式 2023-11-06 15:28 次阅读

之前的文章在讲到调试的时候,一般都是大家熟悉的调试方法:通过打断点,让程序运行到某一个地方停下来,查看某些变量、寄存器等的状态;单步运行,看程序的执行、跳转是否跟预期一致;比较高级的是设置软断点,比如在读写某一个变量,或是某一变量值到达某种状态时停下。这些方法有一个共同的特征,就是程序要停下来,让我们观察各种信息

有没有一种方法,程序在持续的运行,某些变量的值能够持续的输出给我们,甚至是通过图表的形式给我们观察,甚至是后期保存下来。这样在某些情况下是更直观的、更有效的一种调试方法。

这种方法当然是存在的,比如通常会利用单片机的某一个串口向外发送数据,再通过上位机串口调试软件接收并显示。除此之外,还有另一种方法,通过STM32系列单片机的SWV(Serial Wire Viewer)实时跟踪技术来实现。

接下来我们通过一个简单的例子,看看在CubeIDE下怎么通过单片机的SWV功能结合CubeIDE的ITM(Instrumentation Trace Macrocell)功能实现参数的实时跟踪。需要说明的是,下面关于SWV实时跟踪的功能介绍来源于CubeIDE的用户手册,觉得自己英文水平还行的可以直接去看手册,更权威。

1. 端口配置

我们还是基于正点原子的F767开发板,在CubeMX里新建一个工程,具体设置见下图。默认的Debug模式为JTAG,这里我们改为Trace Asynchronous Sw,调试模式改为SWD。这个时候PB3就会被使能,它的一个复用功能是SWO(Serial Wire Output),这个引脚配合SWD输出实时跟踪数据,也即实现了SWV功能。

图片

2. 调试配置

用CubeIDE打开生成的工程,点击菜单Run->Debug Configurations,新建一个调试配置文件,在调试器标签页里,接口选SWD,使能SWV,Core Clock处填内核实际运行频率,这里是216 MHz。

图片

接下来,连接开发板,进入调试模式。点击菜单Window->Show View->SWV->SWV Trace Log,会在窗口下方打开SWV Trace Log标签,如下图。点击Configure Trace图标进行配置。

图片

在配置窗口里我们使能PC Sampling,对内核PC(Program Counter)值进行采样,分辨率16384 Cycles/sample的含义是每次采样间隔16384个时钟周期。这个值是默认的,考虑到SWO端口异步工作频率为2 MHz,这个分辨率不能太小,否则数据量太大会造成堵塞。Timestamps必须被使能,好知道有事件发生了。后边的预分频值同样与SWO数据量大小有关。

图片

点击SWV Trace Log标签页右方的Start Trace图标,见下图,并启动调试,则会看到SWV Trace Log标签页会持续输出PC Sample数据。

图片

当然,除了输出PC Sample数据之外,还可以配置输出Configure Trace窗口里的各种事件发生的情况,也可以输出某些变量值,甚至是把输出的变量以图表的形式输出。具体配置方法可参考用户手册去研究。

3. 代码利用printf重定向输出消息

我们知道printf是C语言标准库的函数,可以向屏幕打印字符串,嵌入式里一般被重定向到串口。在利用SWV进行调试时,我们可以把printf重定向到ITM的0通道,调试时,用户代码可以利用printf向外发送易读的消息。

首先,Configure Trace里勾选0通道,见下图。然后点击CubeIDE菜单Window->Show View->SWV->SWV ITM Data Console,窗口下方会出现SWV ITM Data Console标签页,可以显示ITM各通道输出的信息。

图片

接下来修改代码,打开工程文件夹->Src->syscall.c文件,这个源文件里的函数配合C库实现系统调用。找到_write函数,完成printf到ITM的重定向。修改如下:

__attribute__((weak)) int _write(int file, char *ptr, int len)
{
  int DataIdx;


  for (DataIdx = 0; DataIdx < len; DataIdx++)
  {
    //__io_putchar(*ptr++);
    ITM_SendChar(*ptr++);
  }
  return len;
}

当然,把注释掉的那一行修改成串口发送的话,就能把printf重定向到串口。

在main.c的while循环里添加如下代码:

while (1)
{
  HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_SET);
  printf("LED0 is offn");
  HAL_Delay(500);
  HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_RESET);
  printf("LED0 is onn");
  printf("%dn",counter++);
}

重新编译,进入调试模式,则可以在SWV ITM Data Console标签页里看到如下打印信息。

图片

4. 小结

基于STM32Cube生态的SWV实时跟踪调试方法就介绍到这里。需要说明的是,此方法在硬件上需要留出SWD接口和SWO引脚,正点原子STM32F767核心板上的SWD接口没有引出SWO引脚,所以连接核心板的SWD无法用到SWV功能,需要通过ST-Link连接底板上的20针JTAG接口实现。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    30

    文章

    5031

    浏览量

    117734
  • STM32
    +关注

    关注

    2239

    文章

    10673

    浏览量

    348772
  • C语言
    +关注

    关注

    180

    文章

    7531

    浏览量

    128763
  • STM32单片机
    +关注

    关注

    58

    文章

    545

    浏览量

    57936
  • SWD
    SWD
    +关注

    关注

    1

    文章

    54

    浏览量

    11672
收藏 人收藏

    评论

    相关推荐

    stm32cube IDE配置方法

    stm32cube IDE配置方法stm32cube MX的方法一样然后编译,Project—Build all, 没有错误警告后,开始下一步:下载程序其实就是利用
    发表于 01-10 07:49

    基于STM32Cube的时钟树配置

    本文档内容介绍了基于STM32Cube的时钟树配置,以及使用操作步骤图解。
    发表于 11-28 18:02 22次下载
    基于<b class='flag-5'>STM32Cube</b>的时钟树配置

    STM32Cube学习之一:点灯

    STM32Cube学习之一:点灯
    发表于 12-12 15:30 20次下载

    介绍STM32Cube的特点及应用

    2014年STM32 Roadshow:STM32Cube简介
    的头像 发表于 07-05 00:26 4844次阅读

    使用STM32Cube轻松开发STM32

    STM32CubeSTM32开发更轻松
    的头像 发表于 07-03 04:30 5333次阅读

    STM32Cube到底包含哪些工具 ?

    STM32Cube到底包含哪些工具?
    的头像 发表于 03-04 10:16 7895次阅读

    STM32Cube介绍

    STM32Cube介绍
    发表于 12-08 15:51 19次下载
    <b class='flag-5'>STM32Cube</b>介绍

    X-CUBE-SBSFU STM32Cube 扩展包的集成指南

    X-CUBE-SBSFU STM32Cube 扩展包的集成指南
    发表于 11-21 17:07 0次下载
    X-<b class='flag-5'>CUBE</b>-SBSFU <b class='flag-5'>STM32Cube</b> 扩展包的集成指南

    UM1722_如何使用STM32Cube中的实时操作系统

    UM1722_如何使用STM32Cube中的实时操作系统
    发表于 11-22 19:16 2次下载
    UM1722_如何使用<b class='flag-5'>STM32Cube</b>中的<b class='flag-5'>实时</b>操作系统

    DB4638_STM32G0系列Azure®STM32Cube实时操作系统软件扩展

    DB4638_STM32G0系列Azure®STM32Cube实时操作系统软件扩展
    发表于 11-23 08:29 0次下载
    DB4638_<b class='flag-5'>STM32</b>G0系列Azure®<b class='flag-5'>STM32Cube</b>的<b class='flag-5'>实时</b>操作系统软件扩展

    STM32Cube的X-CUBE-MEMS1扩展软件中MotionCP实时携带位置库入门

    电子发烧友网站提供《STM32Cube的X-CUBE-MEMS1扩展软件中MotionCP实时携带位置库入门.pdf》资料免费下载
    发表于 07-31 09:55 0次下载
    <b class='flag-5'>STM32Cube</b>的X-<b class='flag-5'>CUBE</b>-MEMS1扩展软件中MotionCP<b class='flag-5'>实时</b>携带位置库入门

    STM32Cube X-CUBE-MEMS1扩展的MotionGR实时手势识别库入门

    电子发烧友网站提供《STM32Cube X-CUBE-MEMS1扩展的MotionGR实时手势识别库入门.pdf》资料免费下载
    发表于 07-31 09:17 0次下载
    <b class='flag-5'>STM32Cube</b> X-<b class='flag-5'>CUBE</b>-MEMS1扩展的MotionGR<b class='flag-5'>实时</b>手势识别库入门

    STM32Cube在线培训

    电子发烧友网站提供《STM32Cube在线培训.pdf》资料免费下载
    发表于 08-01 14:23 1次下载
    <b class='flag-5'>STM32Cube</b>在线培训

    始使用X-CUBE-SBSFU STM32Cube扩展包

    电子发烧友网站提供《始使用X-CUBE-SBSFU STM32Cube扩展包.pdf》资料免费下载
    发表于 08-01 09:22 0次下载
    始使用X-<b class='flag-5'>CUBE</b>-SBSFU <b class='flag-5'>STM32Cube</b>扩展包

    STM32Cube LL库的巧妙之处

    STM32Cube LL库的巧妙之处
    的头像 发表于 09-27 16:26 958次阅读
    <b class='flag-5'>STM32Cube</b> LL库的巧妙之处