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);
#else
  ITM_SendChar(ch);
#endif
  return ch;
}

        除此之外,需要在DbgOutputInit函数中,对swo的是能进行开关,即调用LL_DBGMCU_EnableTraceClock函数

void DbgOutputInit( void )
{
/* USER CODE BEGIN DbgOutputInit */
#ifdef CFG_DEBUG_TRACE_UART
  if (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也有一个缺点,那就是它是一个单向的通信,也就只能用来打印信息,不能作为输入

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tristan Tsai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值