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);


#else
    for(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
    }
#endif
    return 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.mfbz.cn/a/580846.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PDCA循环:持续精进的工具

文章目录 一、什么是PDCA二、PDCA的应用场景三、PDCA在信息系统项目管理中的应用 一、什么是PDCA PDCA循环是由美国质量管理专家沃特阿曼德休哈特&#xff08;Walter A. Shewhart&#xff09;在20世纪30年代提出的&#xff0c;最初用于制造业的质量管理。休哈特博士在构想PDCA…

二极管钳位型三电平SVPWM(羊角波)闭环系统simulink建模与仿真

整理了二极管钳位型三电平SVPWM&#xff08;羊角波&#xff09;闭环系统simulink建模与仿真模型&#xff0c;附赠参考资料。 在二极管钳位型三电平SVPWM中&#xff0c;通过控制逆变器的开关器件&#xff08;IGBT&#xff09;的导通和关断&#xff0c;将输入的直流电压转换为三…

知网怎么查重 知网查重的详细步骤

知网查重八个步骤&#xff1a;1. 访问官网&#xff0c;注册账号。2. 上传待查文档。3. 选择查重规则。4. 选择相似来源库。5. 提交查重任务。6. 等待查重结果。7. 获取查重报告。8. 下载查重报告。 知网查重的详细步骤 第一步&#xff1a;进入知网查重系统 打开浏览器&#x…

怎样将便签软件搬家?便签迁移攻略

便签软件已成为我们日常生活中不可或缺的记录工具。无论是重要的工作内容&#xff0c;还是琐碎的生活事务&#xff0c;我们都会在便签中一一记下。然而&#xff0c;当我们需要更换电脑或其他设备时&#xff0c;如何将这些珍贵的便签内容迁移到新设备上&#xff0c;成为了许多人…

2024全国大学生高新技术竞赛——算法智星挑战赛 解题报告(流水账版) | 珂学家

前言 评价 因为第一届的缘故吧&#xff0c;导致这场比赛异常的简单。所以不太好评价这块。 怎么说呢&#xff1f; 体验有点差 题目难度没有区分度有两题还存在SPJ判定问题&#xff0c;导致赛时没一人过。 题目分布&#xff0c;简单题占大部分&#xff0c;中等级占一小部分&…

Ubuntu查看端口状态

完蛋了&#xff0c;好像动心了&#xff0c;近一周吃啥东西都索然无味&#xff0c;这可如何是好&#xff01;&#xff01;&#xff01;不知道在期待什么&#xff0c;恐惧与窃喜—— 在Ubuntu系统中&#xff0c;查看某个端口是否被放行&#xff08;即允许流量通过&#xff09;&am…

【JAVA进阶篇教学】第六篇:Java线程中状态

博主打算从0-1讲解下java进阶篇教学&#xff0c;今天教学第六篇&#xff1a;Java线程中状态。 理解并掌握线程的休眠、停止和挂起等操作是多线程编程中的重要内容。下面我将详细说明这些操作&#xff0c;并提供相应的代码案例。 目录 一、线程休眠&#xff08;Thread Slee…

一个早安寄语打卡的小程序技术分享

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 1.早起打卡还能赚钱&#xff1f; 是的&#xff0c;你没有听错&#xff0c;最近发现了个非常有意思的小程序&#xff0c;主要是让用户早起早睡&#xff0c;然后每天进行打卡操作的。 当然&…

【KG+RAG 论文】医学知识图谱检索增强 LLM 的框架 —— KG-RAG

论文&#xff1a;Biomedical knowledge graph-enhanced prompt generation for large language models ⭐⭐⭐ Code&#xff1a;github.com/BaranziniLab/KG_RAG 文章目录 论文速读模型效果总结 论文速读 这篇论文提出了 KG-RAG 的框架&#xff0c;使用医学知识图谱&#xff0…

黑马面试篇

课程地址&#xff1a;新版Java面试专题视频教程&#xff0c;java八股文面试全套真题深度详解&#xff08;含大厂高频面试真题&#xff09;_哔哩哔哩_bilibili 课程名称&#xff1a;新版Java面试专题视频教程&#xff0c;java八股文面试全套真题深度详解&#xff08;含大厂高频…

