打印

GD32F4上使用HAL库实现USB虚拟串口通讯

[复制链接]
2688|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
l63t89|  楼主 | 2024-2-28 20:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
一直使用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的相关选项无需配置,配置如下图所示:


使用特权

评论回复
沙发
l63t89|  楼主 | 2024-2-28 20:26 | 只看该作者
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);

使用特权

评论回复
板凳
l63t89|  楼主 | 2024-2-28 20:26 | 只看该作者
新增了一个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

使用特权

评论回复
地板
l63t89|  楼主 | 2024-2-28 20:27 | 只看该作者
完成上述修改后,其虚拟串口即可被正确识别,如下图所示:

补充:

使用特权

评论回复
5
l63t89|  楼主 | 2024-2-28 20:27 | 只看该作者
补充:上述过程漏描述了USB的初始化,应在main函数中调用兆易的USB初始化函数usbd_init,如下:
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USB_OTG_FS_PCD_Init();
  /* USER CODE BEGIN 2 */
  // USB
  usbd_init(&cdc_acm, USB_CORE_ENUM_FS, &cdc_desc, &cdc_class);

使用特权

评论回复
6
l63t89|  楼主 | 2024-2-28 20:27 | 只看该作者
为避免描述不周,调试了一版仅含USB虚拟串口通讯的源代码供参考(开发环境为STM32CubeIDE)

使用特权

评论回复
7
药无尘| | 2024-3-28 14:02 | 只看该作者
ST的HAL库还能给GD用啊

使用特权

评论回复
8
wangtaohui| | 2024-7-31 22:29 | 只看该作者
你已经选择了在使用ST的HAL库的同时,结合兆易的USB库,这是一种可行的解决方案。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

90

主题

798

帖子

1

粉丝