GD32E103 USB官方库 + STM32CubeMX

        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接口函数

1.3、事件中断接口

生成lib文件

2、程序调用lib

2.1、添加lib库文件

 2.2、关联中断回调函数

2.3、初始化

2.4、收发测试


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串联起来,收发如此清晰。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值