RT-Thread之USB组件的使用记录(SD卡和USB同时挂载)

前言

  1. 使用usb-host组件读取u盘
  2. 记录同时挂载sd和u盘
  3. 用到的芯片为stm32f407zgt6
  4. u盘的格式为fat

组件选择

在这里插入图片描述在这里插入图片描述

文件相关的宏定义

/* DFS: device virtual file system */
/* 设备虚拟文件系统 */
#define RT_USING_DFS
#define DFS_USING_WORKDIR
#define DFS_FILESYSTEMS_MAX 3 // 这里
#define DFS_FILESYSTEM_TYPES_MAX 2
#define DFS_FD_MAX 16
//#define RT_USING_DFS_MNTTABLE /*可移植操作系统接口(Portable Operating System Interface of UNIX,缩写 POSIX)*/
/* elm-chan's FatFs, Generic FAT Filesystem Module */
#define RT_MMCSD_STACK_SIZE 2048
#define RT_DFS_ELM_CODE_PAGE 936
#define RT_DFS_ELM_USE_LFN 3
#define RT_DFS_ELM_LFN_UNICODE 0
#define RT_DFS_ELM_MAX_LFN 255
#define RT_DFS_ELM_DRIVES 2
#define RT_DFS_ELM_MAX_SECTOR_SIZE 512
#define RT_DFS_ELM_REENTRANT
#define RT_DFS_ELM_MUTEX_TIMEOUT 3000
#define RT_USING_DFS_DEVFS
// -----------------------------USB 组件
#define RT_USING_USB
#define RT_USING_USB_HOST
#define RT_USBH_MSTORAGE
#define UDISK_MOUNTPOINT "/disk"  // 挂载节点要在sd卡目录上存在
#define RT_USBD_THREAD_STACK_SZ 4096

注意,这里“DFS_FILESYSTEMS_MAX ”的配置

  1. 要配置最少数目是3., SD卡占一个,U盘占一个,还有dfs内置了一个dev要占一个,源码如下
    在这里插入图片描述

SD卡配置

SD卡硬件驱动的配置(cubemx生成)

//
// Created by shchl on 2024/3/10.
//
#include "board.h"
#ifdef BSP_USING_SDIOvoid HAL_SD_MspInit(SD_HandleTypeDef *hsd) {GPIO_InitTypeDef GPIO_InitStruct = {0};if (hsd->Instance == SDIO) {/* USER CODE BEGIN SDIO_MspInit 0 *//* USER CODE END SDIO_MspInit 0 *//* Peripheral clock enable */__HAL_RCC_SDIO_CLK_ENABLE();__HAL_RCC_GPIOC_CLK_ENABLE();__HAL_RCC_GPIOD_CLK_ENABLE();/**SDIO GPIO ConfigurationPC8     ------> SDIO_D0PC9     ------> SDIO_D1PC10     ------> SDIO_D2PC11     ------> SDIO_D3PC12     ------> SDIO_CKPD2     ------> SDIO_CMD*/GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;GPIO_InitStruct.Alternate = GPIO_AF12_SDIO;HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);GPIO_InitStruct.Pin = GPIO_PIN_2;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;GPIO_InitStruct.Alternate = GPIO_AF12_SDIO;HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);/* USER CODE BEGIN SDIO_MspInit 1 *//* USER CODE END SDIO_MspInit 1 */}}
#endif

SD卡文件系统挂载

//
// Created by shchl on 2024/3/10.
//
#include <board.h>#include "dfs.h"
#include "dfs_fs.h"const struct dfs_mount_tbl mount_table[] = {{"sd0", "/", "elm", 0, 0},
};
#ifndef RT_USING_DFS_MNTTABLEint dfs_mount_table(void) {static rt_uint8_t try_cnt;for (int i = 0; i < sizeof(mount_table) / sizeof(mount_table[0]); ++i) {retry_mount:if (dfs_mount(mount_table[i].device_name,mount_table[i].path,mount_table[i].filesystemtype,mount_table[i].rwflag,mount_table[i].data) != 0) {if (try_cnt < 10) {rt_thread_mdelay(20);try_cnt++;goto retry_mount;} else {rt_kprintf("mount fs[%s] on %s failed.\n",mount_table[i].filesystemtype,mount_table[i].path);}}try_cnt = 0;}return 0;
}INIT_ENV_EXPORT(dfs_mount_table);
#endif

USB硬件驱动配置(cubemx生成)

