STM32WB55的SDK使用SWO打印功能的方法

2023-11-09 01:59

本文主要是介绍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打印功能的方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/373539

相关文章

SpringKafka消息发布之KafkaTemplate与事务支持功能

《SpringKafka消息发布之KafkaTemplate与事务支持功能》通过本文介绍的基本用法、序列化选项、事务支持、错误处理和性能优化技术,开发者可以构建高效可靠的Kafka消息发布系统,事务支... 目录引言一、KafkaTemplate基础二、消息序列化三、事务支持机制四、错误处理与重试五、性能优

SpringIntegration消息路由之Router的条件路由与过滤功能

《SpringIntegration消息路由之Router的条件路由与过滤功能》本文详细介绍了Router的基础概念、条件路由实现、基于消息头的路由、动态路由与路由表、消息过滤与选择性路由以及错误处理... 目录引言一、Router基础概念二、条件路由实现三、基于消息头的路由四、动态路由与路由表五、消息过滤

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

springboot security使用jwt认证方式

《springbootsecurity使用jwt认证方式》:本文主要介绍springbootsecurity使用jwt认证方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录前言代码示例依赖定义mapper定义用户信息的实体beansecurity相关的类提供登录接口测试提供一

go中空接口的具体使用

《go中空接口的具体使用》空接口是一种特殊的接口类型,它不包含任何方法,本文主要介绍了go中空接口的具体使用,具有一定的参考价值,感兴趣的可以了解一下... 目录接口-空接口1. 什么是空接口?2. 如何使用空接口?第一,第二,第三,3. 空接口几个要注意的坑坑1:坑2:坑3:接口-空接口1. 什么是空接

Spring Boot 3.4.3 基于 Spring WebFlux 实现 SSE 功能(代码示例)

《SpringBoot3.4.3基于SpringWebFlux实现SSE功能(代码示例)》SpringBoot3.4.3结合SpringWebFlux实现SSE功能,为实时数据推送提供... 目录1. SSE 简介1.1 什么是 SSE?1.2 SSE 的优点1.3 适用场景2. Spring WebFlu

基于SpringBoot实现文件秒传功能

《基于SpringBoot实现文件秒传功能》在开发Web应用时,文件上传是一个常见需求,然而,当用户需要上传大文件或相同文件多次时,会造成带宽浪费和服务器存储冗余,此时可以使用文件秒传技术通过识别重复... 目录前言文件秒传原理代码实现1. 创建项目基础结构2. 创建上传存储代码3. 创建Result类4.

SpringBoot日志配置SLF4J和Logback的方法实现

《SpringBoot日志配置SLF4J和Logback的方法实现》日志记录是不可或缺的一部分,本文主要介绍了SpringBoot日志配置SLF4J和Logback的方法实现,文中通过示例代码介绍的非... 目录一、前言二、案例一:初识日志三、案例二:使用Lombok输出日志四、案例三:配置Logback一

springboot security快速使用示例详解

《springbootsecurity快速使用示例详解》:本文主要介绍springbootsecurity快速使用示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录创www.chinasem.cn建spring boot项目生成脚手架配置依赖接口示例代码项目结构启用s

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.