GD32E103 USB库和STM32是不兼容的,GD32E103是M4核,STM32F103是M3核。
在STM32 HAL库的基础上,如何加入GD32的USB库程序,这显得有点麻烦。
经过尝试,想到了一个偷懒的办法。
将GD32的USB工程生成一个lib库文件,包括初始化已经OUT事件,IN事件提供出去就行。
目录
1.lib库配置
1.1、在lib库根据需要修改GD的USB配置
1.2、封装lib接口函数
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;
}
1.3、事件中断接口
原来 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)
{
//....
}
1.4、生成lib文件
注意编译时选择M3内核编译,(我单独新建了工程将原来的文件全部照搬添加上去)。M4的话HAL库不兼容。其实内核的差异只要不适用特殊操作是没有关系的。
2、程序调用lib
STM32正常使用自己的工程,我测试直接用STM32CubeMx生成STM32F103C8T6的工程。
GD32E103是M4内核,USB部分的向量配置和STM32F103不一致,启动文件*.s就直接拷贝GD32E103库lib里面的文件
2.1、添加lib库文件
2.2、关联中断回调函数
void TIMER2_IRQHandler(void)
{
TIMER2_IRQHandler_lib();
}
void USBFS_IRQHandler (void)
{
USBFS_IRQHandler_lib();
}
void USBFS_WKUP_IRQHandler(void)
{
USBFS_WKUP_IRQHandler_lib();
}
2.3、初始化
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);
}
}
2.4、收发测试
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串联起来,收发如此清晰。