STM32CubeMX学习笔记(47)——USB接口使用(MSC基于内部Flash模拟U盘)

这篇具有很好参考价值的文章主要介绍了STM32CubeMX学习笔记(47)——USB接口使用(MSC基于内部Flash模拟U盘)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、USB简介

USB(Universal Serial BUS)通用串行总线,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯。是应用在 PC 领域的接口技术。USB 接口支持设备的即插即用和热插拔功能。USB 是在 1994 年底由英特尔、康柏、IBM、Microsoft 等多家公司联合提出的。

USB 发展到现在已经有 USB1.0/1.1/2.0/3.0 等多个版本。目前用的最多的就是 USB1.1 和 USB2.0,USB3.0 目前已经开始普及。STM32F103 自带的 USB 符合 USB2.0 规范,不过 STM32F103 的 USB 都只能用来做设备,而不能用作主机。

标准 USB 共四根线组成,除 VCC/GND 外,另外为 D+,D-; 这两根数据线采用的是差分电压的方式进行数据传输的。在 USB 主机上,D-和 D+都是接了 15K 的电阻到低的,所以在没有设备接入的时候,D+、D-均是低电平。而在 USB 设备中,如果是高速设备,则会在 D+上接一个 1.5K 的电阻到 VCC,而如果是低速设备,则会在 D-上接一个 1.5K 的电阻到 VCC。这样当设备接入主机的时候,主机就可以判断是否有设备接入,并能判断设备是高速设备还是低速设备。

STM32F103 的 MCU 自带 USB 从控制器,符合 USB 规范的通信连接;PC 主机和微控制器之间的数据传输是通过共享一专用的数据缓冲区来完成的,该数据缓冲区能被 USB 外设直接访问。这块专用数据缓冲区的大小由所使用的端点数目和每个端点最大的数据分组大小所决定,每个端点最大可使用 512 字节缓冲区(专用的 512 字节,和 CAN 共用),最多可用于 16 个单向或 8 个双向端点。USB 模块同 PC 主机通信,根据 USB 规范实现令牌分组的检测,数据发送/接收的处理,和握手分组的处理。整个传输的格式由硬件完成,其中包括 CRC 的生成和校验。

1.1 USB MSC简介

USB大容量存储设备类(The USB mass storage device class)是一种计算机和移动设备之间的传输协议,它允许一个通用串行总线(USB)设备来访问主机的计算设备,使两者之间进行文件传输。通过这个标准的计算机连接到的设备包括:移动硬盘、移动光驱、U盘、SD、TF等储存卡读卡器、数码相机、各种数字音频播放器和便携式媒体播放器、智能卡阅读器、掌上电脑和手机。
MSC的通用性和操作简单使他成为移动设备上最常见的文件系统,USB MSC并不需要任何特定的文件系统, 相反,它提供了一个简单的界面来读写接口用于访问任何硬盘驱动器。操作系统可以把MSC像本地硬盘一样格式化,并可以与他们喜欢的任何文件系统格式它,当然也可以创建多个分区。

二、新建工程

1. 打开 STM32CubeMX 软件,点击“新建工程”
usb msc,STM32CubeMX,stm32,STM32CubeMX,USB,MSC,U盘

2. 选择 MCU 和封装
usb msc,STM32CubeMX,stm32,STM32CubeMX,USB,MSC,U盘

3. 配置时钟
RCC 设置,选择 HSE(外部高速时钟) 为 Crystal/Ceramic Resonator(晶振/陶瓷谐振器)
usb msc,STM32CubeMX,stm32,STM32CubeMX,USB,MSC,U盘
选择 Clock Configuration,配置系统时钟 SYSCLK 为 72MHz
修改 HCLK 的值为 72 后,输入回车,软件会自动修改所有配置
usb msc,STM32CubeMX,stm32,STM32CubeMX,USB,MSC,U盘

4. 配置调试模式
非常重要的一步,否则会造成第一次烧录程序后续无法识别调试器
SYS 设置,选择 Debug 为 Serial Wire
usb msc,STM32CubeMX,stm32,STM32CubeMX,USB,MSC,U盘

