STM32 USB 大容量存储器Mass Storage工程的讲解

发布者:心若清泉最新更新时间:2016-12-20 来源: eefocus关键字:STM32  USB  大容量存储器  Mass  Storage工程 手机看文章 扫描二维码
随时随地手机看文章

哎,要说到USB的大容量存储设备就没有向USB鼠标一样简单了。这里先从官方例程里的mass stroage工程讲起。官方的工程比较复杂,程序可以兼容官方推出来的不同系列的评估版,所以程序里经常看见类似于#ifdef STM32L1XX_MD、#ifdef USE_STM3210E_EVAL这样的宏开关语句,甚至随工程附带了两个版本的库文件,这也照成了程序理解和调试的困难。总之,理解起来比较费劲。看截图:

STM32 USB 大容量存储器Mass Storage工程的讲解 - ziye334 - ziye334的博客

看到没有,工程随带了两个库文件:STM32F10x_StdPeriph_Driver和STM32F1xx_StdPeriph_Driver。我们当然只能选一个了,比如手我们选择STM32F1xx_StdPeriph_Driver,只要点击该组,右键->option for Group....,钩上iinclude in Target 和always build,就可以,另一个库文件组,钩掉这两个选项就可以了。这里还有一个STM32_EVAL组,这个下的文件跟评估板有关,不详细讲了,之后会涉及到一点。

接下去要详细讲解下User这个组了,有些文件我们已经在前文中都有讲到,这里讲些之前没有出现过的。不循规蹈矩讲了,想到什么就写什么了。usb_bot.c是新出现的文件,这个文件只要是BOT的状态机,所谓的BOT其实就是仅限批量传输的意思,我们这里用到的是端点的仅批量传输的。这个文件对不同USB状态的做不同的操作。usb_scsi.c这也是新出现的文件,这个文件名字上虽然是SCSI,但其实里面定义的是一些UFI的命令,不知道为什么这样做。scsi_data.c里则保存着UFI的命令集,问我里面定义的数组什么意思,我也没有全部理解清楚。接下去就是memory.c了,这是内存管理层,只有Read_Memory和Write_Memory连个函数。mass_mal.c这个文件是,文绉绉的讲是媒体接入层,平实的将就是连接底下硬件比如说SD卡或NAND Flash的相关驱动的API接口了。这里的文件实现的功能有底下设备或媒体的初始化,读媒体、写媒体、获取设备或媒体的状态等,在memory.c中被调用。还有剩下的就是fsmc_nand.c和nand_if两个文件了,fsmc_nand.c其实就是NAND的驱动程序,NAND挂在STM32的存储体BANK2处,这样就可以直接内存访问NAND了,而nand_if则是在fsmc_nand.c上面封装了下。还有下面的STM32_EVAL组里的stm32_eval_sdio_sd.c和stm32_eval_spi_sd.c这两文件是SD卡的SDIO和SPI接口的驱动程序,跟smc_nand.c和nand_if类似。

接下去讲讲他们之间的关系:

要说起来最顶层的话应该是stm32f10x_it或则stm32f1xx_it.h里的中断服务程序USB_LP_CAN1_RX0_IRQHandler,当有数据通讯时,就会触发中断,该中断服务程序会调用usb_istr.c文件里的USB_Istr()函数,该函数又会调用usb_it.c的CTR_LP()正确传输处理函数,之后该函数就会根据是哪个端点而调用相应端点的回调函数。端点的回调函数在usb_endp.c里,官方的工程用到了端点1用来发送数据,端点2用来接收数据。这两个函数分别是EP1_IN_Callback()和EP2_OUT_Callback(),他们有分别调用usb_bot.c里的Mass_Storage_In()和Mass_Storage_Out()函数。这两个函数会根据数据通讯的内容,判断应该调用usb_scsi.c里的哪个SCSI命令集。当然usb_scsi.c里的指令又会用到读取或写入内存的函数Read_Memory()和Write_Memory()。这两个函数在memory.c中定义,并且会调用媒体接入层的mass_mal.c文件的里MAL_Read()和MAL_Write()。最后MAL_Read()和MAL_Write()这两个函数会调用设备或媒体的相关函数了,如果你是NAND,则会调用nand_if.c,进而再调用fsmc_nand.c;如果你使用SPI读写SD卡,则调用stm32_eval_spi_sd.c,如果你使用SDIO读写SD卡,则调用stm32_eval_sdio_sd.c。总之,他们之间有着层次关系,了解他,们的关系后,希望对阅读有所帮助。


关键字:STM32  USB  大容量存储器  Mass  Storage工程 引用地址:STM32 USB 大容量存储器Mass Storage工程的讲解

上一篇:STM32 keyboard USB键盘功能的实现
下一篇:STM32 USB NAND FLASH 模拟U盘

推荐阅读最新更新时间:2024-03-16 15:26

