1. 硬件连接
确保USB鼠标通过USB接口连接到GD32F470开发板。开发板通常提供USB接口,可以直接使用。
2. 配置USB主机模式
需要配置USB时钟、GPIO和中断,以支持全速USB主机功能。
2.1 配置USB时钟
c复制
void usb_clock_config(void) {
rcu_periph_clock_enable(RCU_USBFS); // 启用USBFS时钟
rcu_usb_clock_config(RCU_CKUSB_CKPLL_DIV1); // 配置USB时钟源
}
2.2 配置GPIO
c复制
void usb_gpio_config(void) {
rcu_periph_clock_enable(RCU_GPIOA);
gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_11 | GPIO_PIN_12);
gpio_af_set(GPIOA, GPIO_AF_10, GPIO_PIN_11 | GPIO_PIN_12);
}
2.3 配置中断
c复制
void usb_interrupt_config(void) {
nvic_priority_group_set(NVIC_PRIGROUP_PRE4_SUB0);
nvic_irq_enable(USBFS_IRQn, 2, 0); // 启用USBFS中断
}
3. 初始化USB主机
使用GD32的USB库初始化USB主机功能。
c复制
usb_core_driver usb_host;
void usb_host_init(void) {
usb_clock_config();
usb_gpio_config();
usb_interrupt_config();
usb_host_init(&usb_host, USB_CORE_ENUM_FS); // 初始化USB主机
}
4. 枚举USB鼠标设备
USB主机需要枚举鼠标设备,获取其描述符并配置通信。
c复制
void usb_host_enum(void) {
if (usb_host_device_attach(&usb_host)) { // 检测设备连接
usb_host_device_enum(&usb_host); // 枚举设备
usb_host_device_config(&usb_host); // 配置设备
}
}
5. 数据处理
USB鼠标通常通过中断传输发送数据,数据格式包括按键状态和移动量。
c复制
void usb_mouse_data_process(uint8_t *data, uint32_t length) {
if (length >= 3) { // 鼠标数据长度至少为3字节
int8_t x = data[1];
int8_t y = data[2];
uint8_t buttons = data[0];
printf("Mouse X: %d, Y: %d, Buttons: %d\n", x, y, buttons);
}
}
6. 主循环
在主循环中,持续检测USB设备状态并处理鼠标数据。
c复制
int main(void) {
usb_host_init();
while (1) {
usb_host_enum(); // 枚举设备
if (usb_host_device_connected(&usb_host)) { // 检查设备是否连接
uint8_t data[64];
uint32_t length = usb_host_device_data_receive(&usb_host, data, sizeof(data)); // 接收鼠标数据
if (length > 0) {
usb_mouse_data_process(data, length); // 处理鼠标数据
}
}
}
}
注意事项
-
时钟配置:确保USB时钟配置正确,否则可能导致通信失败。
-
中断处理:USB中断优先级应适当配置,避免影响其他任务。
-
调试:通过串口打印调试信息,帮助理解鼠标数据格式。