一种基于STM32F7的USBHostHID实验方法与流程

文档序号:16247462发布日期:2018-12-11 23:42阅读:560来源:国知局
一种基于STM32F7的USB Host HID实验方法与流程

本发明属于嵌入式技术领域,具体涉及一种基于stm32f7的usb实验系统及方法。

背景技术

实践教学是嵌入式教学中不可少的环节,嵌入式的教学主要可以分为带linux或者android操作系统的平台的教学以及不带操作系统的裸机嵌入式平台的教学。目前不带操作系统的裸机嵌入式平台的教学中st公司的stm32系列处理器占据大部分市场,使用最为广泛。st系列处理器属于armcortex-m系列处理器。在arm处理器中,目前使用最多的是arm7系列、arm9系列、arm9e系列、arm10e系列、arm11系列以及cortex系列。cortex系列属于armv7架构,而cortex系列处理器又分为a、r、m三个系列,“a”系列面向尖端的基于虚拟内存的操作系统和用户应用;“r”系列针对实时系统;“m”系列对微控制器。

学习嵌入式,合适的开发板,标准的例程,详细的解读是必不可少的。现在市场上有许多做嵌入式开发板教学的公司,而做stm32系列开发板的公司,如野火,正点原子,微雪等等,往往是将st的hal库进行修改之后自成体系,相互之间的兼容性不是很好,只能在自己的开发板上面使用。



技术实现要素:

为了解决上述技术问题,本发明提供了一种基于stm32f7的usb实验系统及方法,能够进行usbfs速率的usbdevice和usbhost两大类实验。

本发明提供了一种基于stm32f7的usb实验系统,其特征在于:基于stm32f7的usbdevicecdc和msc系统包括sd卡、stm32f7处理器、pc;所述sd卡和stm32f7处理器之间通过sdmmc接口连接在一起,所述stm32f7处理器的usbfs接口和pc之间通过usb线连接起来。

本发明还提供了一种基于stm32f7的usb实验系统,其特征在于:基于stm32f7的usbhostmsc实验系统包括u盘、stm32f7处理器、pc;所述u盘和stm32f7处理器之间通过usbfsotg口连接,所述pc和stm32f7处理器之间通过串口进行连接。

本发明还提供了一种基于stm32f7的usb实验系统,其特征在于:基于stm32f7的usbhosthid实验系统包括usb鼠标、usb键盘、stm32f7处理器、pc;所述usb鼠标、usb键盘和stm32f7处理器之间通过usbfsotg口连接,pc和stm32f7处理器之间通过串口进行连接。

本发明提供了一种基于stm32f7的usb实验方法,其特征在于:基于stm32f7的usbdevice实验,包括以下步骤:

步骤1:将sd卡和stm32f7处理器的sdmmc接口连接在一起,将stm32f7处理器的usbfs接口通过usb线和pc的usb接口连接起来;

步骤2:初始化hal库,重启所有外部设备,初始化flash接口,初始化systick;

步骤3:配置并且初始化stm32系统时钟;

步骤4:使能sd卡和usbfs的引脚的时钟;

步骤5:初始化usb;

该步骤包括初始化usb的底层配置,初始化usb设备库,添加支持类(vcp类),并且启动设备库,于是usb就首先就初始化为vcp类设备;

步骤6:重启stm32f7处理器,此时pc设备管理器将stm32f7usb设备识别为虚拟串口设备(比如usb虚拟串口com18);

步骤7:打开pc上的串口终端,配置串口参数(包括波特率、停止位、校验位、com口),打开串口;

发送非关键数据(非0x02数据)给stm32f7处理器,此时stm32f7虚拟串口如果接收到的数据不是关键数据,也不是0x00,就回显给pc;

发送关键数据(0x02数据)给stm32f7处理器,此时stm32f7处理器接收的数据是关键数据;

步骤8:若stm32f7处理器接受到了关键数据数据,初始化sd卡以及usb的引脚端口时钟;

步骤9:初始化sd卡;

步骤10:重新初始化设备库,取消原来的cdc设备库,将usb和cdc类解绑。重新初始化usb,重新初始化usb包括初始化usb的底层配置,初始化usb设备库,添加支持类(msc类),并且启动设备库,于是usb就首先就初始化为msc类设备;