C语言面向对象编程的最佳实
一、前言 以STM32为例,打开网络上下载的例程或者是购买开发板自带的例程,都会发现应用层中会有stm32f10x.h或者stm32f10x_gpio.h,这些文件严格来时属于硬件层的,如果软件层出现这些文件会显得很乱。 使用过Linux的童鞋们肯定知道linux系统无法直接操作硬件层,打开linux或者rt_thread代码会发现代码中都会有device的源文件,没错,这就是驱动层。 二、实现原理 原理就是将硬件操作的接口全都放到驱动链表上,在驱动层实现device的open、read、write等操作。当然这样做也有弊端,就是驱动find的时候需要遍历一遍驱动链表,这样会增加代码运行时间。 三、代码实现
[单片机]
玩转STM32(15)确定栈的位置和大小
前面学习了怎么样确定CPU加载运行第一行代码,在那里发现需要加载栈指针,那么你也许会问为什么要首先加载栈指针呢?难道栈就是这么重要?在这里,我们就来探讨一下栈的问题,比如栈的位置和大小。 在现代的CPU技术里,往往有中断系统,这就决定了CPU必须有栈的结构,因为中断出现时,需要把当时CPU运行的数据进行保存,以便中断处理之后再恢复回来。如下图这样处理: 如果没有栈,就没有办法保存当前的数据,必然被中断程序里运行的代码把当前的数据修改了,这样就没有办法恢复到原始状态了。从上图可以看到中断调用时,有中断栈,因此在CPU运行之后,时刻有可能被中断,这样需要栈来保存相应的数据。另外,我们来看一下C语言的运行,当一个函数被调用时,它
[单片机]
玩转<font color='red'>STM32</font>(15)确定栈的位置和大小
STM32用IO口控制步进电机的简单程序
练习IO口库函数操作。 //相序 uint16_t phasecw ={0x2000,0x0001,0x0004,0x0008};// D-C-B-A uint16_t phaseccw ={0x0008,0x0004,0x0001,0x2000};// A-B-C-D //步进电机相关IO口初始化 // IN4: PC13 // IN3: PC0 // IN2: PC2 // IN1: PC3 void Moto_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockC
[单片机]
ST助力构建赛-课-证一体化嵌入式应用人才培养生态圈
——获奖作品回顾及2023年嵌入式大赛学习资源分享 近日,第六届(2023)全国大学生嵌入式芯片与系统设计竞赛应用赛道启动报名,大赛连续3年入选全国普通高校大学生竞赛目录 。大赛自2014创办以来,意法半导体(ST)一直作为主要的协办厂商参与其中,STM32产品及开发板作为大赛使用率最高的开发平台,也受到来自国内外高校电子电气类相关专业同学及高职高专学校学生的广泛推崇。我们意识到,与下一代创新者合作的重要意义,并力争为他们释放全部创新力提供所需工具、专业知识和解决方案。ST还与上百所高等院校合作开发精品课程、师资培训,建立联合实验室,实施嵌入式人才培养计划,甚至举办教育联盟会议及校内比赛,以增加我们与师生的沟通交流,这一切都
[嵌入式]
ST助力构建赛-课-证一体化嵌入式应用人才培养生态圈
STM32开发笔记77: 内部看门狗长延时的产生
单片机型号:STM32L053R8T6 开发笔记STM32开发笔记45:看门狗驱动程序的移植介绍了看门狗驱动程序的基本设计方法。今天项目中看门狗的延时时间达到10秒,则实际运行效果只有3秒。 以下是看门狗最大延时时间的设置函数: void CIwdg::SetMaxRefreshInterval(uint8_t u8_second) { this- hIwdg.Instance = IWDG; this- hIwdg.Init.Prescaler = IWDG_PRESCALER_64; this- hIwdg.Init.Window = 4095; #if defined STM32F091xC || defi
[单片机]
STM32的Cortex-M3中断异常处理
前段时间用STM32F103VBT6写了一个中断的函数,借此机会想了解下STM32的中断机制,用过之后发现STM32的中断配置相当灵活,稳定行很高,测试发现几乎没出过什么差错。我在程序里开了三个中断,一个计数器用于精确延时用,另外两个为外部事件处理中断,下面一一详细介绍,方便初学者入门。 在进行STM32中断配置之前首先需要了解下它的中断部分: 一、Cortex-M3中断机制 在STM32处理器中有43个可屏蔽中断通道(不包含 16个 Cortex?-M3的中断线)。共设置了16个可编程的优先等级(使用了 4位中断优先级);它的嵌套向量中断控制器(NVIC)和处理器核的接口紧密相连,可以实现低延迟的中断处理和有效处理地处理
[单片机]
<font color='red'>STM32</font>的Cortex-M3中断异常处理
STM32 16位IO口操作的一些教训
最近在用TFT屏的时候走啦不少弯路,因为TFT屏都是16位的,所以大部分的都是采用一组IO口对应16个数据位刚好并口传输数据,最近因为IO口紧缺,所以想要改成串口,但是发现串口刷新屏幕太慢所以最后改成8位的并口,但是STM32操作IO口的寄存器是16位的。也就是说用并口的话一起传输数据进去虽然只用8位但是操作还是16位一起操作,虽然有8位没用到但是还是在传输数据进去的时候被一起操作,会把不用的8位的值一起覆盖。 #define DATAOUT(x) GPIOB- ODR=x; //数据输出 如上当调用宏的时候整个B端口一起被操作。 方法1: ODR配置法,可以直接使用 GPIO- ODR = value N;给对应的IO口
[单片机]
Allion采用泰克HDMI 1.4a和USB 3.0解决方案
泰克公司日前宣布,Allion日本公司已采用泰克测试测量解决方案,为HDMI® 1.4a (高清多媒体接口)和SuperSpeed USB (USB 3.0)提供支持。Allion是首批可以在一个测试实验室中同时支持HDMI 1.4a和USB 3.0认证测试的公司之一,能够为这些关键消费电子技术提供高度可靠的一致性测试服务。 HDMI标准被领先的消费电子公司采用、以提供高保真数字AV设备连接能力。2009年6月推出以来,HDMI1.4a提供了更多的增强功能,包括新的以太网和音频回授通道(HEAC)、汽车和移动连接、HDMI承载的3D支持等。随着这些增强功能的提供,工程师需要执行额外的一致性和验证测试要求,以保证基于新
[测试测量]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved