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

参考:
有关于 SDI printf 更多的信息和资料吗?
关于 CH32 系列 MCU SDI 虚拟串口功能的使用
【CH32X035 评估板测评】+ 教你使用 SDI 接口重定向 printf
SDI (Serial Data Interface) 是沁恒微电子 RISC-V 内核的私有外设接口,CH32 RISC-V 系列目前提供了 SDI 的 printf 打印功能
(有点类似RTT Viewer,但是是由WCH-LinkE调试器虚拟出来的一个串口,可以使用各种串口上位机查看打印的调试信息)

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 虚拟串口功能原理简单推测分析

感谢**【CH32X035 评估板测评】+ 教你使用 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;
}

SDI (Serial Data Interface) 是沁恒微电子 RISC-V 内核的私有外设接口
在这里插入图片描述

#define DEBUG_DATA0_ADDRESS  ((volatile uint32_t*)0xE0000380)
#define DEBUG_DATA1_ADDRESS  ((volatile uint32_t*)0xE0000384)

可以看到_write函数写的数据地址正是在其MCU内核的Core Private Peripherals范围中

这段代码来看,SDI 接口发送的数据存放于 DATA0 和 DATA1 地址的寄存器,每个寄存器可以存放 32 位数据也就是 4 个字节,两个寄存器可以存储 8 个字节数据,因为 DATA0 的低位第一个字节存放发送数据的个数,那么得知 SDI 接口一次性一包数据可以发送 7 个字节。
综上分析,SDI 接口还可以做其他用途的数据传输,目前来看,貌似给出的资料目前只能发送不能接收。

在这里插入图片描述

  1. WCH-LinkE调试器在Enable SDI Printf后,会虚拟出来一个串口供上位机串口助手使用,默认波特率115200、8N1
  2. MCU 开启SDI,#define SDI_PRINT SDI_PR_OPEN
  3. MCU程序运行中调用Printf函数,要打印的数据最终通过_write函数不断地写在内核中的DEBUG_DATA0_ADDRESSDEBUG_DATA1_ADDRESS 地址上,而不是通过硬件串口外设调用USART_SendData发送
  4. WCH-LinkE调试器会不断地查询位于MCU的内核中上述DEBUG_DATA0/1_ADDRESS两地址的数据,并将该数据打包通过虚拟出来的串口发送给串口上位机
    比较类似于RTT Viewer功能,通过调试器不断快速地访问RAM/内核中的指定地址范围的数据来实现MCU和调试器到上位机的数据传输。
    只不过WCH的SDI功能目前仅有Printf 打印,对用户RAM区占用很小,但还没支持双向的数据传输,但也算是很好的提升了,WCH加油啊!

3.WCH-LinkUtility的问题

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/5645.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redis 高可用 Sentinel 详解

写在前面 redis 在我们日常的业务开发中是十分常见的&#xff0c;而redis的可用性就必须要有很高的要求&#xff0c;那么 redis集群的高可用由有一个或者多个 Sentinel(哨兵) 实例组成的 哨兵系统来保证的。 哨兵 由一个或者多个 Sentinel 实例组成的 Sentinel 系统可以监控任…

53.HarmonyOS鸿蒙系统 App(ArkTS) socket套接字连接失败无效参数--invalid argument

ark ts socket套接字连接失败无效参数--invalid argument 绑定本机真实连接的WIFI的IP&#xff0c;不要绑定127.0.0.1

VS code 同步odata服务

在做UI5得开发过程中&#xff0c;经常会出现odata需要更新 那么已经加载过得项目如何去跟新odata服务呢 可以通过如下步骤 1.右键打开应用信息 2.找到manage service models 3.点击编辑 4.选中 刷新并保存

《STM32 HAL库》中断相关函数详尽解析——NVIC

观前提醒&#xff1a;本文以外部中断点灯为例&#xff0c;分析了HAL库中中断服务相关函数的使用及相互关联、底层原理 一、实例实现 实例简介&#xff1a;主函数控制LED2进行闪烁&#xff0c;中断控制LED0开关 我们先使用CubeMX创建项目文件&#xff1a; 1、在System Core中配…

XY_RE复现(五)

一&#xff0c;给阿姨倒一杯卡布奇诺 是一道魔改TEA加密 给出了一些初始化&#xff0c;然后输入的flag拆分&#xff0c;两两一组&#xff0c;通过for循环放入encrypt加密函数 #include <stdio.h> #define uint32_t unsigned intvoid decrypt(uint32_t *v, uint32_t *ke…

【STM32F407+CUBEMX+FreeRTOS+lwIP netconn UDP TCP记录】

STM32F407CUBEMXFreeRTOSlwIP netconn UDP TCP记录 注意UDPUDP1UDP2 TCPTCP clientTCP server图片 注意 1、超时 #include “lwipopts.h” #define LWIP_SO_RCVTIMEO 12、先保证能ping通 3、关于工程创建可参考 【STM32F407CUBEMXFreeRTOSlwIP之UDP记录】 4、…

数据仓库Data Warehouse

数据仓库Data Warehouse 数仓是一种思想,数仓是一种规范,数仓是一种解决方案 1. 数据处理方式 数据处理大致可以分成两大类: 联机事务处理OLTP(on-line transaction processing)联机分析处理OLAP(On-Line Analytical Processing)1.1. OLTP OLTP的全称是On-line Transa…

