WCH RISC CH32V303RCT6 单片机的SDI Printf 虚拟串口功能 类似RTT打印功能 简单分析

本文主要是介绍WCH RISC CH32V303RCT6 单片机的SDI Printf 虚拟串口功能 类似RTT打印功能 简单分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

参考:
有关于 SDI printf 更多的信息和资料吗?
关于 CH32 系列 MCU SDI 虚拟串口功能的使用
【CH32X035 评估板测评】+ 教你使用 SDI 接口重定向 printf

0.前言

有段时间没有看CH32V单片机的开发了,今天帮新来的同事调试时候看到debug.c里面有新的函数SDI_Printf_Enable
在这里插入图片描述
大概看了下,感觉有点像RTT,去wch官方那个技术社区搜了下果然有相关内容。
在这里插入图片描述
主要看了这篇:关于 CH32 系列 MCU SDI 虚拟串口功能的使用写的很详细了。

在此下载最新的WCH-LinkUtility,解压后Doc文件夹中有WCH-Link使用说明,看来通用MCU的支持的多点,CH582、CH592还没有支持。
在这里插入图片描述

1.试验

1.1 打开SDI_PRINT

这里我使用的是CH32V303RCT6单片机,打开官方EVT中的例程
在这里插入图片描述
默认的Printf是关闭SDI功能、打开串口1的
在这里插入图片描述debug.h中将SDI_PRINT改为SDI_PR_OPEN即可编译。
在这里插入图片描述

1.2 打开串口助手

打开 WCH-LinkE 对应的串口,115200、8N1
在这里插入图片描述

1.3.使用WCH-LinkUtility下载固件并打开SDI 功能

在这里插入图片描述

1.4.下载查看串口信息

wch-linke只连接了SWCLK、SWDIO,没有连接自身的TX、RX,但还是可以看到有数据打印出来。
在这里插入图片描述

2.SDI Printf 虚拟串口功能原理简单推测分析

debug.c中的_write函数可以大概推测下SDI实现的原理:

#define DEBUG_DATA0_ADDRESS  ((volatile uint32_t*)0xE0000380)
#define DEBUG_DATA1_ADDRESS  ((volatile uint32_t*)0xE0000384)__attribute__((used)) int _write(int fd, char *buf, int size)
{int i = 0;#if (SDI_PRINT == SDI_PR_OPEN)int writeSize = size;do{/*** data0  data1 8 bytes* data0 The lowest byte storage length, the maximum is 7**/while( (*(DEBUG_DATA0_ADDRESS) != 0u)){}if(writeSize>7){*(DEBUG_DATA1_ADDRESS) = (*(buf+i+3)) | (*(buf+i+4)<<8) | (*(buf+i+5)<<16) | (*(buf+i+6)<<24);*(DEBUG_DATA0_ADDRESS) = (7u) | (*(buf+i)<<8) | (*(buf+i+1)<<16) | (*(buf+i+2)<<24);i += 7;writeSize -= 7;}else{*(DEBUG_DATA1_ADDRESS) = (*(buf+i+3)) | (*(buf+i+4)<<8) | (*(buf+i+5)<<16) | (*(buf+i+6)<<24);*(DEBUG_DATA0_ADDRESS) = (writeSize) | (*(buf+i)<<8) | (*(buf+i+1)<<16) | (*(buf+i+2)<<24);writeSize = 0;}} while (writeSize);#elsefor(i = 0; i < size; i++){
#if(DEBUG == DEBUG_UART1)while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);USART_SendData(USART1, *buf++);
#elif(DEBUG == DEBUG_UART2)while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);USART_SendData(USART2, *buf++);
#elif(DEBUG == DEBUG_UART3)while(USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET);USART_SendData(USART3, *buf++);
#endif}
#endifreturn size;
}
  1. WCH-LinkE调试器在Enable SDI Printf后,会虚拟出来一个串口供上位机串口助手使用,默认波特率115200、8N1
  2. MCU 开启SDI,#define SDI_PRINT SDI_PR_OPEN
  3. MCU程序运行中调用Printf函数,要打印的数据最终通过_write函数不断地写在RAM中的DEBUG_DATA0_ADDRESSDEBUG_DATA1_ADDRESS 地址上,而不是通过硬件串口外设调用USART_SendData发送
  4. WCH-LinkE调试器会不断地查询位于MCU的RAM中上述DEBUG_DATA0/1_ADDRESS两地址的数据,并将该数据打包通过虚拟出来的串口发送给串口上位机
    比较类似于RTT Viewer功能,通过调试器不断快速地访问RAM中的指定范围的数据来实现MCU和调试器到上位机的数据传输。
    只不过WCH的SDI功能目前仅有Printf 打印且RAM缓冲区占用很小,但还没支持双向的数据传输,但也算是很好的提升了,WCH加油啊!

3.WCH-LinkUtility的问题

WCH-LinkUtility在菜单栏 Target下拉可以随时控制SDI的开关,但是下图这里的开关不是即时发生的,实测只有在下载程序时会生效。(2024-04-25)
在这里插入图片描述
请添加图片描述

这篇关于WCH RISC CH32V303RCT6 单片机的SDI Printf 虚拟串口功能 类似RTT打印功能 简单分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Go标准库常见错误分析和解决办法

《Go标准库常见错误分析和解决办法》Go语言的标准库为开发者提供了丰富且高效的工具,涵盖了从网络编程到文件操作等各个方面,然而,标准库虽好,使用不当却可能适得其反,正所谓工欲善其事,必先利其器,本文将... 目录1. 使用了错误的time.Duration2. time.After导致的内存泄漏3. jsO

Java实现文件图片的预览和下载功能

《Java实现文件图片的预览和下载功能》这篇文章主要为大家详细介绍了如何使用Java实现文件图片的预览和下载功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... Java实现文件(图片)的预览和下载 @ApiOperation("访问文件") @GetMapping("

Mysql表的简单操作(基本技能)

《Mysql表的简单操作(基本技能)》在数据库中,表的操作主要包括表的创建、查看、修改、删除等,了解如何操作这些表是数据库管理和开发的基本技能,本文给大家介绍Mysql表的简单操作,感兴趣的朋友一起看... 目录3.1 创建表 3.2 查看表结构3.3 修改表3.4 实践案例:修改表在数据库中,表的操作主要

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

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

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

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

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.

Python+PyQt5实现多屏幕协同播放功能

《Python+PyQt5实现多屏幕协同播放功能》在现代会议展示、数字广告、展览展示等场景中,多屏幕协同播放已成为刚需,下面我们就来看看如何利用Python和PyQt5开发一套功能强大的跨屏播控系统吧... 目录一、项目概述:突破传统播放限制二、核心技术解析2.1 多屏管理机制2.2 播放引擎设计2.3 专

一文详解SpringBoot响应压缩功能的配置与优化

《一文详解SpringBoot响应压缩功能的配置与优化》SpringBoot的响应压缩功能基于智能协商机制,需同时满足很多条件,本文主要为大家详细介绍了SpringBoot响应压缩功能的配置与优化,需... 目录一、核心工作机制1.1 自动协商触发条件1.2 压缩处理流程二、配置方案详解2.1 基础YAML

springboot简单集成Security配置的教程

《springboot简单集成Security配置的教程》:本文主要介绍springboot简单集成Security配置的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录集成Security安全框架引入依赖编写配置类WebSecurityConfig(自定义资源权限规则