本帖最后由 袁胜富 于 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>
}
}
}
}
四、展示
工程源码在附件中
|