本帖最后由 袁胜富 于 2023-9-11 22:28 编辑
#有奖活动# #申请原创# #申请开发板# @21小管家
一、概述
CH32X035的SDI(Serial Data Interface)是沁恒微电子RISC-V内核的私有外设接口,主要功能是提供下载调试。最近发现CH32 RISC-V系列的EVT提供了SDI的printf打印功能,但是怎么用没有详细的教程,那么本篇文章将教大家怎么使用SDI下载调试接口启用printf功能。
于是乎为了和大家分享,我出了这个文章。
二、原理分析和软硬件连接准备
原理分析
从下图1CH32X035的系统框图得知,SDI接口由SWCLK和SWDIO组成,属于系统的内核外设。
图1
从图2,SDI的属于内核私有外设,可以看出SDI的存储映像地址在0xE0000000~0xE0100000之间。结合官方的例程代码来看
#define SDI_DATA0_ADDRESS ((volatile uint32_t*)0xE0000380)
#define SDI_DATA1_ADDRESS ((volatile uint32_t*)0xE0000384)
SDI的数据0地址:0xE0000380
SDI的数据1地址:0xE0000384
图2
*(SDI_DATA0_ADDRESS) = 0;这代码的作用是使能SDI。
结合
__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个字节
* data0最低位的字节存放长度,最大为 7
*
*/
while( (*(SDI_DATA0_ADDRESS) != 0u))
{
}
if(writeSize>7)
{
*(SDI_DATA1_ADDRESS) = (*(buf+i+3)) | (*(buf+i+4)<<8) | (*(buf+i+5)<<16) | (*(buf+i+6)<<24);
*(SDI_DATA0_ADDRESS) = (7u) | (*(buf+i)<<8) | (*(buf+i+1)<<16) | (*(buf+i+2)<<24);
i += 7;
writeSize -= 7;
}
else
{
*(SDI_DATA1_ADDRESS) = (*(buf+i+3)) | (*(buf+i+4)<<8) | (*(buf+i+5)<<16) | (*(buf+i+6)<<24);
*(SDI_DATA0_ADDRESS) = (writeSize) | (*(buf+i)<<8) | (*(buf+i+1)<<16) | (*(buf+i+2)<<24);
writeSize = 0;
}
} while (writeSize);
#endif
return size;
}
这段代码来看,SDI接口发送的数据存放于DATA0和DATA1地址的寄存器,每个寄存器可以存放32位数据也就是4个字节,两个寄存器可以存储8个字节数据,因为DATA0的低位第一个字节存放发送数据的个数,那么得知SDI接口一次性一包数据可以发送7个字节。
综上分析,SDI接口还可以做其他用途的数据传输,目前来看,貌似给出的资料目前只能发送不能接收。
硬件连接
图3
首先拥有WCH_Link 1V3,然后按照如下接线
PC18---------SWDIO
PC19---------SWCLK
GND--------GND
软件
软件需要使用WCH-LinkUtilityV1.8 。软件可以在MRS的工具栏工具选项的-导出WCH-LinkRISC-V/ARMMCU编程工具中导出解压即可
图4
也可以在WCH的官网下载。网址:WCH-LinkUtility.ZIP - rId12。
使用步骤
将开发板连接WCH_Link 1V3.
打开附件提供的工程源码,编译下载到CH32X035。
打开运行WCH-LinkUtilityV1.8,第一步先在Target下选择Connect WCH_Link然后选择Enable SDI Printf.
打开串口调试助手,波特率选择115200,打开串口,其他波特率也可以。于是乎就可以看到有数据从串口接收框打印出来了。
值得注意的是,每一次下载程序后,都要执行第四步操作。
图5
三、展示
图6
图7
总的来看,SDI的printf方式还是体验还是可以的,提供了程序调试的另一种手段。
|