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

    1. int ccid_usb_init(void) //int main()
    2. {
    3. usb_rcu_config();
    4. usb_timer_init();
    5. // custom_hid_itfop_register(&custom_hid, &fop_handler);
    6. usbd_init (&custom_hid, USB_CORE_ENUM_FS, &custom_hid_desc, &usbd_custom_hid_cb);
    7. usb_intr_config();
    8. /* CTC peripheral clock enable */
    9. rcu_periph_clock_enable(RCU_CTC);
    10. /* CTC configure */
    11. ctc_config();
    12. return 0;
    13. }

            ccid_usb_init就是原来的mian函数,生成lib库之后main函数就不需要,启动文件*.s也不需要,所以lib库里不会主动关联中断向量表,中断需要在调用lib的工程中关联

    1. //USB接受数据回调接口函数
    2. extern void ccid_usb_command(uint8_t *request,int len);
    3. //提供USB数据发送接口
    4. void ccid_usb_respond(uint8_t *respond,int len)
    5. {
    6. usbd_ep_send(&custom_hid,CUSTOMHID_IN_EP,respond, len);
    7. }
    8. static uint8_t custom_hid_data_out (usb_dev *udev, uint8_t ep_num)
    9. {
    10. custom_hid_handler *hid = (custom_hid_handler *)udev->dev.class_data[CUSTOM_HID_INTERFACE];
    11. int datalen = usbd_rxcount_get(udev,ep_num);
    12. ccid_usb_command(hid->data,datalen);
    13. usbd_ep_recev (udev, CUSTOMHID_OUT_EP, hid->data, 64);
    14. return USBD_OK;
    15. }

    1.3、事件中断接口

    原来 gd32e10x_it.c中的所有中断事件屏蔽掉,预留所需要的中断函数并重命名提供外部调用

    1. void TIMER2_IRQHandler_lib(void)
    2. {
    3. usb_timer_irq();
    4. }
    5. void USBFS_IRQHandler_lib (void)
    6. {
    7. usbd_isr (&custom_hid);
    8. }
    9. void USBFS_WKUP_IRQHandler_lib(void)
    10. {
    11. //....
    12. }

    1.4、生成lib文件

    注意编译时选择M3内核编译,(我单独新建了工程将原来的文件全部照搬添加上去)。M4的话HAL库不兼容。其实内核的差异只要不适用特殊操作是没有关系的。

    2、程序调用lib

            STM32正常使用自己的工程,我测试直接用STM32CubeMx生成STM32F103C8T6的工程。

    GD32E103是M4内核,USB部分的向量配置和STM32F103不一致,启动文件*.s就直接拷贝GD32E103库lib里面的文件

    2.1、添加lib库文件

     2.2、关联中断回调函数

    1. void TIMER2_IRQHandler(void)
    2. {
    3. TIMER2_IRQHandler_lib();
    4. }
    5. void USBFS_IRQHandler (void)
    6. {
    7. USBFS_IRQHandler_lib();
    8. }
    9. void USBFS_WKUP_IRQHandler(void)
    10. {
    11. USBFS_WKUP_IRQHandler_lib();
    12. }

    2.3、初始化

    1. extern int ccid_usb_init(void);
    2. int main(void)
    3. {
    4. HAL_Init();
    5. SystemClock_Config();
    6. MX_GPIO_Init();
    7. MX_USART1_UART_Init();
    8. /* USER CODE BEGIN 2 */
    9. ccid_usb_init();
    10. print_x("main start\r\n");
    11. /* USER CODE END 2 */
    12. while(1)
    13. {
    14. LED_GPIO_Port->ODR ^= LED_Pin;
    15. HAL_Delay(200);
    16. }
    17. }

    2.4、收发测试

    1. extern void ccid_usb_respond(uint8_t *respond,int len);
    2. void ccid_usb_command(uint8_t *request,int len)
    3. {
    4. ccid_usb_respond(request,len);
    5. }

    所以,在工程中直接加入lib库,几段代码就把USB串联起来,收发如此清晰。

  • 相关阅读:
    led灯珠型号及使用参数
    cannot access ‘/docker-entrypoint-initdb.d/‘: Operation not permitted
    Python | 打包 .py 为可执行文件.exe
    【python】(三)python控制流
    阿里云r8i内存型服务器ECS实例介绍_CPU性能_网络存储测评
    QSpace Pro 4.0.4.001(多面板文件管理器)
    Lab【1】:Blitz
    聚乙烯醇和壳聚糖水凝胶复合物负载黑磷纳米片/壳聚糖氧化石墨烯纳米水凝胶的研究制备
    K_A05_001 基于 STM32等单片机驱动8X8点阵模块(MAX7219)显示0-9
    halcon知识:矩阵专题【01】
  • 原文地址:https://blog.csdn.net/ai5945fei/article/details/126182128