OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 546|回复: 0

《M144Z-M3最小系统板使用指南——STM32F103版》第五十五章 USB读卡器(Slave)实验

[复制链接]

1117

主题

1128

帖子

2

精华

超级版主

Rank: 8Rank: 8

积分
4667
金钱
4667
注册时间
2019-5-8
在线时间
1224 小时
发表于 2024-5-28 16:59:55 | 显示全部楼层 |阅读模式
本帖最后由 正点原子运营 于 2024-5-27 11:03 编辑

第五十五章 USB读卡器(Slave)实验
1)实验平台:正点原子 M144Z-M3 STM32F103最小系统板

2) 章节摘自【正点原子】M144Z-M3最小系统板使用指南——STM32F103版


4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boar ... _mini_sysboard.html

5)正点原子官方B站:https://space.bilibili.com/394620890

6)正点原子STM32技术交流QQ群:725095144

155537c2odj87vz1z9vj6l.jpg

155537nfqovl2gg9faaol9.png

本章将介绍使用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的连接原理图,如下图所示:                                 
4.png
图55.1.3.1 USB接口与MCU的连接原理图

55.2 程序设计
55.2.1 ST的USB设备驱动库
ST针对STM32F1的USB设备驱动库为STM32_USB_Device_Library,该USB设备驱动库由ST提供对STM32CubeF1软件包一起提供,如下图所示:
5.png
图55.2.1.1STM32_USB_Device_library
从上图中也可以看出,STM32CubeF1软件包提供了USB主机和设备的驱动库,本书主要介绍USB设备的应用,因此主要关注STM32_USB_Device_Library。
本书不展开讲解USB的相关原理,若读者想更加深入地了解USB,请自行查阅相关资料。

55.2.2 实验应用代码
本章实验的应用代码,如下所示:
  1. int main(void)
  2. {
  3.     /* 仅保留关键代码,其余代码省略 */
  4.    
  5.     /*初始化USB */
  6.    USBD_Init(&USBD_Device, &MSC_Desc, 0);
  7.     /* 添加类 */
  8.    USBD_RegisterClass(&USBD_Device, USBD_MSC_CLASS);
  9.     /* 为MSC类添加回调函数 */
  10.    USBD_MSC_RegisterStorage(&USBD_Device, &USBD_DISK_fops);
  11.     /* 开启USB */
  12.    USBD_Start(&USBD_Device);
  13.    
  14.     while (1)
  15.     {
  16.          t++;
  17.          
  18.          /* USB状态改变 */
  19.          if (usb_sta != g_usb_state_reg)
  20.          {
  21.              lcd_fill(30, 190, 240, 190 + 16, WHITE);
  22.             
  23.              /* 正在写入 */
  24.              if (g_usb_state_reg & 0x01)
  25.              {
  26.                  LED1(0);
  27.                  lcd_show_string(30, 190, 200, 16, 16, "USB Writing...", RED);
  28.              }
  29.             
  30.              /* 正在读取 */
  31.              if (g_usb_state_reg & 0x02)
  32.              {
  33.                  LED1(0);
  34.                  lcd_show_string(30, 190, 200, 16, 16, "USB Reading...", RED);
  35.              }
  36.             
  37.              /* 写入错误 */
  38.              if (g_usb_state_reg & 0x04)
  39.              {
  40.                  lcd_show_string(30, 210, 200, 16, 16, "USB Write Err ", RED);
  41.              }
  42.              else
  43.              {
  44.                  lcd_fill(30, 210, 240, 230 + 16, WHITE);
  45.              }
  46.             
  47.              /* 读取错误 */
  48.              if (g_usb_state_reg & 0x08)
  49.              {
  50.                  lcd_show_string(30, 230, 200, 16, 16, "USB Read  Err", RED);
  51.              }
  52.              else
  53.              {
  54.                  lcd_fill(30, 230, 240, 250 + 16, WHITE);
  55.              }
  56.             
  57.              usb_sta = g_usb_state_reg;  
  58.          }
  59.          
  60.          /* USB连接状态改变 */
  61.          if (device_sta != g_device_state)
  62.          {
  63.              /* 连接建立 */
  64.              if (g_device_state == 1)
  65.              {
  66.                  lcd_show_string(30, 170, 200, 16, 16, "USB Connected   ", RED);
  67.              }
  68.              /* 连接断开 */
  69.              else
  70.              {
  71.                  lcd_show_string(30, 170, 200, 16, 16, "USB DisConnected ", RED);
  72.              }
  73.             
  74.              device_sta = g_device_state;
  75.          }
  76.     }
  77. }
复制代码
从上面的代码中可以看出,在调用完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中的文件进行读写操作。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 18:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表