Debugging 在NucleoSTM32板上设置SWV printf

Debugging 在NucleoSTM32板上设置SWV printf,debugging,arm,stm32,nucleo,Debugging,Arm,Stm32,Nucleo,我正在使用Atolic Truestudio IDE(基本上是Eclipse)在各种STM32L4核子板上开发固件。到目前为止,由于虚拟COM端口,我一直在通过UART使用printf 我想使用STM32-ITM迁移到printf 更确切地说,我研究核子L4A6ZG。调试是通过gdb服务器进行的 在Atolic上,我修改了调试配置,启用了核心时钟为80MHz的SWV。我修改了启动脚本,如STM32L4参考手册所述,如下所示。我不确定这是否必要,因为TrueStudio/Eclipse允许从GUI

我正在使用Atolic Truestudio IDE(基本上是Eclipse)在各种STM32L4核子板上开发固件。到目前为止,由于虚拟COM端口,我一直在通过UART使用printf

我想使用STM32-ITM迁移到printf

更确切地说,我研究核子L4A6ZG。调试是通过gdb服务器进行的

在Atolic上,我修改了调试配置,启用了核心时钟为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_SendChar(无符号长ch)
{
如果((ITM->TCR&ITM\u TCR\u ITMENA\u Msk)!=0UL)和&/*ITM已启用*/
((ITM->TER&1UL)!=0UL))/*ITM端口已启用*/
{
而(ITM->端口[0U].u32==0UL)
{
__asm(“nop”);
}
ITM->端口[0U]。u8=(uint8_t)ch;
}
返回(ch);
}
int写入(int文件,char*ptr,int len)
{
//返回usart\U write(平台获取控制台(),(u8*)ptr,len);
int i=0;
对于(i=0;iPORT[0U]。u8=(uint8_t)ch;

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


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

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

然后按如下所示设置调试配置:

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

最后,在调试项目时,在“串行线查看器设置”下,仅启用(检查)ITM刺激端口上的端口0,如下所示:


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

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

你自己看看:

(核苷-32)


(核苷-64)

只需提及ITM printf在Keil IDE上完美工作。没有什么特别的设置,只需实现我在第一篇文章中显示的
ITM\u SendChar
功能,并打开调试printf窗口。

@GuillaumePetitjean您是否建议您能够使ITM工作,而不必在下面的回答中连接SWO引脚w?根据我对ITM/SWV的理解,这是不可能的。或者你是在不同的核子平台上做的,而不是核子-32?我从来没有使用过核子-32板,只有核子-144板。