在 Nucleo STM32 板上设置 SWV printf

     2023-02-19     49

关键词:

【中文标题】在 Nucleo STM32 板上设置 SWV printf【英文标题】:Setting up SWV printf on a Nucleo STM32 board 【发布时间】:2018-12-07 06:52:33 【问题描述】:

我正在使用 Atollic Truestudio IDE(基本上是 Eclipse)在各种 STM32L4 Nucleo 板上开发固件。到现在为止,我通过 UART 使用 printf,这要归功于 Virtual COM 端口。

我想使用 STM32 ITM 迁移到 printf。

更准确地说,我在 Nucleo-L4A6ZG 上工作。通过 gdb 服务器进行调试。

在 Atollic 上,我修改了我的调试配置以启用具有 80MHz 核心时钟的 SWV。我已经按照 STM32L4 参考手册中的描述修改了我的启动脚本,如下所示。我不确定是否有必要,因为 TrueStudio/Eclipse 允许从 GUI 设置 SWV,但这样似乎更容易:

# Set character encoding
set host-charset CP1252
set target-charset CP1252

# Reset to known state
monitor reset

# Load the program executable
load        

# Reset the chip to get to a known state. Remove "monitor reset" command 
#  if the code is not located at default address and does not run by reset. 
monitor reset

# Enable Debug connection in low power modes (DBGMCU->CR) + TPIU for SWV
set *0xE0042004 = (*0xE0042004) | 0x67

# Write 0xC5ACCE55 to the ITM Lock Access Register to unlock the write access to the ITM registers
set *0xE0000FB0 =0xC5ACCE55

# Write 0x00010005 to the ITM Trace Control Register to enable the ITM with Synchronous enabled and an ATB ID different from 0x00
set *0xE0000E80= 0x00010005

# Write 0x1 to the ITM Trace Enable Register to enable the Stimulus Port 0
set *0xE0000E00= (*0xE0000E00) | 0x1

#write 1 to ITM trace privilege register to unmask Stimulus ports 7:0
set *0xE0000E40= (*0xE0000E40) | 0x1



# Set a breakpoint at main().
tbreak main

# Run to the breakpoint.
continue

我修改了我的 _write 函数如下:

static inline unsigned long ITM_SendChar (unsigned long ch)

  if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) &&      /* ITM enabled */
      ((ITM->TER & 1UL               ) != 0UL)   )     /* ITM Port #0 enabled */
  
    while (ITM->PORT[0U].u32 == 0UL)
    
      __asm("nop");
    
    ITM->PORT[0U].u8 = (uint8_t)ch;
  
  return (ch);


int _write(int file, char *ptr, int len)

    //return usart_write(platform_get_console(), (u8 *)ptr, len);
      int i=0;
      for(i=0 ; i<len ; i++)
        ITM_SendChar((*ptr++));
      return len;

一步一步调试我看到我到达ITM-&gt;PORT[0U].u8 = (uint8_t)ch;

最后,我在 IDE 的 SWV 控制台中启动了跟踪,但没有得到任何输出。

知道我错过了什么吗? SWV 的核心时钟呢?我不确定它对应的是什么。

【问题讨论】:

【参考方案1】:

我在 Nucleo-F103RB 上遇到了类似的情况。使这项工作起作用的是在 CubeMX 上选择“跟踪异步”调试选项,而不是“串行线”。跟踪异步调试将 PB3 引脚专用为 SWO 引脚。

然后设置调试配置如下: Project debug configuration to enable Serial Wire Viewer (SWV)

另外,我在 main.c 文件本身中定义了 write 函数,更改 syscalls.c 中的定义是行不通的。

最后在调试项目时,在“Serial Wire Viewer settings”下仅启用(检查)ITM Stimulus Ports 上的端口 0,如下所示: Serial Wire Viewer settings in Debug perpective

当我为时间戳和一些跟踪事件启用预分频器时,我注意到一件事,跟踪输出不会显示很多跟踪日志。

【讨论】:

【参考方案2】:

其他人发现这个 - Nucleo 开发板的 Nucleo-32 系列莫名其妙地没有将 SWO 引脚路由到 MCU。 SWO 引脚对于所有 SWV 功能都是必需的,因此它不会按设计工作。更高引脚数的 Nucleo 板似乎已布线。

自己看:

https://www.st.com/resource/en/user_manual/dm00231744-stm32-nucleo32-boards-mb1180-stmicroelectronics.pdf (Nucleo-32)

https://www.st.com/resource/en/user_manual/dm00105823-stm32-nucleo-64-boards-mb1136-stmicroelectronics.pdf (Nucleo-64)

【讨论】:

@GuillaumePetitjean 您是否建议在下面的答案中不连接 SWO 引脚的情况下使 ITM 工作?根据我对 ITM/SWV 的理解,这是不可能的。或者您是在不同的 Nucleo 平台而不是 Nucleo-32 上执行此操作? 我从未使用过 Nucleo-32 板,只使用过 Nucleo-144 板。【参考方案3】:

小型 Nucleo-32 插针板一般不支持 SWO/SWV,但有一个例外:Nucleo-STM32G431KB。截至 2021 年 9 月,这可能是唯一一款小型 Nucleo-32 引脚,非常强大的板,支持 ST-LINK V3 和 SWO。见MB1430 schematic。 尽管我的回答与有关 Nucleo-L4A6ZG(144 针大因子)的原始问题松散相关,但它可能有助于找到此线程的人。

【讨论】:

【参考方案4】:

顺便提一下,ITM printf 在 Keil IDE 上完美运行。没有什么特别的设置,只需实现我第一篇文章中显示的ITM_SendChar 函数并打开调试 printf 窗口。

【讨论】:

stm32wb, nucleo-wb55, 传感器, 硬件

】stm32wb,nucleo-wb55,传感器,硬件【英文标题】:stm32wb,nucleo-wb55,sensor,hardware【发布时间】:2021-09-0820:02:30【问题描述】:我正在使用带有STM32WB55处理器的nucleo-wb55开发板。我想将IIS3DWB、STTS22H等传感器连接到此板上。如何将这些传感... 查看详情

在STM32 Nucleo上多次触发上升沿中断

】在STM32Nucleo上多次触发上升沿中断【英文标题】:RisingedgeinterrupttriggeringmultipletimesonSTM32Nucleo【发布时间】:2021-02-2219:08:31【问题描述】:我正在使用STM32NUCLEO-F401RE微控制器板。我有一个扬声器,可以在向上/向下推动操纵杆时... 查看详情

STM32F4程序只有在按下复位按钮后才会运行

...时间】:2017-08-1913:28:33【问题描述】:我最近购买了一块NUCLEO-F446RE板(STM32F4产品),一个小问题一直困扰着我。我编写的所有代码都可以正常运行,但它们只有在按下NUCLEO板上的重置按钮后才能工作。IDE:Keilv5例如,我为闪烁... 查看详情

STM32F767 Nucleo 板 printf 到控制台

】STM32F767Nucleo板printf到控制台【英文标题】:STM32F767Nucleoboardprintftoconsole【发布时间】:2021-04-1405:08:48【问题描述】:在过去的几天里,我一直在尝试让printf工作以将调试消息打印到STM32CubeIDE控制台。然而,没有运气。我经历了... 查看详情

stm32cubeideswv功能使用方法

关注+星标公众号,不错过精彩内容转自|STM32单片机很多工具都自带有SWV(SerialWireViewer)的功能,之前给大家分享的《打印输出教程》就描述了在Keil、IAR、ST-LINKUtility、STM32CubeProg、J-Link等工具下实现“SWV”的功... 查看详情

stm32cubeideswv功能使用方法

关注+星标公众号,不错过精彩内容转自|STM32单片机很多工具都自带有SWV(SerialWireViewer)的功能,之前给大家分享的《打印输出教程》就描述了在Keil、IAR、ST-LINKUtility、STM32CubeProg、J-Link等工具下实现“SWV”的功... 查看详情

如何设置快速 STM32 F4 FSMC 来控制 STM32F4Discovery 板上的显示?

