之前在项目中使用ST的芯片,为快速实现驱动,都是使用的stm32 cube直接创建项目工程,所以工程上都是基于HAL库开发的。最近在调试gd32f4xx芯片调试usb驱动,发现通过cube生成的工程无法在GD32上识别到USB设备,上电后出现:"设备描述符请求失败"的问题,所以,只能通过gd32的usb库进行移植,下面是记录基于stm32的HAL库工程去移植GD32提供的usb库过程:
第一部分:相关环境
- 硬件芯片:GD32F425xx
- 工具:STM32 Cube
第二部分:实现流程
- 先通过stm32 cube生成一份基础工程,按以下步骤:
1)打开cube,选择芯片型号:
选择调试模式,时钟源,配置好各总线时钟:
配置USB为从设备,因为板子硬件使用的是USB-HS口,所以在选择为USB-OTG_HS为从设备:
如果有使用到VBUS脚,就直接勾选:
在USB_DEVICE下选择使用虚拟串口:
同时,在选择对应的USB设备后,时钟配置界面也会相应的生效,需要进行调整,确保48MHZ时钟源,如下:
最后,在项目管理界面中填写目录路径,目录名称,选择打开工具,填写对应的堆栈大小(这里因用到USB库,需要调大):
选择需要添加库文件,是否分开源文件和头文件,再点击生成代码,完成编译即可。
从GD官网上下载标定固件库:
https://www.gd32mcu.com/cn/download?kw=GD32F4xx_Firmware&lan=cn
2)把USB库有ST的替换成GD32的
把工程中根据ST相关的USB库删除(包括工程中的源文件及头文件目录),同时把GD32跟USB相关的文件直接加入到工程中:
加进来后,肯定会报错误,包括工程中的睡眠模式相关函数pmu_to_deepsleepmode及微秒延时函数usb_udelay/usb_mdelay函数:
pmu_to_deepsleepmode是根usb进入休眠相关,可以直接注释掉。
usb_udelay:是us延时函数,直接自定义下,在函数里面加入几个__NOP();即可
usb_mdelay;是ms延时函数,直接用HAL_Delay代替
同时,usb_conf.h文件中也会报错,错误地方直接用下面方式代替:
其中,gd32f4xx_compat.h文件需要自定义,里面内容如下:
#ifndef GD32F4XX_COMPAT_H
#define GD32F4XX_COMPAT_H
/* bit operations */
#define REG32(addr) (*(volatile uint32_t *)(uint32_t)