【C++】详解string类

目录 简介 框架 构造 全缺省构造函数 ​编辑 传对象构造函数 拷贝构造 析构函数 容量 size() capacity&#xff08;&#xff09; empty() clear() reserve() ​编辑 resize() 遍历 检引用符号"[ ]"的重载 迭代器 begin() end() rbegin() rend(…

使用Mybatis映射时间 DateTime ==> LocalDateTime

首先查看&#xff0c;数据库字段&#xff1a; 书写映射实体类对象VO&#xff1a; Data public class OrderListVO implements Serializable {private Integer orderId;private String memberName;private String orderNumber;private BigDecimal orderPrice;private String l…

在单细胞分辨率下预测细胞对新型药物扰动的反应

scRNA-seq能够在单个细胞分辨率下研究细胞异质性对扰动的响应。然而&#xff0c;由于技术限制&#xff0c;扩大高通量筛选&#xff08;HTSs&#xff0c;highthroughput screens&#xff09;来测量许多药物的细胞反应仍然是一个挑战。因此&#xff0c;目前依然需要借助常规的bul…

excel表格在筛选状态下,怎样从指定数字开始填充序列?

分两种情况分开来说吧&#xff1a; 一、表格根据需要做数据筛选&#xff0c;指定列的序号始终保持0012开始的连续序号。 B2TEXT(AGGREGATE(3,5,B$1:B1)11,"0000") 然后向下填充公式。 当C列数据做了筛选以后&#xff0c;B列仍旧保持连续的序号&#xff0c;改变筛选…

MySQL连表查询

MySQL简介&#xff0c;我们为什么要学习各种join MySQL是SQL的一种&#xff0c;SQL意为结构化查询语言(Structure Query Language)&#xff0c;MySQL可以应用于现实世界的各种结构化数据。 SQL&#xff08;结构化查询语言&#xff09;&#xff0c;处理结构化数据的查询语言&a…

房产中介小程序高效开发攻略:从模板到上线一站式服务

对于房产中介而言&#xff0c;拥有一个高效且用户友好的小程序是提升业务、增强客户黏性的关键。而采用直接复制模板的开发方式&#xff0c;无疑是实现这一目标的最佳途径&#xff0c;不仅简单快捷&#xff0c;而且性价比极高。 在众多小程序模板开发平台中&#xff0c;乔拓云网…

Java项目:基于SSM框架实现的高校专业信息管理系统设计与实现(ssm+B/S架构+源码+数据库+毕业论文+PPT+开题报告)

一、项目简介 本项目是一套基于SSM框架实现的高校专业信息管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、…

前端vite+rollup前端监控初始化——封装基础fmp消耗时间的npm包并且发布npm beta版本

文章目录 ⭐前言&#x1f496;vue3系列文章 ⭐初始化npm项目&#x1f496;type为module&#x1f496;rollup.config.js ⭐封装fmp耗时计算的class&#x1f496;npm build打包class对象 ⭐发布npm的beta版本&#x1f496; npm发布beta版本 ⭐安装web-performance-tool的beta版本…

5G前传光纤传输的25G光模块晶振SG2016CAN

一款适用于5G前传光纤传输网络中的25G光模块的5G晶振SG2016CAN。随着5G时代的到来&#xff0c;5G晶振的重要性也不言而喻&#xff0c;小体积宽温晶振SG2016CAN可以用于5G前传的25G光模块&#xff0c;具有高稳定性、小体积、宽温等优势。在5G前传光纤传输网络中&#xff0c;25G光…

Mac 上安装多版本的 JDK 且实现 自由切换

背景 当前电脑上已经安装了 jdk8; 现在再安装 jdk17。 期望 完成 jdk17 的安装&#xff0c;并且完成 环境变量 的配置&#xff0c;实现自由切换。 前置补充知识 jdk 的安装路径 可以通过查看以下目录中的内容&#xff0c;确认当前已经安装的 jdk 版本。 cd /Library/Java/Java…

【大前端】ECharts 绘制立体柱状图

立体柱状图分为&#xff1a; 纯色立体柱状图渐变立体柱状图 常用实现方式 纯色立体柱状图 纯色立体柱状图&#xff0c;使用MarkPoint和颜色渐变就实现&#xff0c;如下代码 import * as echarts from "echarts";var chartDom document.getElementById("main&…

AI大模型探索之路-训练篇9:大语言模型Transformer库-Pipeline组件实践

系列篇章&#x1f4a5; AI大模型探索之路-训练篇1&#xff1a;大语言模型微调基础认知 AI大模型探索之路-训练篇2&#xff1a;大语言模型预训练基础认知 AI大模型探索之路-训练篇3&#xff1a;大语言模型全景解读 AI大模型探索之路-训练篇4&#xff1a;大语言模型训练数据集概…

Android View事件分发面试问题及回答

问题 1: 请简述Android中View的事件分发机制是如何工作的&#xff1f; 答案: 在Android中&#xff0c;事件分发机制主要涉及到三个主要方法&#xff1a;dispatchTouchEvent(), onInterceptTouchEvent(), 和 onTouchEvent(). 当一个触摸事件发生时&#xff0c;首先被Activity的…