一、使用STM32CubeMX----新建USB实验工程
步骤1:打开 STM32CubeMX 软件
具体 STM32CubeMX 界面如下:
2. 选择 MCU 和封装
我们本次实验选择 STM32F407ZGT6 芯片做 MCU。
3. 配置时钟
RCC 设置,选择 HSE(外部高速时钟) 为 Crystal/Ceramic Resonator(晶振/陶瓷谐振器)
选择 Clock Configuration,配置系统时钟 SYSCLK 为 168MHz
修改 HCLK 的值为 72 后,输入回车,软件会自动修改所有配置
USB的时钟需要 48MHz
步骤4:设置烧写方式为 SWD模式
这一步必须选择一种烧写方式,否则烧写一次程序后,芯片中就没法再次烧写程序了。需要硬件重启才可以重新烧写程序
步骤5:USB通信配置
激活 USB 设备
选择CDC模拟串口
如果你使用的是STM32F103那么USB 的 DP 引脚需需要上拉 1.5K 欧的电阻,电脑才能检测到 USB,否则检测不到,具体操作可以参考这篇文章:STM32CubeMX学习笔记-USB接口使用(CDC虚拟串口)_stm32 usb虚拟串口-CSDN博客
STM32F407不需要,具体可以参考这篇文章:
STM32 USB DP/DM内置的上下拉电阻阻值_usb dp上拉-CSDN博客
步骤6:项目编辑
堆设置大一点,否则识别不到USB。
每个外设生成独立的 ’.c/.h’ 文件
不勾:所有初始化代码都生成在 main.c
勾选:初始化代码生成在对应的外设文件。 如 GPIO 初始化代码生成在 gpio.c 中。
点击 GENERATE CODE 生成代码
步骤7、查看端口
有博主说Win10系统下不需要装任何驱动就能使用USB虚拟串口,但我还是下载了。
首先我们得下载STM32官方虚拟串口驱动
STM32官方虚拟串口驱动下载地址:
https://www.st.com/en/development-tools/stsw-stm32102.html
安装教程参考:【免费下载】 STM32 USB虚拟串口驱动(支持Win10)-CSDN博客
这里我选择W8_x64
在编译之前我们先点击魔术棒,进入页面选择Flash Download选项,如下图勾选选项。
这是为了烧录程序到单片机中仍要手动点复位,可以参考这篇文章:
【STM32】新版本MDK点 Reset and Run 烧录程序到单片机中仍要手动点复位解决方案_stm32 设置了reset and run 不起作用-CSDN博客
正常烧录程序,点击编译,下载。下载成功后可以在设备管理器看到虚拟串口了
如果还是看不到,那就下完驱动后重启电脑,或者按板子上的reset键。
步骤8:USB虚拟串口发送数据
在 usbd_cdc_if.c 文件中有 USB虚拟串口发送函数:
/** USB虚拟串口发送函数
* 参数1:Buf 要发送的数据缓存区
* 参数2:Len 要发送的数据个数
* 返回值:USBD_OK-成功,USBD_BUSY-忙碌, USBD_FAIL-失败
*/
uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len);
将头文件 #include "usbd_cdc_if.h" 添加到 main.c 中。
在 main主函数循环中添加 USB虚拟串口发送函数,
使用系统函数 uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)进行通讯
查看打印:
步骤9:USB虚拟串口接收数据
在 usbd_cdc_if.c 文件中,有 USB虚拟串口接收函数:
/** USB虚拟串口接收函数
* 参数1:Buf 要接收的数据缓存区
* 参数2:Len 要接收的数据个数
* 返回值:USBD_OK-成功,USBD_FAIL-失败
*/
static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len);
在USB虚拟串口接收函数中添加 CDC_Transmit_FS(Buf,*Len);,将接收到的数据发送出去。
这里应该是成功接收了,但我不清楚为什么没打印出来。各位大佬解释一下。
步骤10:虚拟串口重定向
打开 usbd_dcd_if.c 文件
添加以下代码:
/* USER CODE BEGIN INCLUDE */
#include "stdarg.h"
/* USER CODE END INCLUDE */
-------------------------------------------------------
/* USER CODE BEGIN PRIVATE_FUNCTIONS_IMPLEMENTATION */
void usb_printf(const char *format, ...)
{
va_list args;
uint32_t length;
va_start(args, format);
length = vsnprintf((char *)UserTxBufferFS, APP_TX_DATA_SIZE, (char *)format, args);
va_end(args);
CDC_Transmit_FS(UserTxBufferFS, length);
}
/* USER CODE END PRIVATE_FUNCTIONS_IMPLEMENTATION */
在 main() 的死循环中添加 usb_printf() 函数。
usb_printf("\r\n****** 庆祝中国共产党成立104周年 ******\r\n\r\n");
HAL_Delay(1000);
查看打印:
最后申明:
本文章我只是顺手学习记录一下,只用于学习交流,如有侵权多多冒犯,还请联系本人。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_52613947/article/details/149067642
|
|