一直使用STM32F4搭配HAL库做项目,最近需要将软件移植至国产的GD32F4上,但兆易仅提供了标准库,并未像ST那样提供HAL库,但二者USB库又互不兼容。最后,为了原软件不做大的修改,故决定使用ST的HAL库+兆易的USB库来实现。
- 首先是USB库文件的准备,兆易官网可下载GD32F4xx_Firmware_Library,将Firmware\GD32F4xx_usb_library目录下的相关文件拷贝至工程目录中,并添加至工程中,文件目录结构如下图所示:
另外,在Examples\USB\USB_Device\cdc_acm\inc目录下的usb_conf.h和usbd_conf.h也需要拷贝至工程的inc目录中。 - USB的硬件配置还是使用ST的CubeMX生成,USB模式选择Device_Only,Middleware中USB的相关选项无需配置,配置如下图所示:
- USB库文件需要做简单的修改,睡眠模式相关函数pmu_to_deepsleepmode和微秒延时函数usb_udelay直接注释掉了,毫秒延时函数usb_mdelay用HAL_Delay替代。
- usb_conf.h中相关的头文件进行了替换修改,如下:
#include "stm32f407xx.h"
#include "stm32f4xx_hal.h"
#include "gd32f4xx_compat.h"
//#include "gd32f4xx.h"
//#include "gd32f450i_eval.h"
stm32f4xx_it.c中的USB中断处理函数HAL_PCD_IRQHandler用usbd_isr进行替代,如下:
// HAL_PCD_IRQHandler(&hpcd_USB_OTG_FS);
usbd_isr(&cdc_acm);
- 新增了一个USB库所需宏定义描述的文件gd32f4xx_compat.h,如下:
#ifndef GD32F4XX_COMPAT_H
#define GD32F4XX_COMPAT_H
/* bit operations */
#define REG32(addr) (*(volatile uint32_t *)(uint32_t)(addr))
#define REG16(addr) (*(volatile uint16_t *)(uint32_t)(addr))
#define REG8(addr) (*(volatile uint8_t *)(uint32_t)(addr))
#define BIT(x) ((uint32_t)((uint32_t)0x01U<<(x)))
#define BITS(start, end) ((0xFFFFFFFFUL << (start)) & (0xFFFFFFFFUL >> (31U - (uint32_t)(end))))
#define GET_BITS(regval, start, end) (((regval) & BITS((start),(end))) >> (start))
#endif
- 完成上述修改后,其虚拟串口即可被正确识别,如下图所示:
|