你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32CubeMX开发之STM32F407USB实验(CDC虚拟串口)

[复制链接]
STMCU小助手 发布时间:2023-2-2 15:47
前言
本次实验以 STM32F407VET6 芯片为MCU,使用 25MHz 外部时钟源。
USB通信引脚 与 MCU引脚 对应关系如下:

(N[{M2V35~IJUGMBT21MCSS.png

原理图

0ffe931f944e409aa3ef895ad8d377aa.png


一、使用STM32CubeMX----新建USB实验工程
步骤1:打开 STM32CubeMX 软件
具体 STM32CubeMX 界面如下:

5e3baed520ec4265a0fa5d86e128a87d.png

步骤2:选择 从MCU开始我的项目

b78fbedc12aa48528cd6ee408cb781a5.png

步骤3:选择MCU芯片
我们本次实验选择 STM32F407VET6 芯片做 MCU。

fe3160420fda4e639189697407f7a41e.png


进入工程编辑,具体界面如下:

2b36307036d54321854c09041aef8af2.png

步骤4:设置烧写方式为 SWD模式
这一步必须选择一种烧写方式,否则烧写一次程序后,芯片中就没法再次烧写程序了。需要硬件重启才可以重新烧写程序

772505d02fc841edb6087325c6d5a918.png

步骤5:设置时钟源
设置外部晶振为芯片系统时钟源。

9d4935492cd940f8a8f9d70b24ff5d5c.png

步骤6:USB通信配置
激活 USB 设备

3a7889bcf93246759229dfbd0756c59c.png

选择CDC模拟串口

9eeb84778149413c92046fb8a6851e37.png


步骤7:设置时钟
因为USB的时钟需要 48MHz,所以时钟配置如下:

30ac6a7ae6ef4897bc2ceec484b379ce.png


步骤8:项目编辑
堆设置大一点,否则识别不到USB。

c636c3e66e534d3da4e2d2c6b9165e7c.png

步骤9:代码生成编辑

61eaf4a2790c4e5a89ab2b777d2b2b24.png

步骤10:点击 GENERATE CODE 生成代码

9fe5104095df4ce9b3e59e948637ae60.png

新建的工程,已经生成,接下来就是对工程代码的编辑。


二、使用keil5----编辑程序
想要使用keil5打开工程,需要电脑先安装 keil5编译环境,具体操作流程。

步骤1:使用keil5打开工程
点击工程文件中的MDK-ARM 文件

bade50b163404970a35f8f80ffdba501.png

打开keil5工程

7b083045873c4683a9f445d8d99ceea0.png

步骤2:用户代码编辑位置
用户代码 要写在 USER xxxx BEGIN xxx 和 USER xxxx END xxx 之间。
这样下次使用 STM32CubeMX 重新生成代码后,自己写的代码不会被删除。

bb60a691bb4145209db966d0f63aecb3.png

步骤3:查看USB虚拟串口的端口
首先编译程序,然后烧录程序到开发板,具体步骤如下:

烧写完程序后,连接开发板和PC端电脑,然后在设备管理器中查看USB虚拟串口的端口。
有以下端口,就说明USB虚拟串口功能实现了。

fadf11a591f849f5988973bd07bade02.png

步骤4:USB虚拟串口发送数据
在 usbd_cdc_if.c 文件中有 USB虚拟串口发送函数:
  1. /** USB虚拟串口发送函数
  2.   * 参数1:Buf 要发送的数据缓存区
  3.   * 参数2:Len 要发送的数据个数
  4.   * 返回值:USBD_OK-成功,USBD_BUSY-忙碌, USBD_FAIL-失败
  5.   */
  6. uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len);
复制代码

将头文件 #include "usbd_cdc_if.h" 添加到 main.c 中。

5d05ebcf2a534b6ea8319fe615bf3766.png

在 main主函数循环中添加 USB虚拟串口发送函数
  1. int main(void)
  2. {
  3.   /* USER CODE BEGIN 1 */

  4.   /* USER CODE END 1 */

  5.   /* MCU Configuration--------------------------------------------------------*/

  6.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  7.   HAL_Init();

  8.   /* USER CODE BEGIN Init */

  9.   /* USER CODE END Init */

  10.   /* Configure the system clock */
  11.   SystemClock_Config();

  12.   /* USER CODE BEGIN SysInit */

  13.   /* USER CODE END SysInit */

  14.   /* Initialize all configured peripherals */
  15.   MX_GPIO_Init();
  16.   MX_USART1_UART_Init();
  17.   MX_USB_DEVICE_Init();
  18.   /* USER CODE BEGIN 2 */

  19.   /* USER CODE END 2 */

  20.   /* Infinite loop */
  21.   /* USER CODE BEGIN WHILE */
  22.   while (1)
  23.   {
  24.     /* USER CODE END WHILE */

  25.     /* USER CODE BEGIN 3 */
  26.         CDC_Transmit_FS("工欲善其事,必先利其器。",strlen("工欲善其事,必先利其器。"));
  27.         HAL_Delay(500);
  28.   }
  29.   /* USER CODE END 3 */
  30. }
复制代码

使用串口助手打印数据如下:

3ee5814c820741cb8577affb9e366334.png

步骤5:USB虚拟串口接收数据
在 usbd_cdc_if.c 文件中,有 USB虚拟串口接收函数:
  1. /** USB虚拟串口接收函数
  2.   * 参数1:Buf 要接收的数据缓存区
  3.   * 参数2:Len 要接收的数据个数
  4.   * 返回值:USBD_OK-成功,USBD_FAIL-失败
  5.   */
  6. static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len);
复制代码

在USB虚拟串口接收函数中添加 CDC_Transmit_FS(Buf,*Len);,将接收到的数据发送出去。

875ea12e40464964bbc66cafe0485039.png

使用串口助手调试如下:

f77e04111a7c46a096fbde3cb91a19c9.png

————————————————
版权声明:根号五


收藏 评论0 发布时间:2023-2-2 15:47

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版