步骤11:pc设备管理器识别出usb大容量存储设备,在pc中读出sd卡盘符,并对其进行读写以及格式化操作,这里注意只能对其格式化为fat文件系统。

本发明还提供了一种基于stm32f7的usb实验方法,其特征在于:基于stm32f7的usbhostmsc实验,包括以下步骤:

步骤1:使能cpucache;

步骤2:初始化hal库,重启所有外部设备,初始化flash接口,初始化systick;

步骤3:配置系统时钟;

步骤4:使能usb及usart3的gpio时钟;

步骤5:初始化串口dma;

步骤6:初始化usart3;

步骤7:初始化led、按键以及usbhostmsc菜单;

步骤8:初始化usb,包括初始化usb主机库,添加支持类(msc类),启动usbhost主机库;

步骤9:执行usbhost不同状态的处理函数,不同的状态包括host_idle、host_dev_wait_for_attachment、host_dev_attached、host_enumeration、host_input、host_set_configuration、host_check_class、host_class_request、host_class、host_dev_disconnected、host_abort_state;

步骤10:执行usbhostmsc菜单处理函数;

首先如果msc_demo.state状态为msc_demo_start,等待用户按键,用户按键后进入msc_demo_file_operations状态,执行msc_file_operations();创建usbhost.txt文件,并向usbhost.txt文件中写入字符串“usbhostlibrary:massstorageexample”并读出显示在串口终端上,并继续等待按键按下,当按键按下后,执行explore_disk("0:/",1);显示u盘的目录文件结构。

本发明还提供了一种基于stm32f7的usb实验方法,其特征在于:基于stm32f7的usbhosthid实验,包括以下步骤:

步骤1:使能cpucache;

步骤2:初始化hal库,重启所有外部设备,初始化flash接口,初始化systick;

步骤3:配置系统时钟;

步骤4:使能usb及usart3的gpio时钟;

步骤5:初始化串口dma;

步骤6:初始化usart3;

步骤7:初始化led、按键以及usbhosthid菜单;

步骤8:初始化usb;

包括初始化usb主机库,添加支持类(hid类),启动usbhost主机库;

步骤9:执行usbhost不同状态的处理函数,不同的状态包括host_idle、host_dev_wait_for_attachment、host_dev_attached、host_enumeration、host_input、host_set_configuration、host_check_class、host_class_request、host_class、host_dev_disconnected、host_abort_state;

步骤10:执行usbhosthid菜单处理函数;

如果连接的是usb鼠标,则通过串口实时显示鼠标的按键情况(左键、右键、中键以及press/release状态)以及坐标情况(x、y坐标以及上次的x、y坐标);如果连接的是usb键盘,则当有按键按下的时候通过串口显示键盘按键字符。

本发明的系统还包括主板,主板接口丰富,主板除了提供模块插口外,还提供各种标准接口,如以太网口、usbhost/slave接口、can总线收发器接口等。并且其设计上能减少维护成本,如果有模块损坏,只需要更换模块即可,无需去修复主板。

本发明的模块资源丰富。一共有16个模块板卡,和四个主板接口可供进行实验,满足各种教学和应用需求。并且核心板能够替换,以适应将来处理器的升级的需要,主板因此主板可以重复使用。

本发明的软件部分是全部在标准的hal库以及相应的中间件的基础上完成的,没有修改hal库,具有良好的可移植性、通用性。本发明所使用的sthal库是1.6版本的,不是目前最新的1.7版本,所以相对来说比较稳定,也相对较新,本发明所使用的集成开发环境为mdk,版本为v5.23,编译器compiler的版本为v5.06相对来说较稳定也较新。

本发明所有usb的实验都配有详细的说明书,从usb的基本概念,到stm32f7的usb的接口,再到st的hal库的介绍,再到st的usb的中间件的介绍,到操作流程,硬件介绍,程序解读,实验现象等都有详细的说明。另外还配有解说视频,手把手的教同学入门stm32f7的开发。

