打印
[单片机芯片]

【CH32X035评估板测评】+ USB_Serial

[复制链接]
1911|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
袁胜富|  楼主 | 2023-10-14 22:43 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 袁胜富 于 2023-11-13 22:59 编辑

一、概述

CH32X035拥有设备控制器(USBFS),可以使用其为USB_Serial设备,即USB转模拟UART设备,直接使用USB模拟UART,直接省去CH340等USB-to-UART。本例程使用官方例程修改而来。
为了和大家分享,于是乎发表了这篇文章。

二、原理分析

定义环形缓冲队列对象和接收Buff:
RingBufferUSB_RX_RingBuff;
uint8_t USB_RX_Buff[1024];
修改ch32x035_usbfs_device.c
修改voidUSBFS_Device_Endp_Init( void )

修改voidUSBFS_IRQHandler( void )



三、代码

USBSerial.h代码:
/*
<font _mstmutation="1" _msttexthash="13354253757" _msthash="361">* USBSerial.h
* * 创建时间:2023年10月14日
*
作者:jeffery。袁
*/

#ifndef BSP_USBSERIAL_H_
#define BSP_USBSERIAL_H_

#include “ch32x035_usbfs_device.h”#include “usb.h”


typedef struct
{ void (*begin)(void); uint8_t (*read)(void); uint16_t (*available)(void); void (*writebyte)(uint8_t ch);
void (*writebytes)(uint8_t data[],uint16_t len);




void (*printf)(char *fmt,...);
}USBSerial_Typedef;

外部USBSerial_Typedef USBSerial;
void USBSerial_Begin(void);
uint8_t USBSerial_ReadByte(无效);
uint16_t USBSerial_Available(无效);
空隙USBSerial_WriteByte(uint8_t通道);
void USBSerial_WriteBytes(uint8_t *data,uint16_t len);
无效USBSerial_print(字符 *fmt,...);
#endif /* BSP_USBSERIAL_H_ */</font>


USBSerial.c代码:
/*
<font _mstmutation="1" _msttexthash="53669864885" _msthash="363"><font _mstmutation=“1” _msttexthash=“45974931899” _msthash=“400”>* USBSerial.c
* * 创建于: 2023年10月14日
* 作者: 杰弗里.元
*
/

#ifndef BSP_USBSERIAL_C_#define BSP_USBSERIAL_C_


#include “USBSerial.h”#include “stdarg.h”#include “string.h”#include “stdio.h”#include “ringbuffer.h”#include “ch32x035_usbfs_device.h”





USBSerial_Typedef USBSerial;
void USBSerial_Begin(void)
{
/*初始化ringbuffer相关的配置*/
rbInitialize(&USB_RX_RingBuff, USB_RX_Buff, sizeof(USB_RX_Buff));
USBFS_RCC_Init( );
USBFS_Device_Init( 启用 , PWR_VDD_SupplyVoltage());
}

uint8_t USBSerial_ReadByte(void)
{
return rbPop(&USB_RX_RingBuff);
}

uint16_t USBSerial_Available(void)
{
return rbGetCount(&USB_RX_RingBuff);
}

void USBSerial_WriteByte(uint8_t ch)
{
静态uint8_t数据[1];
数据[0]=ch;
if(USBFSConActive == 0)
{
USBFS_Endp_DataUp(DEF_UEP3,Data,1,0);

}

void USBSerial_WriteBytes(uint8_t *data,uint16_t len)
{
if(USBFSConActive == 0)
{
USBFS_Endp_DataUp(DEF_UEP3,data,len,0);

}

/** * 自动格式输出 */
void USBSerial_print(char

*fmt,...)
{
静态字符 T1_Bufferr[128]; uint16_t len; va_list ap;


va_start(AP,FMT);
vsprintf(T1_Bufferr,fmt,ap);va_end(美联社);len=strlen(T1_Bufferr);if(USBFSConActive == 0)
{
USBFS_Endp_DataUp(DEF_UEP3,T1_Bufferr,len,0);



}}

//结构体初始化
USBSerial_Typedef USBSerial =
{
USBSerial_Begin, USBSerial_ReadByte, USBSerial_Available, USBSerial_WriteByte, USBSerial_WriteBytes,




USBSerial_print
};

#endif /* BSP_USBSERIAL_C_ */</font></font>


Main.c代码:

<font _mstmutation="1" _msttexthash="725334571" _msthash="365"><font _mstmutation="1" _msttexthash="559860535" _msthash="402">#include "USBSerial.h"
uint8_t rx_buff[128];
int main(void)
{
    int i=0;
    char CH;
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    SystemCoreClockUpdate();
    Delay_Init();
    USART_Printf_Init(115200);
    USBSerial.begin();//虚拟串口初始化
    printf("SystemClk:%d\r\n", SystemCoreClock);
    printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() );

    while(1)
    {
        if(USBSerial.available())
        {
            CH = USBSerial.read();
            rx_buff[i] = CH;
            i++;
            if(CH == '#')
            {
                i = 0;
                USBSerial.printf("%s\r\n",rx_buff);
                memset(rx_buff,0,128);</font></font>
            }
        }
    }
}




四、展示





工程源码在附件中




CH32X035C8T6_USBSerial.zip

599.19 KB

使用特权

评论回复
沙发
xdqfc| | 2023-11-13 17:09 | 只看该作者
把这个文件下载后,编译是通不过的,麻烦楼主给一份完整的文件吧。

使用特权

评论回复
板凳
袁胜富|  楼主 | 2023-11-13 22:58 | 只看该作者
xdqfc 发表于 2023-11-13 17:09
把这个文件下载后,编译是通不过的,麻烦楼主给一份完整的文件吧。

你错了,我这儿可以啊

使用特权

评论回复
地板
xdqfc| | 2023-11-14 16:08 | 只看该作者
袁胜富 发表于 2023-11-13 22:58
你错了,我这儿可以啊

又好了,奇怪了,谢谢哈

使用特权

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

本版积分规则

32

主题

159

帖子

2

粉丝