Skip to content

USB HS 实现USB串口功能 F407

这个方案和之前的区别是使用了USB3300芯片,来实现了HS 的功能,绝大部分st的芯片是只有FS的USB,而HS USB 需要外接芯片实现。

HS 高速USB,最高速度 480M,理论最高文件传输速度 40M以上。 (USB3300 貌似达不到最高) FS 全速USB,最高速度12M

由上可知,两个USB的速度有着较大的差别,HS 才是我们实际设备中使用的USB2.0,FS更多是对之前协议的兼容。

1. 硬件连接

这里笔者尝试过购买类似下图的USB的模块,发现此模块飞线和单片机连接,无法成功初始化代码。 网上成功的案例,都是直接接入板子。
alt text

笔者使用的是立创开源的项目,在此将连接附上:https://oshwhub.com/emmmhsm/F407VEyu-USB3300hu-xin-ban

alt text

此板子在使用的时候遇到一些问题,在此记录

  1. 因为加工精度的问题,制作后丝印不清晰
  2. 没有预留DAP的debug口
  3. 板子上是有源晶振,我不喜欢
    后续制作一款更适合debug的,分享出来。

2. CubeMX生成代码

  1. 配置debug口 alt text

  2. 配置外部晶振 ps:部分mcu型号,内部晶振也能正常通讯USB,但笔者这里没有深入研究,直接配置外部晶振 alt text

  3. 使能USB模块 在这里都是默认的配置,没有修改。

alt text

  1. 配置USB 为串口设备

alt text

PS: 需要修改设备名称的话,可以修改这个框出的位置,以及同时修改PID,以及VID,笔者这里就不修改了。 alt text

  1. 展示一下配置到现在的GPIO状态,基本上就是最基础的功能。

alt text

  1. 这里的外部晶振频率换成了10M,因为板子上焊接的是这个频率的。建议到时候也注意一下,防止晶振频率配置的不正确 alt text

  2. 工程大概如此,选择自己喜欢的IDE就可以了

alt text

3. 编写代码

实现串口输出ABCD,需要更改的部分

C
//1.添加头文件
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "usb_device.h"
#include "gpio.h"
#include "usbd_cdc_if.h"

更改main函数

C
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */


/* USER CODE END 0 */
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_USB_DEVICE_Init();
  /* USER CODE BEGIN 2 */
	//2.添加数组
	unsigned char buff[10] = {"abcd\n\r"};
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		//3. 在while循环中添加如下代码
		HAL_Delay(1000);
		CDC_Transmit_HS(buff,sizeof(buff)); //USB 串口发送数据
  }
  /* USER CODE END 3 */
}

串口显示的数据 alt text

4. 后记

后续板子可以优化的部分

  1. 增加音频的I2s接口,可以当作音频设备来使用
  2. 增加SD接口,可以验证U盘的功能
  3. 增加相机的接口,可以验证摄像头方案

如果后面有时间自己做个类似的板子,调试一下。