GD32E103 USB库和STM32是不兼容的,GD32E103是M4核,STM32F103是M3核。
在STM32 HAL库的基础上,如何加入GD32的USB库程序,这显得有点麻烦。
经过尝试,想到了一个偷懒的办法。
将GD32的USB工程生成一个lib库文件,包括初始化已经OUT事件,IN事件提供出去就行。
目录
- int ccid_usb_init(void) //int main()
- {
- usb_rcu_config();
- usb_timer_init();
- // custom_hid_itfop_register(&custom_hid, &fop_handler);
- usbd_init (&custom_hid, USB_CORE_ENUM_FS, &custom_hid_desc, &usbd_custom_hid_cb);
- usb_intr_config();
- /* CTC peripheral clock enable */
- rcu_periph_clock_enable(RCU_CTC);
- /* CTC configure */
- ctc_config();
- return 0;
- }
ccid_usb_init就是原来的mian函数,生成lib库之后main函数就不需要,启动文件*.s也不需要,所以lib库里不会主动关联中断向量表,中断需要在调用lib的工程中关联。
- //USB接受数据回调接口函数
- extern void ccid_usb_command(uint8_t *request,int len);
-
- //提供USB数据发送接口
- void ccid_usb_respond(uint8_t *respond,int len)
- {
- usbd_ep_send(&custom_hid,CUSTOMHID_IN_EP,respond, len);
- }
-
- static uint8_t custom_hid_data_out (usb_dev *udev, uint8_t ep_num)
- {
- custom_hid_handler *hid = (custom_hid_handler *)udev->dev.class_data[CUSTOM_HID_INTERFACE];
- int datalen = usbd_rxcount_get(udev,ep_num);
- ccid_usb_command(hid->data,datalen);
- usbd_ep_recev (udev, CUSTOMHID_OUT_EP, hid->data, 64);
- return USBD_OK;
- }
原来 gd32e10x_it.c中的所有中断事件屏蔽掉,预留所需要的中断函数并重命名提供外部调用
- void TIMER2_IRQHandler_lib(void)
- {
- usb_timer_irq();
- }
- void USBFS_IRQHandler_lib (void)
- {
- usbd_isr (&custom_hid);
- }
- void USBFS_WKUP_IRQHandler_lib(void)
- {
- //....
- }
注意编译时选择M3内核编译,(我单独新建了工程将原来的文件全部照搬添加上去)。M4的话HAL库不兼容。其实内核的差异只要不适用特殊操作是没有关系的。

STM32正常使用自己的工程,我测试直接用STM32CubeMx生成STM32F103C8T6的工程。
GD32E103是M4内核,USB部分的向量配置和STM32F103不一致,启动文件*.s就直接拷贝GD32E103库lib里面的文件

- void TIMER2_IRQHandler(void)
- {
- TIMER2_IRQHandler_lib();
- }
- void USBFS_IRQHandler (void)
- {
- USBFS_IRQHandler_lib();
- }
- void USBFS_WKUP_IRQHandler(void)
- {
- USBFS_WKUP_IRQHandler_lib();
- }
- extern int ccid_usb_init(void);
- int main(void)
- {
- HAL_Init();
- SystemClock_Config();
- MX_GPIO_Init();
- MX_USART1_UART_Init();
- /* USER CODE BEGIN 2 */
- ccid_usb_init();
- print_x("main start\r\n");
- /* USER CODE END 2 */
- while(1)
- {
- LED_GPIO_Port->ODR ^= LED_Pin;
- HAL_Delay(200);
- }
- }
- extern void ccid_usb_respond(uint8_t *respond,int len);
-
- void ccid_usb_command(uint8_t *request,int len)
- {
- ccid_usb_respond(request,len);
- }
所以,在工程中直接加入lib库,几段代码就把USB串联起来,收发如此清晰。