三、USB

3.1 参数配置

Connectivity 中选择 USB 设置,并勾选 Device(FS) 激活 USB 设备。
usb msc,STM32CubeMX,stm32,STM32CubeMX,USB,MSC,U盘

Parameter Settings 进行具体参数配置。
usb msc,STM32CubeMX,stm32,STM32CubeMX,USB,MSC,U盘

  • Speed: Full Speed 12MBit/s(固定为全速)
  • Low Power: 默认 Disabled(在任何不需要使用usb模块的时候,通过写控制寄存器总可以使usb模块置于低功耗模式(low power mode ,suspend模式)。在这种模式下,不产生任何静态电流消耗,同时usb时钟也会减慢或停止。通过对usb线上数据传输的检测,可以在低功耗模式下唤醒usb模块。也可以将一特定的中断输入源直接连接到唤醒引脚上,以使系统能立即恢复正常的时钟系统,并支持直接启动或停止时钟系统。)

3.2 引脚配置

USB 的 DP 引脚必须上拉 1.5K 欧的电阻,电脑才能检测到 USB,否则检测不到。
usb msc,STM32CubeMX,stm32,STM32CubeMX,USB,MSC,U盘
查看野火指南者开发板原理图可知,需要将 PD6 配置为低电平使能 USB。
usb msc,STM32CubeMX,stm32,STM32CubeMX,USB,MSC,U盘
在右边图中找到 PD6 引脚,选择 GPIO_Output
usb msc,STM32CubeMX,stm32,STM32CubeMX,USB,MSC,U盘
GPIO output level 中选择 Low 输出低电平。
usb msc,STM32CubeMX,stm32,STM32CubeMX,USB,MSC,U盘

3.3 配置时钟

选择 Clock Configuration,USB 时钟配置为 48MHz,且来源最好是外部晶振分频得到。
usb msc,STM32CubeMX,stm32,STM32CubeMX,USB,MSC,U盘

3.4 USB Device

USB有主机(Host)和设备(Device)之分。一般电脑的USB接口为主机接口,而键盘、鼠标、U盘等则为设备。

部分型号的STM32芯片有1~2个USB接口。像STM32F103系列的有一个USB Device接口,STM32F407系列的有2个USB接口,既可以作为HOST,又可以作为Device,还可以作为OTG接口。

Middleware 中选择 USB_DEVICE 设置,在 Class For FS IP 设备类别选择 Mass Storage Class(HID) 大容量存储设备类。
usb msc,STM32CubeMX,stm32,STM32CubeMX,USB,MSC,U盘
参数配置保持默认(或根据存储介质的最小存储单元修改缓冲区大小)。
usb msc,STM32CubeMX,stm32,STM32CubeMX,USB,MSC,U盘

  • MSC_MEDIA_PACKET (Media I/O buffer Size)(读写缓冲区大小): 2048(默认为512,这个的大小对于USB读写速度会有一些影响,最好和存储介质的最小存储单元一致)

本实验板使用的 STM32F103VET6 型号芯片的参数,即 STM32F1 大容量产品。若使用超大容量、中容量或小容量产品,它们主存储器的页数量、页大小均有不同,使用的时候要注意区分。
主存储器是以页为单位划分的。stm32根据FLASH主存储块容量、页面的不同,系统存储器的不同,分为小容量、中容量、大容量、互联型,共四类产品。

  • 小容量产品:主存储块1-32KB, 每页1KB。系统存储器2KB
  • 中容量产品:主存储块64-128KB, 每页1KB。系统存储器2KB
  • 大容量产品:主存储块256KB以上, 每页2KB。系统存储器2KB
  • 互联型产品:主存储块256KB以上, 每页2KB。系统存储器18KB

设备描述符保持默认。

usb msc,STM32CubeMX,stm32,STM32CubeMX,USB,MSC,U盘

四、生成代码

