STM32CubeMX 下载和安装 详细教程
【HAL库】STM32CubeMX开发----STM32F407----目录
STM32F407-HAL库:USB实验(CDC虚拟串口)- 程序源码
前言
本次实验以 STM32F407VET6 芯片为MCU,使用 25MHz 外部时钟源。
USB通信引脚 与 MCU引脚 对应关系如下:
USB通信引脚 | MCU引脚 |
---|---|
DM(D-) | PA11 |
DP(D+) | PA12 |
原理图
一、使用STM32CubeMX----新建USB实验工程
步骤1:打开 STM32CubeMX 软件
具体 STM32CubeMX 界面如下:
步骤2:选择 从MCU开始我的项目
步骤3:选择MCU芯片
我们本次实验选择 STM32F407VET6 芯片做 MCU。
进入工程编辑,具体界面如下:
步骤4:设置烧写方式为 SWD模式
这一步必须选择一种烧写方式,否则烧写一次程序后,芯片中就没法再次烧写程序了。需要硬件重启才可以重新烧写程序。
步骤5:设置时钟源
设置外部晶振为芯片系统时钟源。
步骤6:USB通信配置
激活 USB 设备
选择CDC模拟串口
步骤7:设置时钟
因为USB的时钟需要 48MHz,所以时钟配置如下:
步骤8:项目编辑
堆设置大一点,否则识别不到USB。
步骤9:代码生成编辑
步骤10:点击 GENERATE CODE 生成代码
新建的工程,已经生成,接下来就是对工程代码的编辑。
二、使用keil5----编辑程序
想要使用keil5打开工程,需要电脑先安装 keil5编译环境,具体操作流程。
可以点击下方文章链接:Keil5编译环境搭建流程
步骤1:使用keil5打开工程
点击工程文件中的MDK-ARM 文件
打开keil5工程
步骤2:用户代码编辑位置
用户代码 要写在 USER xxxx BEGIN xxx 和 USER xxxx END xxx 之间。
这样下次使用 STM32CubeMX 重新生成代码后,自己写的代码不会被删除。
步骤3:查看USB虚拟串口的端口
首先编译程序,然后烧录程序到开发板,具体步骤如下:
文章链接:
【STM32】烧写程序:ST-link V2调试下载器实物和连接方式
【STM32】烧写程序:ST-link驱动下载和安装
【STM32】烧写程序:Keil5使用ST-link下载程序
资源链接:ST-link驱动链接----点击下载
烧写完程序后,连接开发板和PC端电脑,然后在设备管理器中查看USB虚拟串口的端口。
有以下端口,就说明USB虚拟串口功能实现了。
步骤4: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虚拟串口发送函数
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART1_UART_Init();
MX_USB_DEVICE_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
CDC_Transmit_FS("工欲善其事,必先利其器。",strlen("工欲善其事,必先利其器。"));
HAL_Delay(500);
}
/* USER CODE END 3 */
}
其中的strlen()函数详解:C语言:strlen() — 计算字符串长度
使用串口助手打印数据如下:
步骤5: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);
,将接收到的数据发送出去。
使用串口助手调试如下: