本文主要是介绍STM32WB55的SDK使用SWO打印功能的方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
开发过程中,经常需要对调试数据进行打印,一般会使用串口,而STM32一共有2个串口,分别是USART和LPUART,对于一些需要外挂串口设备超过2个及以上的系统来讲,就显得不够用了。这时候SWO功能就排上用场,下面讲讲在STM32WB的SDK及其工程中如何使用SWO功能。
注意:对于STM32,Cortex-M3\M4\M7内核的MCU都有SWO引脚。Cortex-M0内核的MCU没有此功能,例如STM32F0、STM32L0等。
一、首先是引脚链接
对于J-Link而言,其标准20Pin接口都有一个SWO引脚,而一般ST-Link目前也都带了该引脚,如下图。
注意:具体的硬件连接还需要根据实际使用的仿真器进行对应
而STM32WB芯片上使用的是如下引脚,一般在PB3
二、功能配置
以J-Link为例,打开工程配置之后,在Debug选项卡点击Settings
进入之后按照如下配置图选择即可,其中需要注意Core Clock保持与芯片主频使用一致,否则有可能造成乱码等问题
三、软件支持
1、首先是printf重定向
和UART实现printf打印输出类似,UART是重定向printf到UART,而这里是重定向到ITM。只需这两行代码就能实现SWO输出,不像UART一样还要编写UART驱动。重定向实际也就是对fputc函数的重新定向。
SDK中因为已经使用了串口进行打印,已经对fputc函数在dbg_trace文件中进行了定义,因此在该函数中,增加一个宏定义以对SWO的支持进行开关
#define LOG_USE_SWO_EN 1 // 1:支持SWO;0:不支持SWO
并在fputc函数中增加响应的预编译,使其调用 ITM_SendChar 函数进行发送
int fputc(int ch, FILE *f)
{
#if LOG_USE_SWO_EN==0/* temp char avoids endianness issue */char tempch = ch;/* Write one character to Debug Circular Queue */DbgTraceWrite(1U, (const unsigned char *) &tempch, 1);
#elseITM_SendChar(ch);
#endifreturn ch;
}
除此之外,需要在DbgOutputInit函数中,对swo的是能进行开关,即调用LL_DBGMCU_EnableTraceClock函数
void DbgOutputInit( void )
{
/* USER CODE BEGIN DbgOutputInit */
#ifdef CFG_DEBUG_TRACE_UARTif (CFG_DEBUG_TRACE_UART == hw_lpuart1){
# if(CFG_HW_LPUART1_ENABLED == 1)MX_LPUART1_UART_Init();
# endif}else if (CFG_DEBUG_TRACE_UART == hw_uart1){
# if(CFG_HW_USART1_ENABLED == 1)MX_USART1_UART_Init();
# endif}
#endif#if (LOG_USE_SWO_EN==1)LL_DBGMCU_EnableTraceClock();
#endif/* USER CODE END DbgOutputInit */return;
}
此处一定要注意该语句的调用,否则会在打印时,在下面的while语句中进入死循环,造成异常
__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch)
{if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */{while (ITM->PORT[0U].u32 == 0UL){__NOP();}ITM->PORT[0U].u8 = (uint8_t)ch;}return (ch);
}
四、SWO输出的使用
SWO输出的功能只能在Debug仿真模式下才能使用,在下载程序,并启动仿真之后,通过工具栏的view下拉菜单下的serial windows下的Debug(print)viewer即可进行打印观察了
如下几位打印窗口信息
五、SWO优劣势
1. 串口是MCU的片内外设,占用一个外设资源,而SWO不占用外设
2. 使用不同的MCU需要重新编写串口的驱动,而SWO不需要写驱动
3. 串口输出一般使用中断方式发送,调试时可能需要在中断中观察某些信息,这样中断嵌套就容易出现问题,而SWO没有中断问题
4. SWO的速度比串口快得多,在时序要求较高的情况下对代码的影响较小。发送相同的字符串,SWO的速度是串口的8倍以上。
5.当然,SWO也有一个缺点,那就是它是一个单向的通信,也就只能用来打印信息,不能作为输入
这篇关于STM32WB55的SDK使用SWO打印功能的方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!