//
// Created by shchl on 2024/3/16.
//#include "board.h"#ifdef BSP_USING_USBHOST//USB主机电源控制口
#define USB_HOST_PWRCTRL    GET_PIN(A,15)    //PA15void HAL_HCD_MspInit(HCD_HandleTypeDef *hhcd) {if (hhcd->Instance == USB_OTG_FS) {/**USB_OTG_FS GPIO ConfigurationPA11     ------> USB_OTG_FS_DMPA12     ------> USB_OTG_FS_DP*/GPIO_InitTypeDef GPIO_InitStruct;__HAL_RCC_GPIOA_CLK_ENABLE();                   //使能GPIOA时钟//配置PA11 12GPIO_InitStruct.Pin = GPIO_PIN_11 | GPIO_PIN_12;    //PA11 12GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;           //复用GPIO_InitStruct.Pull = GPIO_NOPULL;               //无上下拉GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;          //高速GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS;     //复用为OTG FSHAL_GPIO_Init(GPIOA, &GPIO_InitStruct);         //初始化//PA15GPIO_InitStruct.Pin = GPIO_PIN_15;                      //PA15GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;             //推挽输出GPIO_InitStruct.Pull = GPIO_NOPULL;                     //无上下拉GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;                //高速HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);rt_pin_write(USB_HOST_PWRCTRL, PIN_HIGH);   //开启USB HOST电源供电/* Peripheral clock enable */__HAL_RCC_USB_OTG_FS_CLK_ENABLE();/* USB_OTG_FS interrupt Init */HAL_NVIC_SetPriority(OTG_FS_IRQn, 0, 0);HAL_NVIC_EnableIRQ(OTG_FS_IRQn);}
}#endif

测试结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2868784.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Pikachu 靶场搭建

文章目录 环境说明1 Pikachu 简介2 Pikachu 安装 环境说明 操作系统&#xff1a;Windows 10PHPStudy 版本: 8.1.1.3Apache 版本&#xff1a;2.4.39MySQL 版本 5.7.26 1 Pikachu 简介 Pikachu是一个使用“PHP MySQL” 开发、包含常见的Web安全漏洞、适合Web渗透测试学习人员练…

印度交易所股票行情数据API接口

1. 历史日线 # Restful API https://tsanghi.com/api/fin/stock/XNSE/daily?token{token}&ticker{ticker}默认返回全部历史数据&#xff0c;也可以使用参数start_date和end_date选择特定时间段。 更新时间&#xff1a;收盘后3~4小时。 更新周期&#xff1a;每天。 请求方式…

python二级备考(3)-综合应用

1 《命运》是著名科幻作家倪匡的作品。这里给出《命运》的一个网络版本文件&#xff0c;文件名为“命运. txt”。 问题1 (5分) :在PY301-1. py文件中修改代码&#xff0c;对“命运. txt”文件进行字符频次统计&#xff0c;输出频次最高的中文字符(不包含标点符号)及其频次&…

初学者必看的python中类型转换

Python中常见的类型转换 int(x [,base ]) 将x转换为一个整数 long(x [,base ]) 将x转换为一个长整数 float(x ) 将x转换到一个浮点数 complex(real [,imag ]) 创建一个复数 str(x ) 将对象 x 转换为字符串 repr(x ) 将对象 x 转换为表达式字符串 eval(str ) 用来计算在字符串中…

05-延迟任务精准发布文章-黑马头条

延迟任务精准发布文章 1)文章定时发布 2)延迟任务概述 2.1)什么是延迟任务 定时任务&#xff1a;有固定周期的&#xff0c;有明确的触发时间延迟队列&#xff1a;没有固定的开始时间&#xff0c;它常常是由一个事件触发的&#xff0c;而在这个事件触发之后的一段时间内触发…

Docker----Dockerfile构建微服务镜像

目录 一、关键步骤 二、具体步骤 1、准备后端jar包(这里以java后端演示) 2、编写Dockerfile 3、构建镜像 4、运行镜像容器 5、测试是否成功 一、关键步骤 1、准备后端jar包(这里以java后端演示) 2、编写Dockerfile 3、构建镜像 4、运行镜像容器 5、测试是否成功 二…

软件工程(Software Engineering)

一、软件工程概述 1.软件生存周期 软件&#xff1a; 包含程序、数据及相关文档 软件工程&#xff1a; 涉及到软件开发、维护、管理等多方面的原理、工具与环境。最终的目的是开发高质量的软件。 目的&#xff1a; 提高软件生产率、提高软件质量、降低软件成本。 文档的作用&…

2024 Mazing 3 中文版新功能介绍Windows and macOS

iMazing 3中文版(ios设备管理软件)是一款管理苹果设备的软件&#xff0c; Windows 平台上的一款帮助用户管理 IOS 手机的应用程序。iMazing中文版与苹果设备连接后&#xff0c;可以轻松传输文件&#xff0c;浏览保存信息等&#xff0c;软件功能非常强大&#xff0c;界面简洁明晰…

力扣965单值二叉树的小细节

这一段的两个判断条件&#xff0c;一定要root->left!NULL在前 如果root->val!root->left->val在前&#xff0c;root->left为空的时候&#xff0c;就无法拿出root->left->val&#xff0c;在一个NULL的指针里拿不出val。 把root->left!NULL放在前面&am…

