LAT1498
Local Application Tips
LAT1498 Rev 1.0 Jan. 2025
STM32N6 平台 STM32CubeIDE printf 重定向到 SWV-ITM
关键字:STM32N6printfSTM32CubeIDE
1. 引言
STM32N6 ST 第一款带 NPU 的基于 Cortex-M55 内核的 MCU,在 STM32N6 开发
过程中,有些开发者希望通过打印信息的方式进行软件调试。为了尽量减 IO 占用,客户在
使用 STM32CubeIDE 时希望使用 SWV/ITM 进行 printf 内容输出。客户尝试了
STM32CubeIDE 用户手册中 printf 重定向的方法,但没有成功。本文将介绍失败原因及如何
实现 printf IO 重定向到 SWV/ITM
2. Printf 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;
LAT1498
LAT1498 - Rev 1.0 page 2/7
ITM->TCR |= 0x00001;
2.3. SWO GPIO 设置
STM32N6-DK 板为例,使用芯片型号为 STM32N657X0H3 (VFBGA264), 查询数
据手册 DB4396,表 15. STM32N657xx pin description 中有详细描述,PB5 管脚可以
复用为 TRACESWOAF0_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;