输入项目名和项目路径
usb msc,STM32CubeMX,stm32,STM32CubeMX,USB,MSC,U盘
选择应用的 IDE 开发环境 MDK-ARM V5
usb msc,STM32CubeMX,stm32,STM32CubeMX,USB,MSC,U盘
每个外设生成独立的 ’.c/.h’ 文件
不勾:所有初始化代码都生成在 main.c
勾选:初始化代码生成在对应的外设文件。 如 GPIO 初始化代码生成在 gpio.c 中。
usb msc,STM32CubeMX,stm32,STM32CubeMX,USB,MSC,U盘
点击 GENERATE CODE 生成代码
usb msc,STM32CubeMX,stm32,STM32CubeMX,USB,MSC,U盘

五、修改usbd_storage_if.c

打开工程文件夹Application/User/USB_DEVICE/Appusbd_storage_if.c文件
usb msc,STM32CubeMX,stm32,STM32CubeMX,USB,MSC,U盘

5.1 修改扇区个数和大小

/** @defgroup USBD_STORAGE_Private_Defines
  * @brief Private defines.
  * @{
  */

//#define STORAGE_LUN_NBR                  1
//#define STORAGE_BLK_NBR                  0x10000
//#define STORAGE_BLK_SIZ                  0x200

#define STORAGE_LUN_NBR                  1      // 1个盘
#define STORAGE_BLK_NBR                  48    // 模拟48个扇区
#define STORAGE_BLK_SIZ                  FLASH_PAGE_SIZE  // VET6是2k的页
  • STORAGE_BLK_NBR 是扇区个数,此处使用的是48,大小完全根据自己需求定义。

  • STORAGE_BLK_SIZ 扇区大小取决于所用芯片Flash页面的单位,实验所用STMF103VET6为一页的大小是2K,所以
    STORAGE_BLK_SIZ = FLASH_PAGE_SIZE = 0x800

  • U盘实际容量 = 扇区个数 * 扇区大小,所以这个U盘最终大小应该是48*2K = 96K

5.2 添加Flash起始地址

/* USER CODE BEGIN PRIVATE_DEFINES */
#define FLASH_START_ADDR                 ((uint32_t)0x08008000)
/* USER CODE END PRIVATE_DEFINES */

由于内部 FLASH 本身存储有程序数据,若不是有意删除某段程序代码,一般不应修改程序空间的内容,所以在使用内部 FLASH 存储其它数据前需要了解哪一些空间已经写入了程序代码,存储了程序代码的扇区都不应作任何修改。通过查询应用程序编译时产生的“*.map”后缀文件,可以了解程序存储到了哪些区域。
usb msc,STM32CubeMX,stm32,STM32CubeMX,USB,MSC,U盘
打开 map 文件后,查看文件最后部分的区域,可以看到一段以 “Memory Map of the image” 开头的记录(若找不到可用查找功能定位)
usb msc,STM32CubeMX,stm32,STM32CubeMX,USB,MSC,U盘

观察表中的最后一项,它的基地址是 0x0800175c,大小为 0x00000020,可知它占用的最高的地址空间为 0x0800177c,跟执行区域的最高地址 0x0000177c 一样,但它们比加载区域说明中的最高地址 0x80017a8 要小,所以我们以加载区域的大小为准。对比表 45-1 的内部 FLASH 页地址分布表,可知仅使用页 0 至页 2 就可以完全存储本应用程序,所以从页3 (地址 0x08001800) 后的存储空间都可以作其它用途,使用这些存储空间时不会篡改应用程序空间的数据。

5.3 修改存储读写函数

  • STORAGE_Read_FS
/**
  * @brief  .
  * @param  lun: .
  * @retval USBD_OK if all operations are OK else USBD_FAIL
  */
int8_t STORAGE_Read_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
  /* USER CODE BEGIN 6 */
  //将(FLASH_START_ADDR + blk_addr * FLASH_PAGE_SIZE)起始地址处的blk_len * FLASH_PAGE_SIZE大小的数据拷贝到buf里面
  memcpy(buf, (uint8_t*)(FLASH_START_ADDR + blk_addr * STORAGE_BLK_SIZ), blk_len * STORAGE_BLK_SIZ);
  return (USBD_OK);
  /* USER CODE END 6 */
}
  • STORAGE_Write_FS