】如何设置快速STM32F4FSMC来控制STM32F4Discovery板上的显示?【英文标题】:HowtosetupfastSTM32F4FSMCtocontroladisplayontheSTM32F4Discoveryboard?【发布时间】:2017-06-0708:37:41【问题描述】:我将ILI9341显示控制器连接到STM32F407vg微控制器(STM32探索... 查看详情

修复可能由于 STM32 Nucleo-F334R8 上的 malloc 导致的内存覆盖错误

】修复可能由于STM32Nucleo-F334R8上的malloc导致的内存覆盖错误【英文标题】:FixingaMemoryOverwriteerrorslikelyduetomalloconanSTM32Nucleo-F334R8【发布时间】:2019-09-1612:17:51【问题描述】:我希望这是对我的问题的清晰解释,我已经围绕各种手... 查看详情

STM32H743ZI Nucleo 似乎无法通过 FDCAN 2 传输?

】STM32H743ZINucleo似乎无法通过FDCAN2传输?【英文标题】:STM32H743ZINucleoseemsunabletotransmitviaFDCAN2?【发布时间】:2021-03-2602:44:46【问题描述】:我目前正在尝试通过Nucleo上的两个FDCAN发射器发送消息。但我只能通过FDCAN1(经典主机)... 查看详情

STM32:STLink 不再通过 SWD 连接

...化ST-LINK设备时出错。原因:找不到设备目标。在STM32H745NUCLEO板上,我错误地启用了DEBUG接口和SWO引脚。有没有办法硬重置这个板?【问题讨论】:【参考方案1】:“重置时闪烁” 查看详情

STM32 Nucleo F103RB:LD1 使用外部电源缓慢闪烁

】STM32NucleoF103RB:LD1使用外部电源缓慢闪烁【英文标题】:STM32NucleoF103RB:LD1slowblinkingwithexternalsupply【发布时间】:2020-03-1113:40:43【问题描述】:我正在尝试使用带有外部电源(5V)的NucleoF103RB(stm32),但它似乎无法工作,因为LEDLD1在... 查看详情

ARM:使用 stm32l0 nucleo 在几秒钟后自动擦除闪存

】ARM:使用stm32l0nucleo在几秒钟后自动擦除闪存【英文标题】:ARM:flashmemorygetserasedafterafewsecondsautomaticallyusingstm32l0nucleo【发布时间】:2016-04-0306:17:10【问题描述】:将程序刷入nucleo板后遇到一个大问题,这里我使用的是stm32l053r8t6n... 查看详情

基于stm32cubeide实现打印输出功能

...#xff0c;指令跟踪微单元。STM32CubeIDE实现SWV步骤第一步:在Pinout&Configuration选项中打开SWO的功能,此步骤是必须的。 ★图片2STM32CubeIDE中使能SWO功能第二步:重定位printf的接口函数。这里有个简单的方法,直接在sys... 查看详情

stm32nucleo系列开发板的接口

1.首先说的是 Arduino接口,所有的nucleo系列都支持这个接口,而且像F767这种尺寸长的板子也有的,不过是双排排针,其实就是外侧也是 Arduino接口2.板子接上电脑之后有个串口 查看详情

STM32F767ZI nucleo板没有连接USB

】STM32F767ZInucleo板没有连接USB【英文标题】:STM32F767ZInucleoboardnotconnectingwithUSB【发布时间】:2021-05-0702:13:17【问题描述】:我是使用STM32核板的新手。我买了一块STM32F767ZI核板。我安装了STM-link实用程序V4.6版本和stm-link009驱动。当... 查看详情

如何在 Linux 上从 STM32WB55 Nucleo Pack 闪存 MB1355C 和/或 MB1293C?

】如何在Linux上从STM32WB55NucleoPack闪存MB1355C和/或MB1293C?【英文标题】:HowtoflashMB1355Cand/orMB1293CfromtheSTM32WB55NucleoPackonLinux?【发布时间】:2020-04-0622:09:13【问题描述】:我想在我的(Ubuntu18.04.3LTS)机器上通过STM32WB55NucleoPack对(MB1355C和/... 查看详情

Nucleo STM32f103RB/F4 发现

】NucleoSTM32f103RB/F4发现【英文标题】:NucleoSTM32f103RB/F4Discovery【发布时间】:2017-09-0123:21:30【问题描述】:有没有人在Nucleo上通过VCP使用双工通信/或发现带有RXTX中断的单USART。希望有示例代码回显(发送)收到的内容。【问题讨... 查看详情

CAN BUS STM32 Nucleo F429ZI CAN 写入失败

】CANBUSSTM32NucleoF429ZICAN写入失败【英文标题】:CANBUSSTM32NucleoF429ZICANWriteFail【发布时间】:2021-05-0108:45:39【问题描述】:这是Veysel我的主板是STM32NucleoF429ZI,我使用Mbed-os6.6.0。我可以从我的汽车CANBus数据中读取,但我无法在总线上... 查看详情