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

相关文章

PHP轻松处理千万行数据的方法详解

《PHP轻松处理千万行数据的方法详解》说到处理大数据集,PHP通常不是第一个想到的语言,但如果你曾经需要处理数百万行数据而不让服务器崩溃或内存耗尽,你就会知道PHP用对了工具有多强大,下面小编就... 目录问题的本质php 中的数据流处理:为什么必不可少生成器:内存高效的迭代方式流量控制:避免系统过载一次性

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

springboot中使用okhttp3的小结

《springboot中使用okhttp3的小结》OkHttp3是一个JavaHTTP客户端,可以处理各种请求类型,比如GET、POST、PUT等,并且支持高效的HTTP连接池、请求和响应缓存、以及异... 在 Spring Boot 项目中使用 OkHttp3 进行 HTTP 请求是一个高效且流行的方式。

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

JavaScript中的高级调试方法全攻略指南

《JavaScript中的高级调试方法全攻略指南》什么是高级JavaScript调试技巧,它比console.log有何优势,如何使用断点调试定位问题,通过本文,我们将深入解答这些问题,带您从理论到实... 目录观点与案例结合观点1观点2观点3观点4观点5高级调试技巧详解实战案例断点调试:定位变量错误性能分

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Python中 try / except / else / finally 异常处理方法详解

《Python中try/except/else/finally异常处理方法详解》:本文主要介绍Python中try/except/else/finally异常处理方法的相关资料,涵... 目录1. 基本结构2. 各部分的作用tryexceptelsefinally3. 执行流程总结4. 常见用法(1)多个e

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java