STM新闻官 发表于 2025-7-24 15:07

实战经验 | STM32N6平台STM32CubeIDE下printfIO重定向到SWV-ITM

本帖最后由 STM新闻官 于 2025-7-24 15:10 编辑

引言
STM32N6是ST第一款带NPU的基于Cortex-M55内核的MCU,在STM32N6开发过程中,有些开发者希望通过打印信息的方式进行软件调试。为了尽量减少IO占用,客户在使用STM32CubeIDE时希望使用SWV/ITM进行printf内容输出。客户尝试了STM32CubeIDE用户手册中printf重定向的方法,但没有成功。
本文将介绍失败原因及如何实现printf IO重定向到SWV/ITM。

02Printf IO重定向SWV/ITM
Printf重定向一般有三种,使用UART/USART,使用SWV/ITM或者使用SEGGER的RTT功能。我们这里讨论的是STM32CubeIDE下使用SWV/ITM,首先必须将syscalls.c包含在工程里。printf()会调用_write()函数,该函数在syscalls.c中有实现。__io_putchar()会由_write()调用,至于如何修改依赖于硬件与库,手册UM2609中有详细描述,这里就不再赘述。对于STM32N6,使用STM32CubeIDE,具体实现请见下面的逐步描述。
2.1. __io_putchar修改
将printf()重定向SWV/ITM,我们这里需要修改__io_putchar,代码如下。int __io_putchar(int ch)
{
ITM_SendChar(ch);
return(ch);
}

2.2. 使能Trace Clock和Debug Clock
使能Trace Clock和Debug Clock需要通过设置DBGMCU寄存器实现,代码如下:

DBGMCU->CR |=0x00300000;
ITM->TER |= 0x1
ITM->TCR |= 0x00001;

2.3. SWO GPIO设置
以STM32N6-DK板为例,使用芯片型号为STM32N657X0H3(VFBGA264),查询数据手册DB4396,表15.STM32N657xx pin description中有详细描述,PB5管脚可以复用为TRACESWO(AF0_TRACE)。
另外需要特别注意,GPIO B挂在总线AHB4,RCC模块中AHB4ENR负责AHB4 Run或Sleep模式的设置,需要对该寄存器进行设置以使能GPIO B。


参考代码如下:

//SWO is used PB5 pin on STM32N6.
__HAL_RCC_GPIOB_CLK_ENABLE();

gpio_init.Mode = GPIO_MODE_AF_PP;
gpio_init.Pull = GPIO_PULLUP;
gpio_init.Speed = GPIO_SPEED_FREQ_HIGH;
gpio_init.Pin = GPIO_PIN_5;
gpio_init.Alternate = GPIO_AF0_TRACE;
HAL_GPIO_Init(GPIOB, &gpio_init);


上述3个步骤需要修改代码,代码综合起来的示例如下(main.c):


// ################ main.c ####################


int __io_putchar(int ch)
{
ITM_SendChar(ch);
return(ch);
}


int main(void)
{
/* USER CODE BEGIN 1 */
GPIO_InitTypeDef gpio_init;
/* USER CODE END 1 */


/* MCU Configuration--------------------------------------------------------*/
HAL_Init();
/* USER CODE BEGIN Init */
DBGMCU->CR |=0x00300000;
ITM->TER |= 0x1;
ITM->TCR |= 0x00001;
//SWO is used PB5 pin on STM32N6.
__HAL_RCC_GPIOB_CLK_ENABLE();

gpio_init.Mode = GPIO_MODE_AF_PP;
gpio_init.Pull = GPIO_PULLUP;
gpio_init.Speed = GPIO_SPEED_FREQ_HIGH;
gpio_init.Pin = GPIO_PIN_5;
gpio_init.Alternate = GPIO_AF0_TRACE;
HAL_GPIO_Init(GPIOB, &gpio_init);

/* USER CODE END Init */


/* Configure the system clock */
SystemClock_Config();
   … …
   
   /* Infinite loop */
   while (1)
   {
   … …
   }




2.4. SWV Core Clock setting
STM32CubeIDE中SWV core clock需要设置为SYSA/8,如下图1所示,例子中SYSA为400MHz,TPIU为50MHz,则SWV Core Clock需要设置成TPIU 50MHz,如下图2;



▲ 图1. STM32N6 TPIU Clock设置

▲ 图2. STM32N6 STM32CubeIDE Debugger SWV Core Clock设置
2.5. SWV ITM data console设置
如下图3“SWV Port设置与Data Console使用”所示,debug模式下,打开SWV ITM Data Console窗口,打开设置窗口,设置ITM Stimulus Ports,勾选Port 0,确定即可开启Printf数据的输出。详细的介绍请参考手册UM2609,3.2 Debug with Serial Wire Viewer tracing(SWV)一节。



▲ 图3. SWV Port设置与Data Console使用至此,设置已经完成,Data Console中已经可以有正常的printf数据输出了。

03小结
本文介绍了STM32N6使用STM32CubeIDE SWV/ITM输出debug信息,实现printf IO重定向到SWV/SWO的具体过程,供有需要的客户参考。


点击按钮下载《STM32N6平台STM32CubeIDE下printfIO重定向到SWV-ITM》原文档。

点击下载
相关阅读



▷实战经验 | STM32N6平台如何使用MCO2输出Clock▷实战经验 | STM32C0 HAL库的SPI驱动导致的Hardfault问题分析▷实战经验 | 关于STM32H7使用LL库生成ADC代码工作异常问题说明▷实战经验 | STM32 AFCI方案TensorBoard的使用介绍




STM新闻官 发表于 2025-7-24 15:11

查看详情

阅读原文
页: [1]
查看完整版本: 实战经验 | STM32N6平台STM32CubeIDE下printfIO重定向到SWV-ITM