【Protobuf】protobuf详细介绍

protobuf详细介绍 一、前言二、Protobuf简介2.1、核心思想2.2、Protobuf是如何工作的&#xff1f;2.3、如何使用 Protoc 生成代码&#xff1f;2.4 入门命令 一、前言 在以往的项目中进行网络通信和数据交换的应用场景中&#xff0c;最经常使用的技术便是json或xml。随着JSON的…

用户中心 -- 插件使用 插件使用思路

易错注意点 1 5.1启动类 & 入口类 需保持一致 网址&#xff1a; 第一节课&#xff0c;用户管理--后端初始化&#xff0c;项目调通。二次翻工2-CSDN博客 一、 用户管理 框架 网址&#xff1a; 用户管理 --汇总 -- 明细-CSDN博客 1.2 更改路径&#xff0c;并生效 网址…

盘点那些你不知道的“痛”,柯桥俄语培训

首先我们来看一下болеть的五大含义&#xff1a; ①(чем 及无补语) 生病&#xff0c;患病 例&#xff1a; болеть тифом 害伤寒病 болеть воспалением лёгких 得肺炎 ②[只用第3人称] болит&#xff0c;болят 疼痛 例&am…

CDGA|数据治理新视角:清洗数据,让数据质量飞跃提升

在数据治理的新视角下&#xff0c;数据清洗不再是一个孤立的环节&#xff0c;而是与数据收集、存储、分析和应用紧密相连。它涉及到数据的全生命周期&#xff0c;从源头开始就对数据进行严格的把控。在数据收集阶段&#xff0c;通过设定合理的数据规范和校验机制&#xff0c;确…

DFS时间戳

时间戳 这就是树上查询问题 &#xff0c; 是求两个点有什么关系 让我们来看一下样例解释&#xff1a;注意字母旁边的数字就是时间戳&#xff0c; a在先序遍历&#xff08;遍历顺序 &#xff1a; 左&#xff0c;右&#xff0c;根&#xff09;是第一个进&#xff0c; 第十六个出…

#ESP32S3R8N8建立工程(VSCODE)点亮LED

1.参考文档 【立创ESP32S3R8N8】IDF入门手册 - 飞书云文档 (feishu.cn)https://lceda001.feishu.cn/wiki/GOIlwwfbIi1SC3k8594cDeFVn8g 2.建立工程 3.运行效果 4.更改配置 5.插播 之前配置的环境是有问题的&#xff0c;就算有自动检测也要仔细检查&#xff0c;必须严格按照以…

Linux内核广泛采用的侵入式数据结构设计

Linux内核广泛采用的侵入式数据结构设计恐怕很难应用到一般程序开发中。基本上是个高维十字链表&#xff0c;一个节点(struct)可以同时位于多个hash/list/tree中。我分享下我的经历&#xff0c;我刚入行时遇到一个好公司和师父&#xff0c;给了我机会&#xff0c;一年时间从3k薪…

一键设置jdk环境脚本

自动化脚本 一、使用方法 创建一个txt文本&#xff0c;放在和jdk存放的同一目录下&#xff0c;复制粘贴进我的代码&#xff0c;利用全局替换&#xff0c;将jdk1.8,改成你自己的jdk包名字&#xff0c;再重新把这个文件保存为.vbs文件。然后运行就行了 MsgBox "Runing s…

邮件SMTP服务的性能怎么做优化?如何配置?

邮件SMTP服务的工作原理&#xff1f;邮件服务器发信的优势特点&#xff1f; 邮件SMTP服务作为信息传递的核心组件&#xff0c;其性能优化显得尤为关键。一个高效稳定的SMTP服务不仅能提升工作效率&#xff0c;还能保障信息安全。那么&#xff0c;邮件SMTP服务的性能怎么做优化…

Web漏扫工具OWASP ZAP安装与使用(非常详细)从零基础入门到精通,看完这一篇就够了。

本文仅用于安全学习使用&#xff01;切勿非法用途。 一、OWASP ZAP简介 开放式Web应用程序安全项目&#xff08;OWASP&#xff0c;Open Web Application Security Project&#xff09;是一个组织&#xff0c;它提供有关计算机和互联网应用程序的公正、实际、有成本效益的信息。…
最新文章