#include "gd32f4xx.h"
#include "usbd_core.h"
#include "usbd_cdc_rtx.h"
// USB传输缓冲区大小
#define BUFFER_SIZE 64
// USB设备端口配置
#define USB_CORE_RX_PORT GPIOA
#define USB_CORE_RX_PIN GPIO_PIN_11
#define USB_CORE_TX_PORT GPIOA
#define USB_CORE_TX_PIN GPIO_PIN_12
static uint8_t usbReceiveBuffer[BUFFER_SIZE];
static uint8_t usbTransmitBuffer[BUFFER_SIZE];
void usbCdcDataReceived(uint8_t *data, uint32_t length)
{
// 在这里处理接收到的USB数据
// 可以将数据发送回上位机或进行其他操作
usbSendData(data, length);
}
usbd_cdc_cb_struct cdcCallbacks = {
.data_received = usbCdcDataReceived
};
void usbInterruptHandler(void)
{
usbd_polling(&USB_OTG_dev);
}
void usbInit(void)
{
nvic_priority_group_set(NVIC_PRIGROUP_PRE1_SUB3);
rcu_pll48m_clock_config(RCU_PLL48MSRC_PLLQ);
// 配置USB时钟和中断
rcu_periph_clock_enable(RCU_USBFS);
nvic_irq_enable(USBFS_IRQn, 0, 0);
usbd_init(&USB_OTG_dev, USB_CORE_MODE_DEVICE, &usbd_cdc_cb, &cdcCallbacks);
// 配置USB端口
rcu_periph_clock_enable(RCU_GPIOA);
gpio_af_set(USB_CORE_RX_PORT, GPIO_AF_10, USB_CORE_RX_PIN);
gpio_af_set(USB_CORE_TX_PORT, GPIO_AF_10, USB_CORE_TX_PIN);
gpio_mode_set(USB_CORE_RX_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP, USB_CORE_RX_PIN);
gpio_output_options_set(USB_CORE_RX_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_100MHZ, USB_CORE_RX_PIN);
gpio_mode_set(USB_CORE_TX_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP, USB_CORE_TX_PIN);
gpio_output_options_set(USB_CORE_TX_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_100MHZ, USB_CORE_TX_PIN);
}
void usbSendData(uint8_t *data, uint32_t length)
{
uint32_t sendDataLength = (length > BUFFER_SIZE) ? BUFFER_SIZE : length;
memcpy(usbTransmitBuffer, data, sendDataLength);
usbd_cdc_send_data(&USB_OTG_dev, usbTransmitBuffer, sendDataLength);
}
int main(void)
{
// 初始化USB
usbInit();
while (1)
{
// 在这里可以处理其他任务
// 处理USB中断
usbInterruptHandler();
}
return 0;
}
// USB中断处理函数
void USBFS_IRQHandler(void)
{
usbd_interrupt_handler(&USB_OTG_dev);
}