• 资料介绍
  • 在线预览
  • 相关推荐
申请入驻 产业图谱

LAT1489 STM32N6平台STM32CubeIDE下printf IO重定向到SWV-ITM

03/06 14:53
1021
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

LAT1489 STM32N6平台STM32CubeIDE下printf IO重定向到SWV-ITM

490.85 KB

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;

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)

{

… …

}

在线预览

相关推荐