文章目录
- 一、前言
- 二、STM32CubeMX生成代码
- 2.1 选择芯片
- 2.2 配置相关模式
- 2.3 设置时钟频率
- 2.4 生成代码
- 2.5 编译并下载代码
- 2.6 结果
- 2.7 问题
- 三、回环测试
- 3.1 打开工程
- 3.2 添加回环代码
- 3.3 编译烧录并测试
- 四、出现问题和解决方法
- 4.1 烧录总是要自己插拔USB
- 4.2 自己生成的工程没有测试成功
一、前言
最近在学习STM32的USB功能,主要是想要使用虚拟串口(VCP)功能,来解决串口传输速率较低的问题,达到于上位机高效通信的目的。
使用芯片:STM32F407ZGT6
使用函数:HAL库
使用工具:STM32CubeMX + Keil uVision5
串口工具:VOFA
二、STM32CubeMX生成代码
2.1 选择芯片
2.2 配置相关模式
主要配置内容:
- 调试模式为Serial;
- 使用外部时钟
- 设置为USB为从设备
- 配置为CDC模式的VCP
2.3 设置时钟频率
有两个需要注意点:
1. 左边的这个数值是你自己板子上的外部晶振的频率,具体是多少看你的板子或者去问商家。
2. 最终的频率要设置为48MHz。
然后要注意软件在自动选择晶振频率的时候有没有设置为外部晶振,如下图的提示。里面具体一些倍率选择要自己调一调,反正最后是48MHz就可以了。
2.4 生成代码
自己给工程命名然后选择打开的编译器
2.5 编译并下载代码
编译一下工程,然后下载到板子上面去。
2.6 结果
在弹出的弹窗看到下面的提示或者在设备管理器中查看到下面的设备就说明成功了
2.7 问题
烧录之后弹窗说识别不了USB设备或者在设备管理器没看到多出来的串口
解决方法:
- 重新插拔USB设备
- 检查晶振(外部晶振、主晶振、和USB晶振,具体看2.3的提示)是否正确
- 可能USB的引脚没有上拉电阻(猜想,具体不清楚)
三、回环测试
如果没有上面的问题,那恭喜你,可以继续往下测试VCP功能了。
3.1 打开工程
3.2 添加回环代码
在"usbd_cdc_if.h"
中找到函数CDC_Receive_FS()
,在里面添加下面的代码:
CDC_Transmit_FS(Buf, *Len);
最终整个函数的代码如下:
static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{
/* USER CODE BEGIN 6 */
USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
USBD_CDC_ReceivePacket(&hUsbDeviceFS);
CDC_Transmit_FS(Buf, *Len);
return (USBD_OK);
/* USER CODE END 6 */
}
3.3 编译烧录并测试
打开串口工具,然后选择你的串口号,发送任意字符,就可以看到回传了你发送的字符。
四、出现问题和解决方法
4.1 烧录总是要自己插拔USB
【STM32】USB程序烧录需要重新上电 & 软件复位方法
4.2 自己生成的工程没有测试成功
使用我的工程,自己对比一下看看
STM32F407 USB的 CDC 虚拟串口(VCP)程序
https://download.csdn.net/download/weixin_52296952/88775046
去我的主页的资源
里面找找