/**
  * @brief  .
  * @param  lun: .
  * @retval USBD_OK if all operations are OK else USBD_FAIL
  */
int8_t STORAGE_Write_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
  /* USER CODE BEGIN 7 */
    uint16_t i;
   	HAL_FLASH_Unlock();
   	FLASH_EraseInitTypeDef flash_erase_handler;
   	flash_erase_handler.TypeErase = FLASH_TYPEERASE_PAGES;
   	flash_erase_handler.PageAddress = FLASH_START_ADDR + blk_addr*STORAGE_BLK_SIZ ;
	flash_erase_handler.NbPages = blk_len;
	uint32_t PageError = 0;
	HAL_FLASHEx_Erase(&flash_erase_handler, &PageError);   //页擦除,擦除后才能往这个页面写入东西        
 
    for(i=0;i<blk_len*STORAGE_BLK_SIZ;i+=4)
    {
        HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,FLASH_START_ADDR + blk_addr*STORAGE_BLK_SIZ + i , *(uint32_t *)(&buf[i]));
    }
    //开始写入 每次写入一个4字节的大小,直到写完
	HAL_FLASH_Lock();
  return (USBD_OK);
  /* USER CODE END 7 */
}

六、查看效果

编译工程,下载到板子上,插上USB线连接到电脑上,识别出为大容量存储设备

usb msc,STM32CubeMX,stm32,STM32CubeMX,USB,MSC,U盘

注意: 如果设备带有感叹号,则参考下面八、注意事项
usb msc,STM32CubeMX,stm32,STM32CubeMX,USB,MSC,U盘
弹出格式化对话框,直接格式化就行
usb msc,STM32CubeMX,stm32,STM32CubeMX,USB,MSC,U盘
文件系统选择FAT模式
usb msc,STM32CubeMX,stm32,STM32CubeMX,USB,MSC,U盘
这里的显示空间为72KB,但是U盘容量应该是有96K的,剩下的24K应该与WINDOWS格式化的FAT32的文件表有关
usb msc,STM32CubeMX,stm32,STM32CubeMX,USB,MSC,U盘
新建一个文档测试.txt然后在文档中输入一些内容:
usb msc,STM32CubeMX,stm32,STM32CubeMX,USB,MSC,U盘
重新上电断开后再次打开U盘看里面的内容和已用空间
usb msc,STM32CubeMX,stm32,STM32CubeMX,USB,MSC,U盘
usb msc,STM32CubeMX,stm32,STM32CubeMX,USB,MSC,U盘

七、工程代码

链接:https://pan.baidu.com/s/1maV4gnFFNNfAEqUVOSuKXw?pwd=xs3o 提取码:xs3o

八、注意事项

用户代码要加在 USER CODE BEGIN NUSER CODE END N 之间,否则下次使用 STM32CubeMX 重新生成代码后,会被删除。
usb msc,STM32CubeMX,stm32,STM32CubeMX,USB,MSC,U盘

如果USB端口出现感叹号设备无法启动的问题,可适当将堆改大,如0x400
usb msc,STM32CubeMX,stm32,STM32CubeMX,USB,MSC,U盘
usb msc,STM32CubeMX,stm32,STM32CubeMX,USB,MSC,U盘


• 由 Leung 写于 2022 年 11 月 16 日

• 参考:STM32 基础系列教程 26 - USB_MSC
    4.2、CUBEMX USB之MSC(基于内部FLASH)文章来源地址https://www.toymoban.com/news/detail-612207.html

到了这里,关于STM32CubeMX学习笔记(47)——USB接口使用(MSC基于内部Flash模拟U盘)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32CubeMX教程30 USB_DEVICE - MSC外设_读卡器

    正点原子stm32f407探索者开发板V2.4 STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) ST-LINK/V2驱动 野火DAP仿真器 XCOM V2.6串口助手 使用STM32CubeMX软件配置STM32F407开发板 USB_OTG_FS为工作在Mass Storage Class(大容量存储类)模式下的USB_DEVICE(USB从机),使其作为SD卡读卡器在Windows系

    2024年02月19日
    浏览(40)
  • 手把手教你使用USB的CDC+MSC复合设备(基于stm32f407)

      最近对usb有点兴趣,感觉挺好玩的,于是买了本圈圈大神的经典著作-圈圈教你玩USB,里面使用51单片机+usb芯片对usb的基本知识潺潺道来,做了十个左右的常用案例实验,很有趣,建议大家看看。   趁热打铁,拿身边的开发板来练练手,探索一下复合设备的好玩方便的

    2024年02月13日
    浏览(67)
  • 基于STM32CubeMx配置FreeRtos以及USB虚拟串口步骤详解

       Debug:推荐选择 Serial Wire (方便使用STLink打断点在线调试) 中间两项默认Disable就好 TimeBase Source:若需要配置FreeRtos则不能选择SysTick,随机选择一个TIM定时器即可,这里我选择TIM1定时器。 (解释:裸机的时钟源默认是SysTick,但是开启FreeRtos后,FreeRtos会占用SysTick,用于任

    2024年02月05日
    浏览(72)
  • STM32F103C8用内部Flash做一个优盘(USB+MSC+FATFS)

    STM32F103C8用内部Flash做一个优盘(USB+MSC+FATFS),轻松实现APP升级、数据存储。 直接使用STM32CubeMX生成基本的工程,省得我们去调底层。 时钟配置为外部8MHz晶振,这个需要根据自己开发板的晶振选择。  启用SWD下载和滴答定时器  启用USB  启用FATFS,MAX_SS和MIN_SS设置为1024。  配

    2024年02月14日
    浏览(45)
  • STM32CubeMX教程29 USB_HOST - 使用FatFs文件系统读写U盘

    正点原子stm32f407探索者开发板V2.4 STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) ST-LINK/V2驱动 野火DAP仿真器 XCOM V2.6串口助手 使用STM32CubeMX软件配置STM32F407开发板 USB_OTG_FS为工作在Mass Storage Host Class(大容量存储主机类)模式下的USB_HOST(USB主机),并使用FatFs文件系统对

    2024年02月19日
    浏览(44)
  • STM32CubeMX学习笔记16--- STM32内部FLASH

    1. 内部FLASH简介         之前的文章中介绍过STM32F1利用SPI与外部FLASH(W25QXX芯片)通讯的例程,本例程将介绍STM32F1的内部FLASH,通过内部FLASH实现数据读写操作。 不同型号的STM32,其FLASH容量也有所不同,最小的只有16K字节,最大的则达到了1024K字节。此处我们使用的是ST

    2024年04月09日
    浏览(45)
  • STM32 CubeMX USB_CDC(USB_转串口)

    参考: STM32CubeMX学习笔记

    2024年02月14日
    浏览(47)
  • 【STM32笔记】STM32的定时器开发基础(二)(基于STM32CubeMX实现定时器中断)

      传统STM32外部中断 的设计步骤:  (1)将GPIO初始化为输入端口。  (2)配置相关I/O引脚与中断线的映射关系。  (3)设置该I/O引脚对印的中断触发条件。  (4)配置NVIC,并使能中断。  (5)编写中断服务函数。   基于STM32CubeMX的外部中断 设计步骤  (1)在STM3

    2024年02月20日
    浏览(62)
  • STM32 CubeMX USB_(HID 鼠标和键盘)

    STM32 CubeMX 自动生成的USB_HID是鼠标类型的:键盘类型要做一点小修改; 参考: STM32CubeMX学习笔记 USB鼠标HID描述符以及数据格式

    2024年02月14日
    浏览(38)
  • STM32 CubeMX配置USB HID功能,及安装路径

    STM32CubeMX学习笔记(46)——USB接口使用(HID自定义设备) STM32CubeMX实现STM32 USBHID双向64字节通信(下位机部分) STM32 USB HID设置(STM32CubeMX) 关于keil 5安装出现Fail to set path to Software Packs.问题解决方法

    2024年02月08日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包