文才与口才:谁才是成功的关键因素?

文才与口才&#xff1a;谁才是成功的关键因素&#xff1f; 自古以来&#xff0c;文才与口才一直是人们关注的重要议题。在追求成功的道路上&#xff0c;文才与口才究竟谁才是关键因素&#xff1f;这是一个值得深入探讨的问题。本文将从多个维度出发&#xff0c;分析文才与口才…

01背包 与 emo题目背景(周超人的遗憾) 的爱恨情仇

本题背景有意思&#xff0c;大家当乐子看&#xff0c;目前没有找到题目原题&#xff0c;也没有写过完全是01背包模板的题目&#xff0c;该篇文章大家注意其01背包一维写法的模板就好&#xff0c;注意各个关键点 ✨欢迎来到脑子不好的小菜鸟的文章✨ &#x1f388;创作不易&…

力扣L13--- 409.最长回文串(JAVA版)-2024年3月1日

1.题目描述 2.知识点 注1&#xff1a;向下取整是将一个数值向下舍入到最接近的整数&#xff0c;但不超过这个数值的整数。具体规则如下&#xff1a; 对于正数&#xff0c;向下取整后得到的整数是不大于原数值的最大整数&#xff1b; 对于负数&#xff0c;向下取整后得到的整数…

Java手写简易数据库--持续更新中

MYDB 0. 项目结构0.1 引用计数缓存框架为什么不使用LRU引用计数缓存缓存框架实现 0.2 共享内存数组 1. 事务管理器--TM1.1 XID 文件XID 规则XID 文件结构读取方式事务状态 1.2 代码实现 2. 数据管理器--DM2.1 页面缓存页面结构页面缓存数据页管理第一页普通页 2.2 日志文件 3. …

一文搞懂PCL中自定义点云类型的构建与函数使用

上周猛男快乐开发时遇到个bug&#xff0c;要用pcl的函数对自定义的点云进行处理。一起解决问题时遇到了很多问题&#xff0c;解决后整理出来分享给各位参考&#xff0c;以免踩一样的坑&#x1f60a;。文章中自定义的点我用PointT来表示&#xff0c;自定义点云一般指的是pcl::Po…

西门子TIA中配置Anybus PROFINET IO Slave 模块

1、所需产品 Siemens S7 PLC CPU 315-2 PN/DP 6ES7 315-2EH-0AB0 Siemens PLC 编程电缆 n.a. n.a. PC ,并安装Siemens PLC编程软件 TIA Portal V11 X-gateway Slave 接口的GSDML文件 根据网关的软件版本而定 Anybus Communicator GSD文件 GSDML-V1.0-HMS-ABCPRT-20050317.xl…

算法耗时通用优化技巧 总结

最近在部署AI相关的算法&#xff0c;并要求减少总耗时&#xff0c;从中总结出的一些比较通用的优化技巧。精髓总结一句话就是&#xff1a;在同一时间尽可能充分利用硬件资源。而怎么尽可能充分利用呢&#xff0c;方式就是多线程并行处理。 1、单线程串行处理数据 假设算法需要…

Python中字符串知识点汇总,以及map()函数的使用

1.字符串的定义 字符串&#xff1a;字符串就是一系列字符。在python中&#xff0c;用引号括起来的都是字符串&#xff0c;其中的引号可以是单引号&#xff0c;也可以是双引号。 2.使用方法修改字符串的大小写 ①将字符串的字母全部改为大写&#xff1a;upper()函数 实例&…

kkview远程控制: 内网远程桌面控制软件

内网远程桌面控制软件&#xff1a;高效、安全的远程管理方案 在信息技术日新月异的今天&#xff0c;内网远程桌面控制软件已成为许多企业和个人用户不可或缺的工具。这类软件允许用户通过内部网络&#xff0c;实现对其他计算机的远程访问和控制&#xff0c;从而大大提高工作效…

蓝桥杯Java准备

蓝桥杯马上就要开始了&#xff0c;话说干什么都先准备准备&#xff0c;临阵磨枪不快也光。 首先蓝桥杯java语言中使用的是eclipse的2020.06的版本&#xff0c;使用jdk1.8的版本&#xff0c;大家可以先下载下来然后体验一下。 然后就是熟悉的Helloworld环节 eclipse设置 打开几…

Linux第79步_使用自旋锁保护某个全局变量来实现“互斥访问”共享资源

自旋锁使用注意事项:自旋锁保护的“临界区”要尽可能的短。 因此&#xff0c;在open()函数中申请“spinlock_t自旋锁结构变量”&#xff0c;然后在release()函数中释放“spinlock_t自旋锁结构变量”&#xff0c;这种方法就行不通了。如果使用一个变量“dev_stats”来表示“共享…