
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;
▲ 图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的具体过程,供有需要的客户参考。
来源:STM32
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。