本发明完全依照标准的hal库以及usb中间件库开发出的例程,没有修改过st的hal库,相对来说更具通用性。另外本发明选择了stm32的f7系列处理器,性能更好,更能适应市场需求。usb通信协议本来是一个非常复杂的通信协议,一般的嵌入式开发板的usb实验仅仅是列出了实验该怎么操作,对于学生来说仅仅是验证性实验,并不能学到更多知识,而本发明将理论知识,硬件知识,例程讲解都详细的以文档的形式给出,还能不拘泥于单个实验,能将单个的实验结合起来,富有启发性看,探索性,创新性。

附图说明

图1为本发明实施例的stm32f7usbdevice实验硬件结构框图;

图2为本发明实施例的sd卡sdmmc接口示意图;

图3为本发明实施例的stm32f7usbdevicecdc2msc实验流程图;

图4为本发明实施例的stm32f7usbhostmsc实验硬件连接框图;

图5为本发明实施例的stm32f7usbhosthid鼠标实验硬件连接图;

图6为本发明实施例的stm32f7usbhosthid键盘实验硬件连接图;

图7为本发明实施例的usbhostmscu盘实验流程图;

图8为本发明实施例的usbhosthid鼠标键盘实验流程图。

具体实施方式

为了便于本领域普通技术人员理解和实施本发明,下面结合附图及实施例对本发明作进一步的详细描述,应当理解,此处所描述的实施示例仅用于说明和解释本发明,并不用于限定本发明。

本发明的目的是提供一种更好的基于stm32f7系列处理器的usb实验平台,能够进行usbfs速率的usbdevice和usbhost两大类实验。

结合附图1,基于stm32f7的usbdevicecdc和msc实验系统,硬件主要是由sd卡、stm32f7处理器、pc组成。其中sd卡和stm32f7之间通过sdmmc接口连接在一起,其接口连接见附图2。stm32f7的usbfs接口和pc之间通过usb线连接起来。结合附图3,stm32f7usbdevicecdc2msc实验流程图的特点是在一个实验中将传统的usbdevicemsc实验和usbdevicecdc实验巧妙的结合成了一个实验。程序首先初始化hal库,配置系统时钟,使能sd卡和usbfsgpio时钟,然后先初始化usb为vcp类设备,这个时候pc设备管理器中将stm32f7usb设备识别为虚拟串口设备,此时stm32f7虚拟串口如果接收到的数据不是关键数据(比如这里本实施例设定为0x02),也不是0x00,就回显给pc。如果此时接收的数据是关键数据(比如这里本实施例设定为0x02),则初始化sdmmc接口,重新初始化设备库,取消原来的cdc设备库,将usb和cdc类解绑。再初始化为msc设备库,添加msc类,并启动设备库。这样,本实施例的设备管理器就会识别出本实施例的usb设备是一个大容量存储设备,可以在我的电脑中读出sd卡盘符,并可以对其进行读写。

结合附图4,基于stm32f7的usbhostmsc实验系统,硬件主要是由u盘、stm32f7处理器、pc组成。其中u盘和stm32f7之间通过usbfsotg口连接,pc和stm32f7之间通过串口进行连接。结合附图7,stm32f7usbhostmsc实验流程图的特点是全部采用了串口作为调试和显示手段,避免了因lcd的不同而降低程序的通用性。程序先使能cpucache,初始化hal库,配置系统时钟,使能usb及usart3的gpio时钟,初始化串口dma,初始化usart3,初始化led、按键及usbhostmsc菜单,初始化usb为hostmsc模式,执行usbhost不同状态处理函数,最后执行usbhostmsc菜单处理函数,该usbhostmsc菜单处理函数执行如下应用:首先如果msc_demo.state状态为msc_demo_start,等待用户按键,用户按键后进入msc_demo_file_operations状态,执行msc_file_operations();创建usbhost.txt文件,并向usbhost.txt文件中写入字符串“usbhostlibrary:massstorageexample”并读出显示在串口终端上,并继续等待按键按下,当按键按下后,执行explore_disk("0:/",1);显示u盘的目录文件结构。

