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

01、引言

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

02、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)    
  {    
      … …   
  } 

2.4. SWV Core Clock setting

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

3.png

▲ 图1. STM32N6 TPIU Clock设置

4.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)一节。

5.png

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

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

03、小结

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

来源:STM32

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。