本章不打算详细讲解USB的协议,本章只是介绍如何通过STM32CubeMX软件生成应用程序。
在看本教程之前建议先看ST官方关于USB的培训视频,示例
http://www.stmcu.com.cn/videos.html
一、USB简介
stm32F746系列芯片有USB_OTG_FS和USB_OTG_HS两种接口,FS为全速,速度12M Bit/s,HS为高速,最高速度为480M Bit/s,此时需要外接USB HS PHY,例如USB3300。HS接口也可以作为FS接口使用。由于FS和HS接口使用是相同的USB设备库,只是初始化时配置的引脚不一样,本章以FS接口为例讲解USB设备库的使用。以下为USB OTG FS的电路图:
2
|
|
|
|
USB只要由USB_DM和USB_DP两根线差分传输。OTG_ID线用来判断为主设备或时从设备的,作为OTG设备的时候使用。MIC2025/75为USB电源管理芯片,当作为设备是,从外部取电源,VBUSEN(PE2)要设置为高。当作为主机时,要拉低,USB口输出电压给从设备。
二、USB CDC
这一节介绍u***作为通讯设备类(Communication Device Class),通过USB虚拟串口通信。程序在LCD滚动显示字符工程的基础上修改,复制工程修改文件夹名。打开STM32cubeMX的工程文件重新配置,USB_OTG_FS选择设备。
|
|
|
|
|
配置系统时钟为216MHz,USB的时钟频率为48MHz.
|
|
|
|
|
开启USB中间件,选择虚拟串口。
|
|
|
|
|
USB参数配置中 VBUS sensing 选择失能,其他为默认设置。
|
|
|
|
|
中间件USB设备配置也不用修改,默认的配置。
|
|
|
|
|
设备描述符设置也不需修改,为默认设置。
|
|
|
|
|
软件会默认开启USB中断,此处也为默认优先级,不作修改。
|
|
|
|
|
生成报告以及初始化代码,编译程序。工程中多出如下文件,其中最后四个为USB设备的库文件。
|
|
|
|
|
u***_device.c里面仅包含一个USB设备函数初始化函数 MX_USB_DEVICE_Init(),在程序开始时调用。
u***d_cdc_if.c为USB的CDC类应用层文件,里面包含虚拟串口的接收,发送和控制等函数。
u***_desc.c包含USB的描述符,以及USB枚举处理等函数。
u***_conf.com为USB管脚配置文件,包含引USB引脚初始化以及参数设置,中断回调函数等。
打开u***d_cdc_if.c文件,找到虚拟串口接收函数。
1 | static int8_t CDC_Receive_FS (uint8_t* Buf, uint32_t *Len) |
3 | /* USER CODE BEGIN 6 */ |
4 | USBD_CDC_SetRxBuffer(hU***Device_0, &Buf[0]); |
5 | USBD_CDC_ReceivePacket(hU***Device_0); |
|
|
|
|
|
修改接收处理函数,接收到的字符打印输出在LCD屏幕上。
1 | static int8_t CDC_Receive_FS (uint8_t* Buf, uint32_t *Len) |
3 | /* USER CODE BEGIN 6 */ |
4 | uint8_t result = USBD_OK; |
7 | result = USBD_CDC_ReceivePacket(&hU***DeviceFS); |
8 | for(i=0;i="*" buf++;="" }="" ;="" printf("%sn",msg);="" return="" result;="" *=""user="" code="" end="" 6="" }<="" pre="">
|
|
|
|
|
|
如下为发送函数,程序中先设置发送字符,然后发送包。这里注意一点,Cube软件初始化的USB结构体是hU***DeviceFS,这里操作的结构体是hU***Device_0。故这个函数不能直接调用,必须先CDC_Init_FS()函数初始化才能用这个函数,初始化中包含有这个语句hU***Device_0 = &hU***DeviceFS。
1 | uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len) |
3 | uint8_t result = USBD_OK; |
4 | /* USER CODE BEGIN 7 */ |
5 | USBD_CDC_SetTxBuffer(hU***Device_0, Buf, Len); |
6 | result = USBD_CDC_TransmitPacket(hU***Device_0); |
|
|
|
|
|
本教程不调用这个发送函数。在main函数中while循环中添加语法每秒发送一次字符串。
01 | /* USER CODE BEGIN WHILE */ |
04 | /* USER CODE END WHILE */ |
06 | /* USER CODE BEGIN 3 */ |
07 | USBD_CDC_SetTxBuffer(&hU***DeviceFS, (uint8_t*)&UserTxBuffer, sizeof(UserTxBuffer)); |
08 | USBD_CDC_TransmitPacket(&hU***DeviceFS); |
|
|
|
|
|
在前面声明发送字符串。
2 | uint8_t UserTxBuffer[] = "WaveShare Open7XXI-C Board STM32 Virtual COM Port Driver rn"; |
在main函数中,while循环前面添加程式初始化LCD。
[color=rgb(160, 160, 160) !important]view source
[color=rgb(160, 160, 160) !important]print[color=rgb(160, 160, 160) !important]?
01 | /* USER CODE BEGIN 2 */ |
02 | /* Initialize the SDRAM */ |
04 | /* Initialize the LCD */ |
07 | BSP_LCD_SetLayerVisible(1, DISABLE); |
08 | BSP_LCD_SelectLayer(0); |
10 | /* Initialize LCD Log module */ |
13 | /* Show Header and Footer texts */ |
14 | LCD_LOG_SetHeader((uint8_t *)"Waveshare Electronics"); |
15 | LCD_LOG_SetFooter((uint8_t *)"WaveShare Open7XXI-C board"); |
|
|
|
|
|
最后添加u***d_cdc.h头文件。
1 | /* USER CODE BEGIN Includes */ |
2 | #include "stm32746g_sdram.h" |
3 | #include "stm32746g_LCD.h" |
6 | /* USER CODE END Includes */ |
最后编译程序,并下载到开发板,电脑u***线接到Open746I-C的核心板的USB接口中。打开串口助手会接到开发板发送的字符串,串口助手发送的字符会在LCD上显示。设置的串口传输格式是无效的,程序中没有设置串口传输格式,可以修改u***d_cdc_if.c文件的CDC_Control_FS()函数设置。
注:电脑要安装ST虚拟串口驱动才能设别虚拟串口。如下为虚拟串口驱动:
|
|
|
|
|
三、USB HID
本节介绍USB作为人机接口设备(Human Interface Device),开发板模拟鼠标设备。
复制上一节的工程文件,修改文件夹名。打开STM32cubeMX的工程文件重新配置,USB_OTG_FS选择设备,USB设备选择Human Interface Device。
|
|
|
|
|
USB参数配置中 VBUS sensing 选择失能,其他为默认设置。
|
|
|
|
|
USB设备中间层不需要修改,为默认设置。
|
|
|
|
|
生成报告以及初始化代码,编译程序。工程中多出如下文件,其中最后四个为USB设备的库文件。
和前面的CDC对比一下,发现USB设备库文件中,u***d_cdc.c替换为u***d_hid.c文件。u***d_cdc_if.c为CDC应用层文件也去掉了。
|
|
|
|
|