结合附图5、6,基于stm32f7的usbhosthid实验系统,硬件主要是由usb鼠标,usb键盘,stm32f7处理器、pc组成。其中usb鼠标、usb键盘和stm32f7之间通过usbfsotg口连接,pc和stm32f7之间通过串口进行连接。结合附图8,stm32f7usbhosthid实验流程图的特点是全部采用了串口作为调试和显示手段,避免了因lcd的不同而降低程序的通用性。程序先使能cpucache,初始化hal库,配置系统时钟,使能usb及usart3的gpio时钟,初始化串口dma,初始化usart3,初始化led、按键及usbhosthid菜单,初始化usb为hosthid模式,执行usbhost不同状态处理函数,最后执行usbhosthid菜单处理函数,如果连接的是usb鼠标,则通过串口实时显示鼠标的按键情况(press/release)以及坐标情况。如果连接的是usb键盘,则当有按键按下的时候通过串口显示键盘按键字符。

下面结合本实施例的软件实现过程进一步阐明本专利的内容:

1.对于usbdevice实验,参考附图1,2,将实验系统硬件连接好,打开例程,本实施例使用的集成开发环境是mdk5,版本为v5.23,编译器compiler的版本为v5.06,使用的hal库版本是v1.6,相对来说较稳定也较新。由于本实施例使用的大容量存储设备是sd卡,就需要先将sd卡的操作函数补充完整,这些函数在usbd_storage_if.c文件中:

-staticint8_tstorage_init_fs(uint8_tlun);

-staticint8_tstorage_getcapacity_fs(uint8_tlun,

-uint32_t*block_num,

-uint16_t*block_size);

-staticint8_tstorage_isready_fs(uint8_tlun);

-staticint8_tstorage_iswriteprotected_fs(uint8_tlun);

-staticint8_tstorage_read_fs(uint8_tlun,

-uint8_t*buf,

-uint32_tblk_addr,

-uint16_tblk_len);

-staticint8_tstorage_write_fs(uint8_tlun,

-uint8_t*buf,

-uint32_tblk_addr,

-uint16_tblk_len);

-staticint8_tstorage_getmaxlun_fs(void);

另外,由于两个例程中有许多有着相同的宏名或者函数名但是有着不同的定义或实现的宏名和函数,本实施例在合并例程的时候需要更改这些宏名和函数名以区分他们,例如:

-#definevcp_usbd_vid1155

-#definevcp_usbd_langid_string1033

-#definevcp_usbd_manufacturer_string"stmicroelectronics"

-#definevcp_usbd_pid_fs22336

-#definevcp_usbd_product_string_fs"stm32virtualcomport"

-#definevcp_usbd_serialnumber_string_fs"00000000001a"

-#definevcp_usbd_configuration_string_fs"cdcconfig"

-#definevcp_usbd_interface_string_fs"cdcinterface"

-

-

-#definemsc_usbd_vid1155

-#definemsc_usbd_langid_string1033

-#definemsc_usbd_manufacturer_string"stmicroelectronics"

-#definemsc_usbd_pid_fs22314

-#definemsc_usbd_product_string_fs"stm32massstorage"

-#definemsc_usbd_serialnumber_string_fs"00000000001a"

-#definemsc_usbd_configuration_string_fs"mscconfig"

-#definemsc_usbd_interface_string_fs"mscinterface"

以上通过将原宏名前面加上msc或vcp来区分不同的宏。

-uint8_t*vcp_usbd_fs_devicedescriptor(usbd_speedtypedefspeed,uint16_t*length);

-uint8_t*vcp_usbd_fs_langidstrdescriptor(usbd_speedtypedefspeed,uint16_t*length);

-uint8_t*vcp_usbd_fs_manufacturerstrdescriptor(usbd_speedtypedefspeed,uint16_t*length);

-uint8_t*vcp_usbd_fs_productstrdescriptor(usbd_speedtypedefspeed,uint16_t*length);

-uint8_t*vcp_usbd_fs_serialstrdescriptor(usbd_speedtypedefspeed,uint16_t*length);

-uint8_t*vcp_usbd_fs_configstrdescriptor(usbd_speedtypedefspeed,uint16_t*length);

-uint8_t*vcp_usbd_fs_interfacestrdescriptor(usbd_speedtypedefspeed,uint16_t*length);

-

-

-uint8_t*msc_usbd_fs_devicedescriptor(usbd_speedtypedefspeed,uint16_t*length);

-uint8_t*msc_usbd_fs_langidstrdescriptor(usbd_speedtypedefspeed,uint16_t*length);

