1)实验平台:正点原子APM32F407最小系统板
2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420
3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html##
本章将介绍使用APM32F407作为USB从设备,模拟出USB读卡器,使得PC与APM32F407通过USB连接后,能够访问与APM32F407连接的SD中的数据。通过本章的学习,读者将学习到APM32F407作为USB从设备模拟出USB读卡器的使用。
本章分为如下几个小节:
61.1 硬件设计
61.2 程序设计
61.3 下载验证
61.1 硬件设计
61.1.1 例程功能
图61.1.3.1 USB OTG接口与MCU的连接原理图
61.2 程序设计
61.2.1 Geehy的OTG驱动库
Geehy针对APM32F4的OTG驱动库为APM32F4xx_OTG_Driver,该OTG驱动库由Geehy提供,下载链接为https://www.geehy.com/apm32?id=47,也可以在A盘8,APM32参考资料中找到。
APM32F4xx_OTG_Driver的根目录下包含了三个文件夹,如下表所示:
文件夹 描述
Hardware 示例工程中与硬件相关的驱动包
Library OTG驱动库本体
Project 示例工程
表61.2.1.1 APM32F4xx_OTG_Driver根目录文件夹描述
可见最最重要的是Library文件夹,该文件夹的文件结构,如下图所示:
图61.2.1.1 Library文件夹结构
从上图中可以看出,Geehy的OTG驱动针对USB的主模式和从模式都提供了驱动,本书主要介绍USB从模式的应用,因此主要关注“Core_Device”和“Driver”文件夹。
“Driver”文件夹中就是USB的基本驱动文件,是无论作何应用都需要使用到的驱动文件。
“Core_Device”文件夹中有包含了“Application”和“Protocol”两个文件夹,其中“Protocol”文件夹中是与USB协议有关的驱动,而“Application”文件夹中是与具体应用有关的驱动文件,例如本章要实现的USB读卡器就需要用到“MSC”文件夹中的驱动文件,后续的USB虚拟串口实验就需要使用到“VCP”文件夹中的驱动文件,而“HID”文件夹中包含的驱动是与人体学接口设备相关应用中需要使用的驱动文件,例如鼠标、键盘等。
Geehy的OTG驱动就介绍这么多,若读者想更加深入地了解USB的驱动,需要先具备一定的USB相关知识。
61.2.2 实验应用代码
本章实验的应用代码,如下所示:
int main(void)
{
/* 仅保留关键代码,其余代码省略 */
/* MSC初始化 */
USBD_MSC_Init();
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;
}
}
}
从上面的代码中可以看出,在调用完OTG驱动库中的MSC初始化函数USBD_MSC_Init()后并不断地获取USB的读写状态和连接状态,并在LCD上进行显示。
在调用完函数USBD_MSC_Init()后,OTG驱动库便会自动模拟出一个USB读卡器,当然也需要实现配置好USB读卡器模拟出的设备信息,以及读写、初始化SD卡等的操作,这些操作全部在usbd_storage_disk.c文件中完成了,请读者自行参考该文件。
61.3 下载验证
在完成编译和烧录操作后,将SD卡正确插入开发板板载的SD卡卡座,可以看到LCD上显示了SD卡的容量信息以及USB的连接状态,若开发板还未通过USB OTG接口与PC进行连接,那么LCD上会有USB连接断开的提示,此时可以将开发板通过USB OTG接口与PC进行连接,稍等一会后,可以看到LCD上显示了USB已连接的提示,并且PC上也多出了一个磁盘,磁盘中的文件就是SD卡中的文件,并且在PC上也可以直接对SD卡中的文件进行读写操作。