本帖最后由 正点原子运营 于 2024-5-27 11:03 编辑
1)实验平台:正点原子 M144Z-M3 STM32F103最小系统板
2) 章节摘自【正点原子】M144Z-M3最小系统板使用指南——STM32F103版
6)正点原子STM32技术交流QQ群:725095144
本章将介绍使用STM32F103作为USB从设备,模拟出USB读卡器,使得PC与STM32F103通过USB连接后,能够访问与STM32F103连接的SD中的数据。通过本章的学习,读者将学习到STM32F103作为USB从设备模拟出USB读卡器的使用。 本章分为如下几个小节: 55.1 硬件设计 55.2 程序设计 55.3 下载验证
55.1 硬件设计 55.1.1 例程功能 1. LCD上显示SD卡和NOR Flash容量 2. 当通过USB接口连接至USB Host时,LCD上显示USB连接状态和读写状态,同时USBHost设备可对SD卡和NOR Flash中的文件进行操作 3. LED0闪烁,提示程序正在运行 55.1.2 硬件资源 1. LED LED0 - PB5 LED1 – PE6 2. 正点原子 2.8/3.5/4.3/7/10寸TFTLCD模块 3. NOR Flash SPI2_SCK - PB13 SPI2_MISO - PB14 SPI2_MOSI - PB15 SPI2_CS - PB12 4. SD SDIO_D0 - PC8 SDIO_D1 - PC9 SDIO_D2 - PC10 SDIO_D3 - PC11 SDIO_SCK - PC12 SDIO_CMD - PD2 5. USB USB_DM - PA11 USB_DP - PA12
55.1.3原理图 本章实验使用USB接口与PC进行连接,开发板板载了一个USB接口,用于连接其他USB设备,USB接口与MCU的连接原理图,如下图所示: 图55.1.3.1 USB接口与MCU的连接原理图 55.2 程序设计 55.2.1 ST的USB设备驱动库 ST针对STM32F1的USB设备驱动库为STM32_USB_Device_Library,该USB设备驱动库由ST提供对STM32CubeF1软件包一起提供,如下图所示: 图55.2.1.1STM32_USB_Device_library 从上图中也可以看出,STM32CubeF1软件包提供了USB主机和设备的驱动库,本书主要介绍USB设备的应用,因此主要关注STM32_USB_Device_Library。 本书不展开讲解USB的相关原理,若读者想更加深入地了解USB,请自行查阅相关资料。
55.2.2 实验应用代码 本章实验的应用代码,如下所示: - int main(void)
- {
- /* 仅保留关键代码,其余代码省略 */
-
- /*初始化USB */
- USBD_Init(&USBD_Device, &MSC_Desc, 0);
- /* 添加类 */
- USBD_RegisterClass(&USBD_Device, USBD_MSC_CLASS);
- /* 为MSC类添加回调函数 */
- USBD_MSC_RegisterStorage(&USBD_Device, &USBD_DISK_fops);
- /* 开启USB */
- USBD_Start(&USBD_Device);
-
- while (1)
- {
- t++;
-
- /* USB状态改变 */
- if (usb_sta != g_usb_state_reg)
- {
- lcd_fill(30, 190, 240, 190 + 16, WHITE);
-
- /* 正在写入 */
- if (g_usb_state_reg & 0x01)
- {
- LED1(0);
- lcd_show_string(30, 190, 200, 16, 16, "USB Writing...", RED);
- }
-
- /* 正在读取 */
- if (g_usb_state_reg & 0x02)
- {
- LED1(0);
- lcd_show_string(30, 190, 200, 16, 16, "USB Reading...", RED);
- }
-
- /* 写入错误 */
- if (g_usb_state_reg & 0x04)
- {
- lcd_show_string(30, 210, 200, 16, 16, "USB Write Err ", RED);
- }
- else
- {
- lcd_fill(30, 210, 240, 230 + 16, WHITE);
- }
-
- /* 读取错误 */
- if (g_usb_state_reg & 0x08)
- {
- lcd_show_string(30, 230, 200, 16, 16, "USB Read Err", RED);
- }
- else
- {
- lcd_fill(30, 230, 240, 250 + 16, WHITE);
- }
-
- usb_sta = g_usb_state_reg;
- }
-
- /* USB连接状态改变 */
- if (device_sta != g_device_state)
- {
- /* 连接建立 */
- if (g_device_state == 1)
- {
- lcd_show_string(30, 170, 200, 16, 16, "USB Connected ", RED);
- }
- /* 连接断开 */
- else
- {
- lcd_show_string(30, 170, 200, 16, 16, "USB DisConnected ", RED);
- }
-
- device_sta = g_device_state;
- }
- }
- }
复制代码从上面的代码中可以看出,在调用完USB设备驱动库中的相关初始化函数后并不断地获取USB的读写状态和连接状态,并在LCD上进行显示。 在调用完USB相关的初始化函数后,USB设备驱动库便会自动模拟出一个USB读卡器,当然也需要实现配置好USB读卡器模拟出的设备信息,以及读写、初始化SD卡、NOR Flash等的操作,这些操作全部在usbd_storage.c文件中完成了,请读者自行参考该文件。
55.3 下载验证 在完成编译和烧录操作后,将SD卡正确插入开发板板载的SD卡卡座,可以看到LCD上显示了SD卡的容量信息以及USB的连接状态,若开发板还未通过USB接口与PC进行连接,那么LCD上会有USB连接断开的提示,此时可以将开发板通过USB接口与PC进行连接,稍等一会后,可以看到LCD上显示了USB已连接的提示,并且PC上也多出了两个磁盘,磁盘中的文件就是SD卡和NOR Flash中的文件,并且在PC上也可以直接对SD卡和NOR Flash中的文件进行读写操作。 |