打印
[USB芯片]

【CH32X035评估板测评】+ 教你使用SDI接口重定向printf

[复制链接]
2946|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 袁胜富 于 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方式还是体验还是可以的,提供了程序调试的另一种手段。



CH32X035C8T6_SDI_Printf.zip

470.15 KB

使用特权

评论回复
沙发
tpgf| | 2023-10-11 13:08 | 只看该作者
这种外设接口都可以连接哪些种类的外设呢

使用特权

评论回复
板凳
qcliu| | 2023-10-11 15:24 | 只看该作者
为什么这个打印函数经常被重定向呢

使用特权

评论回复
地板
袁胜富|  楼主 | 2023-10-11 15:45 | 只看该作者
方便呗,

使用特权

评论回复
5
drer| | 2023-10-11 15:55 | 只看该作者
qcliu 发表于 2023-10-11 15:24
为什么这个打印函数经常被重定向呢

我理解的重定向就是利用这个函数原来的功能进行小幅度的调整

使用特权

评论回复
6
coshi| | 2023-10-11 16:40 | 只看该作者
需重写fputc()这个c标准库函数(printf()在c标准库函数实质是一个宏,实际是调用fputc()函数)

使用特权

评论回复
7
kxsi| | 2023-10-11 16:59 | 只看该作者
qcliu 发表于 2023-10-11 15:24
为什么这个打印函数经常被重定向呢

因为这个函数非常的实用也非常灵活

使用特权

评论回复
8
wiba| | 2023-10-11 17:40 | 只看该作者
重定向都需要修改函数的哪些部分呢?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

29

主题

149

帖子

2

粉丝