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

发布者:科技创造者最新更新时间:2020-10-30 来源: eefocus关键字:STM32  USB  大容量存储器  Mass  Storage 手机看文章 扫描二维码
随时随地手机看文章

程序可以兼容官方推出来的不同系列的评估版,所以程序里经常看见类似于#ifdef STM32L1XX_MD、#ifdef USE_STM3210E_EVAL这样的宏开关语句,甚至随工程附带了两个版本的库文件,这也照成了程序理解和调试的困难。

工程随带了两个库文件: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两个文件了,f smc_nand.c其实就是NAND的驱动程序,NAND挂在STM32的存储体BANK2处,这样就可以直接内存访问NAND了,而nand_if则是在 f smc_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()。


最后M AL_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 USB SD读卡器(SDIO)
下一篇:STM32(MDK)中不能使用printf()函数的问题

推荐阅读最新更新时间:2024-11-12 10:21

stm32点亮LED灯一(库函数版)
学习51单片机的第一个控制IO口的操作就是流水灯,stm32的学习我也是从一个流水灯开始,是stm32是32位机,里面有很多的寄存器,操作stm32单片机也可以使用寄存器操作,使用寄存器操作的好处就是程序的执行速度快,程序的体积小,但是,问题也有很多,比如不方便移植,stm32不同型号的寄存器是有差别的,同时开发的效率低,因为操作寄存器需要频繁地查芯片手册。 权衡了一下,我选用库函数点亮LED。 第一步,建立环境,我选用的单片机是stm32f103c8,下载器是st-link,编译软件是keil5. 首先,我需要配一个库,因为库我只需要GPIO,所以我就只用GPIO库。开始说正事。 建立几个文件夹先(显得比较专业)
[单片机]
<font color='red'>stm32</font>点亮LED灯一(库函数版)
AD转换汇总(STM32、取平均、过采样)
一、电流检测AD采样值处理的高效方法 在电机控制软件的编写过程中,经常要处理由AD采样回来的电流值。由于电流有正有负,电流传感器输出地电压也是以0为中点,而一般AD的输入只能为正电压,所以电流传感器出来的电压量需要通过加减运算电路加上一个偏移值再送入AD,以保证进入AD的值恒为正。 这里AD以TI的2812的片内AD为例,其输入范围是0~3V,电流传感器以LEM的LA25NP为例,量程25A,通常采用的电路是将LEM传感器的输出经过一个100欧的电阻接到地,获得一个以0为中点的电压信号,然后在送入比例运算电路,在比例运算电路的另一个输入端加入1.5V的偏移量,这样在满量程范围内使输入AD的电压信号始终保持在0~3V之内。电
[单片机]
AD转换汇总(<font color='red'>STM32</font>、取平均、过采样)
STM32代码存储位置与MCUISP下载注意事项
最近做一个项目,在stm32内部一部分用来存储自己的代码,开辟出一段空间来用来存储FPGA代码。每次开机实现stm32往FPGA写入代码的功能。 向stm32某段空间写入代码的方法: (1)ST_LINK Utility软件 通过JTAG,连接后。载入FPGA的bin文件,改写Start address就可以将代码写入固定的区域。 当然可以用ST-LINK写入任意代码。 (2)用STMFlashDemo软件。 这个官方的串口下载软件,通过系统存储器进行下载。在之前的日志中提到过,不详说。 利用MCUISP下载的时候,会擦出整个芯片。 所以如果将一部分内容存到FLASH中比如(0x0807000~0x0807100),再
[单片机]
<font color='red'>STM32</font>代码存储位置与MCUISP下载注意事项
STM32 之 LED
自己的USER文件组下有3个c文件,以后会按照这个程序结构写程序。 代码参考于 OPELC思蛻蒙 http://bbs.opelc.org/viewthread.php?tid=6441&extra=page%3D1 (1)Main.c 主函数 (2)Init_External_Device.c 外设初始化函数 (3)includes.h 自己的c文件用的包含头文件 下面是源码: (1)Main C语言: Codee#14359 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 实验平台 : ST
[单片机]
<font color='red'>STM32</font> 之 LED
STM32 IO 口操作
STM32 IO 口操作STM32 的0x2000_0000 到 0x200F_FFFF 单元的SRAM 被定义成 Bit Band Region,共1MB字节,与之相对应的是 0x2200_0000 到 0x23FF_FFFF单元32MB。 (一) 开启时钟 在初始化IO的时候,首先要初始化IO的时钟。 APB1ENR APB2ENR 两个从字面上看都是 Advanced Periphery Bus Enable,不同之处一个是1 ,一个是2。区别在哪里?IO初始化的应该根据需要开启哪个时钟总线? APB1外设时钟使能寄存器(RCC_APB1ENR) 低速APB使能,最大允许频率36MHz APB2外设时钟使能寄存
[单片机]
stm32支持的波特率的问题
原来学习stm32,关于串口波特率这个问题没有怎么关注,一般也就习惯用9600或者115200,今天被问到:stm32支持的最大波特率为多少?我自己也语塞了... 为此我好好看了下相关资料。 首先查看了stm32f10x参考手册.pdf,其中关于USART部分提到了USART的最高传输速度为4.5Mbit/s,图片(图1)如下: 在找到了最大的传输速度后,就要考虑为什么会得到这个速度,于是我查看了stm32f10x固件函数库.pdf,在这个文件中关于USART库函数的讲解中发现了关于波特率计算的公式。如下图(图2)所示: 这个里面提到了两个整数分频器和小数分频器这两个东西,并且波特率的计算就和这两个值
[单片机]
<font color='red'>stm32</font>支持的波特率的问题
STM32 USB固件库结构
STM32 USB固件库结构如下图所示: 可见,STM32 USB固件库分为3层:Low Layer、Medium Layer和High Layer,下面分析下这三层分别的角色: (1)Low Layer usb_regs(.h,.c):实现了硬件抽象层,提供了一个函数集合来操作USB外设寄存器,这个集合包括Commmom resister functions、Endpoint register functions、Buffer description table functions和Double-buffered endpoints functions四个函数集; usb_int(.h,.c):模块处理正确中
[单片机]
STM32 通用底层函数集锦, 自用
#include xustm32.h #include xucommon.h //#define COM_DEBUG #include xudebug.h //-------------------- STM32通用函数集锦 --------------------------------------------------- #if 0 HardFault_Handler PROC ; EXPORT HardFault_Handler ; B . IMPORT hard_fault_handler_c TST LR, #4 ITE EQ
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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