-uint8_t*msc_usbd_fs_manufacturerstrdescriptor(usbd_speedtypedefspeed,uint16_t*length);

-uint8_t*msc_usbd_fs_productstrdescriptor(usbd_speedtypedefspeed,uint16_t*length);

-uint8_t*msc_usbd_fs_serialstrdescriptor(usbd_speedtypedefspeed,uint16_t*length);

-uint8_t*msc_usbd_fs_configstrdescriptor(usbd_speedtypedefspeed,uint16_t*length);

-uint8_t*msc_usbd_fs_interfacestrdescriptor(usbd_speedtypedefspeed,uint16_t*length);

以上是通过将原函数名前面加上msc或vcp来区分不同的函数。

在主函数中:

-先定义了接收数组uint8_tbuf[1]={0xff};长度为uint32_tlen[1]={1};只能一次接收1byte的数据。

-hal_init();初始化所有外设,flash接口和systick。

-systemclock_config();初始化系统时钟,和msc实验中的配置一样。

-mx_gpio_init();开启gpioa、gpioc、gpiod的时钟,和msc实验一样。

-vcp_mx_usb_device_init();首先将usb初始化为vcp类设备,初始化cdc设备库,添加cdc类,启动库。

-接下来进入主循环:

-这个时候pc设备管理器中将stm32f7usb设备识别为虚拟串口设备,此时stm32f7虚拟串口如果接收到的数据不是特殊值(比如这里本实施例设定为0x02),也不是0x00,就回显给pc。

-如果此时接收的数据是0x02,则执行mx_sdmmc1_sd_init();初始化sdmmc接口,执行usbd_deinit(&husbdevicefs);重新初始化设备库,取消原来的cdc设备库,将usb和cdc类解绑。再初始化为msc设备库,添加msc类,并启动设备库。这样,本实施例的设备管理器就会识别出本实施例的usb设备是一个大容量存储设备。

2.对于usbhostmsc实验,参考附图4,将实验系统硬件连接好,打开例程,参考附图7,程序流程如下:

-首先使能cpu数据指令cache。

-接下来hal_init();初始化所有外设,flash接口和systick。

-然后systemclock_config();配置系统时钟:

*systemclocksource=pll(hse)

*sysclk(hz)=216000000

*hclk(hz)=216000000

*ahbprescaler=1

*apb1prescaler=4

*apb2prescaler=2

*hsefrequency(hz)=8000000

*pll_m=8

*pll_n=432

*pll_p=2

*pll_q=9

*vdd(v)=3.3

*mainregulatoroutputvoltage=scale1mode

*flashlatency(ws)=7

-这里本实施例选择hse作为pll的源,hse的源为8mhz,本实施例设计的分频和倍频参数如下pllm=8;plln=432;pllp=2;pllq=9;选择pllclk作为sysclk的源,选pllq为usb的源,ahbprescaler=1;apb1prescaler=4;apb2prescaler=2。

sysclk=pllclk=hse/pllm*plln/pllp=8m/8*432/2=216mhz。

usbclock=pllq=hse/pllm*plln/pllq=8m/8*432/9=48m。

apb1peripheralclock=sysclk/ahbprescaler/apb1prescaler=216m/1/4=54mhz;

apb2peripheralclock=sysclk/ahbprescaler/apb2prescaler=216m/1/4=108mhz;

本实施例需要usb的时钟为48mhz这样配置之后,usb的时钟就为48mhz了。

这里usart3的时钟源为pclk1为54mhz;

-mx_gpio_init();使能gpioportd口的时钟,因为usart3使用的就是pd8和pd9,pd8为usart3tx,pd9为usart3rx。

-mx_dma_init();使能串口dma传输。

-mx_usart3_uart_init();初始化usart3,波特率9600。

-初始化led、按键以及菜单。

-初始化usb主机库,添加msc类,启动主机库。

-接下来进入主循环;

-usbh_process(&husbhost);函数处理usb主机的不同状态。

这里有usb的所有状态:

1.host_idle

2.host_dev_wait_for_attachment、

3.host_dev_attached

4.host_enumeration

5.host_input

6.host_set_configuration

7.host_check_class

8.host_class_request

9.host_class

10.host_dev_disconnected

11.host_abort_state

每种状态有不同的处理。

-msc_menuprocess();函数是菜单处理流程。首先如果msc_demo.state状态为msc_demo_start,等待用户按键,用户按键后进入msc_demo_file_operations状态,执行msc_file_operations();创建usbhost.txt文件,并向usbhost.txt文件中写入字符串“usbhostlibrary:massstorageexample”并读出显示在串口终端上,并继续等待按键按下,当按键按下后,执行explore_disk("0:/",1);显示u盘的目录文件结构。

-这里所有的lcd_errlog(...);lcd_usrlog(...);lcd_dbglog(...)全部输出到串口在主函数重新定义printf输出到串口:

实验现象:下载程序,打开串口终端,打开串口,插入u盘,串口助手显示了u盘的大小,按下了用户按键后,将u盘中创建一个文件usbhost.txt,并向文件中写入字符串“usbhostlibrary:massstorageexample”并读出来。再次按下按键后,显示了u盘里的文件目录及文件。打开电脑,查看u盘里的文件,和串口助手显示的目录及文件结构一样。打开usbhost.txt文件,里面有写入的字符串“usbhostlibrary:massstorageexample”:

3.对于usbhosthid实验,参考附图5或6,将实验系统硬件连接好,打开例程,参考附图8,程序流程如下:

-首先使能cpu数据指令cache。

-接下来hal_init();初始化所有外设,flash接口和systick。

-然后systemclock_config();配置系统时钟:

-mx_gpio_init();使能gpioportd口的时钟,因为usart3使用的就是pd8和pd9,pd8为usart3tx,pd9为usart3rx。

-mx_dma_init();使能串口dma传输。

-mx_usart3_uart_init();初始化usart3,波特率9600。

-接下来hid_initapplication();用来初始化hid应用:初始化led,用户按键,并启动hid接口,初始化hidmenu。

-接下来三个函数是usb的初始化,初始化usbhost库,添加支持类(hid类),启动host库。

-然后程序进入主循环。

-usbh_process(&husbhost);函数处理usbhost不同的状态,同2。

-host在不同的状态下会有不同的处理。

-hid_menuprocess();函数用来管理usbhosthid菜单。

-hid_demo.state为hid_demo_mouse时处理鼠标相应例程:

hid_mousemenuprocess();

usbh_mousedemo(&husbhost);

-hid_demo.state为hid_demo_keyboard时处理键盘相应例程:

hid_keyboardmenuprocess();

usbh_keybddemo(&husbhost);

实验现象:编译程序,下载,打开串口助手,打开串口,首先将usbfsotg口接上一个usbotg转换头,在接上usb鼠标,resetstm32,单击鼠标左键,显示左键按下,左键松开;单击鼠标右键,显示右键按下,右键松开;单击鼠标中键,显示中键按下,中键松开;移动鼠标,显示上次鼠标的坐标prev_x_y,以及现在的鼠标的坐标loc_x_y。拔出鼠标,插入键盘,并键入键盘上的任意键,串口助手上将显示出相应的字符。

本实施例的系统主要包括主板、最小核心模块和各种外设模块;主板接口丰富,设计上能减少维护成本;核心模块能够替换,以适应将来处理器的升级;外设模块资源丰富,几乎涵盖了所有常用的教学外设。本发明的软件部分是标准的hal库以及相应的中间件的基础上完成的。具有良好的可移植性、通用性。并且,usb例程有所创新,将usbdevice实验中的msc例程和usbdevice实验中的vcp例程有机结合为一个例程,增加了例程的难度和学生的探索兴趣。另外,本实验的例程具有良好的可移植性,在usbhost的实验中,不同于其他厂家的例程,不用lcd作为最终的显示和调试手段,采用了更为通用的串口作为调试显示方式,能不局限于特定的lcd显示屏。

应当理解的是,本说明书未详细阐述的部分均属于现有技术。

应当理解的是,上述针对较佳实施例的描述较为详细,并不能因此而认为是对本发明专利保护范围的限制,本领域的普通技术人员在本发明的启示下,在不脱离本发明权利要求所保护的范围情况下,还可以做出替换或变形,均落入本发明的保护范围之内,本发明的请求保护范围应以所附权利要求为准。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1