STM32基于Cube实现USB虚拟串口

版本

软件版本

  • Cube:5.4.0

  • HAL:STM32Cube FW_F4 V1.24.2

  • Keil:V5.25.2.0

硬件版本

  • STM32F407ZGT6

目标

实现USB虚拟串口功能。

重点

  1. HeapStack的配置
  2. 读操作CDC_Receive_FS的改写
  3. 项目工程源码链接

过程

Cube配置

RCC配置

使能外部和内部时钟。

RCC配置

SYS配置

使用SWD调试,时间基准源采用SysTick

SYS配置

USB_OTG_FS配置

该配置选择Device_Only模式,其他配置默认即可。

USB_OTG_FS配置

USB_DEVICE配置

Class For FS - CDC,其他配置默认即可。
USB_DEVICE配置

时钟配置

使用系统方案,需要注意的点:

  1. 选用外部HSE时钟源;
  2. 将USB时钟配置为48MHz。

如下图所示:
时钟配置

生成Keil工程

生成工程时,需要将内置的Heap_Stack扩大,否则在USB虚拟串口时,电脑会出现黄色感叹号的情况1,本工程配置如下:

生成Keil工程

软件配置

在生成的工程中,主要通过配置usbd_cdc_if.c文件实现对串口的操作,常用操作有读写操作,如下:

读操作

CDC_Receive_FS

  • 原型:
static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
变量类型说明
Bufuint8_t*接收到的数据源指针
Lenuint32_t *接收到的数据长度

该方法为静态方法,由系统底层进行调用,用户不需要直接调用该方法。用户只需要在这个函数中添加代码,将数据和数据长度复制到自己的接收缓存中即可2

  • 例子
/* USER CODE BEGIN PRIVATE_VARIABLES */
extern unsigned char rxBuff[2048];  // 外部接收缓存
extern uint32_t wIdx; 				// 写指针
/* USER CODE END PRIVATE_VARIABLES */

// 其他代码 ...

static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{
  /* USER CODE BEGIN 6 */
  // 将数据循环写入全局变量缓存中
  for(int i=0;i<Len[0];i++)
  {
    rxBuff[((wIdx++)&0x7FF)] = Buf[i];
  }
  USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
  USBD_CDC_ReceivePacket(&hUsbDeviceFS);
  return (USBD_OK);
  /* USER CODE END 6 */
}

写操作

CDC_Transmit_FS

  • 原型:
uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)
变量类型说明
Bufuint8_t*发送的数据源指针
Lenuint32_t *发送的数据长度

该方法在头文件中对外有生命,所以使用过程中直接调用即可。

  • 例子:
// 其他代码 ...
CDC_Transmit_FS((unsigned char *)txBuff, sprintf(txBuff, "dlt  - %10d\r\n", dlt));
// 其他代码 ...

总结

通过USB虚拟串口功能,可以节省硬件的设计,同时USB接口还可以设计为HID设备,所以选用USB设备可以极大程度节省开发硬件成本,但是会增加软件开发成本,不过总的来说优大于劣。

参考


  1. http://news.eeworld.com.cn/mcu/article_2018060239506.html ↩︎

  2. https://www.jianshu.com/p/82f277d0fe2b ↩︎

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值