你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
STMCU-管管 发布时间:2025-7-9 14:03

01

引言

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

0 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 |= 0x1ITM->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; image.png

▲ 图1. STM32N6 TPIU Clock设置

image.png

▲ 图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)一节。

image.png

▲ 图3. SWV Port设置与Data Console使用

至此,设置已经完成,Data Console中已经可以有正常的printf数据输出了。

0 3

小结

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

▼▼▼

收藏 评论0 发布时间:2025-7-9 14:03

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版