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

news2024/11/16 18:52:11

前言

  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_SDIO

void 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 Configuration
        PC8     ------> SDIO_D0
        PC9     ------> SDIO_D1
        PC10     ------> SDIO_D2
        PC11     ------> SDIO_D3
        PC12     ------> SDIO_CK
        PD2     ------> 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_MNTTABLE

int 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)    //PA15

void HAL_HCD_MspInit(HCD_HandleTypeDef *hhcd) {

    if (hhcd->Instance == USB_OTG_FS) {
        /**USB_OTG_FS GPIO Configuration
        PA11     ------> USB_OTG_FS_DM
        PA12     ------> USB_OTG_FS_DP
        */
        GPIO_InitTypeDef GPIO_InitStruct;
        __HAL_RCC_GPIOA_CLK_ENABLE();                   //使能GPIOA时钟
        //配置PA11 12
        GPIO_InitStruct.Pin = GPIO_PIN_11 | GPIO_PIN_12;    //PA11 12
        GPIO_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 FS
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);         //初始化

        //PA15
        GPIO_InitStruct.Pin = GPIO_PIN_15;                      //PA15
        GPIO_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://www.coloradmin.cn/o/1522286.html

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

相关文章

MIT线性代数-方程组的几何解释

文章目录 1. 二维空间1.1 行方向1.2 列方向 2. 三维空间2.1 行方向2.2 列方向 假设有一个方程组 A X B AXB AXB表示如下 2 x − y 0 (1) 2x-y0\tag{1} 2x−y0(1) − x 2 y 3 (2) -x2y3\tag{2} −x2y3(2) 矩阵表示如下&#xff1a; [ 2 − 1 − 1 2 ] [ x y ] [ 0 3 ] (3)…

Python基础入门 --- 4.循环语句

文章目录 Python基础入门第四章&#xff1a;4.1 while循环语句4.1.1 while循环的嵌套4.2 for循环语句4.2.1 range语句4.2.2 变量作用域4.2.3 for循环的嵌套应用 4.3 循环中断 continue和break Python基础入门 第四章&#xff1a; 4.1 while循环语句 语法结构&#xff1a; w…

Day66:WEB攻防-Java安全SPEL表达式SSTI模版注入XXEJDBCMyBatis注入

目录 JavaSec搭建 Hello-Java-Sec搭建 Java安全-SQL注入-JDBC&MyBatis Java安全-XXE注入-Reader&Builder Java安全-SSTI模版-Thymeleaf&URL Java安全-SPEL表达式-SpringBoot框架 知识点&#xff1a; 1、Java安全-SQL注入-JDBC&MyBatis 2、Java安全-XXE注…

html编辑器

HTML 编辑器推荐 html可以使用记事本编辑 但是更建议使用专业的 HTML 编辑器来编辑 HTML&#xff0c;我在这里给大家推荐几款常用的编辑器&#xff1a; VS Code&#xff1a;https://code.visualstudio.com/WebStorm: https://www.jetbrains.com/webstorm/Notepad: https://no…

相机与相机模型(针孔/鱼眼/全景相机)

本文旨在较为直观地介绍相机成像背后的数学模型&#xff0c;主要的章节组织如下&#xff1a; 第1章用最简单的针孔投影模型为例讲解一个三维点是如何映射到图像中的一个像素 第2章介绍除了针孔投影模型外其他一些经典投影模型&#xff0c;旨在让读者建立不同投影模型之间的建模…

考研C语言复习进阶(6)

目录 1. 程序的翻译环境和执行环境 2. 详解编译链接 2.1 翻译环境 ​编辑​编辑 2.2 编译本身也分为几个阶段&#xff1a; 2.3 运行环境 3. 预处理详解 3.1 预定义符号 3.2 #define 3.2.1 #define 定义标识符 3.2.2 #define 定义宏 2.2.3 #define 替换规则 3.2.4…

MySQL语法分类 DQL(6)分页查询

为了更好的学习这里给出基本表数据用于查询操作 create table student (id int, name varchar(20), age int, sex varchar(5),address varchar(100),math int,english int );insert into student (id,name,age,sex,address,math,english) values (1,马云,55,男,杭州,66,78),…

物联网竞赛板CubMx全部功能简洁配置汇总

目录 前言&#xff1a;1、按键&LED灯配置&#xff1a;2、OLED配置&#xff1a;3、继电器配置&#xff1a;4、LORA模块配置&#xff1a;5、矩阵模块&#xff1a;6、串口模块&#xff1a;7、RTC配置&#xff1a;8、ADC模块配置&#xff1a;9、温度传感器模块&#xff1a;后续…

牛客网-SQL大厂面试题-1.各个视频的平均完播率

题目&#xff1a;各个视频的平均完播率 DROP TABLE IF EXISTS tb_user_video_log, tb_video_info; CREATE TABLE tb_user_video_log (id INT PRIMARY KEY AUTO_INCREMENT COMMENT 自增ID,uid INT NOT NULL COMMENT 用户ID,video_id INT NOT NULL COMMENT 视频ID,start_time dat…

rust学习笔记(1-7)

原文 8万字带你入门Rust 1.包管理工具Cargo 新建项目 1&#xff09;打开 cmd 输入命令查看 cargo 版本 cargo --version2&#xff09; 使用 cargo new 项目名 在文件夹&#xff0c;按 shift 鼠标右键 &#xff0c;打开命令行&#xff0c;运行如下命令&#xff0c;即可创建…

springboot多模块下swaggar界面出现异常(Knife4j文档请求异常)或者界面不报错但是没有显示任何信息

继上一篇博文&#xff0c;我们解决了多模块下扫描不到子模块的原因,建议先看上一个博客了解项目结构&#xff1a; springboot 多模块启动报错Field XXX required a bean of type XXX that could not be found. 接下来我们来解决swaggar异常的原因&#xff0c;我们成功启动项目…

大模型机器人的爆发时刻:OpenAI参与打造的Figure 01——直接口头支配机器人干活

前言 一年多前&#xff0c;OpenAI重塑了聊天机器人&#xff0c;彻底推动大模型技术的突飞猛进&#xff0c;一个月前&#xff0c;OpenAI又重塑了视频生成&#xff0c;当sora的热度还在持续时&#xff0c;没想到OpenAI在机器人领域也出手了&#xff0c;和Figure联合打造的人形机…

JUC之Java对象内存布局

Java对象 对象在堆中的存储布局 它保存了什么 对象指向它的类元数据的指针&#xff0c;虚拟机通过这个指针来确定这个对象是哪个类的实例 对象头有多大&#xff1f;在64位系统中&#xff0c;Mark Word占了8个字节&#xff0c;类型指针占了8个字节&#xff0c;一共是16个字…

flink1.18.0报错 an implicit exists from scala.Int => java.lang.Integer, but

完整报错 type mismatch;found : Int(100)required: Object Note: an implicit exists from scala.Int > java.lang.Integer, but methods inherited from Object are rendered ambiguous. This is to avoid a blanket implicit which would convert any scala.Int to a…

Qt 写一个邮件发送程序

最近在完成一个邮箱代替的告警功能&#xff0c;写了一个邮件发送的demo 以下为代码&#xff1a; #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include<QTcpSocket> namespace Ui { class MainWindow; }class MainWindow : public QMainWin…

【C语言初阶(五)】数组

❣博主主页: 33的博客❣ ▶文章专栏分类: C语言从入门到精通◀ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; 目录 1. 前言2.一维数组的概念3.一维数组的创建和初始化3.1数组的创建3.2数组的初始化3.3数组的类型 4.一维数组的使用4.1数组下标4.2数组元素打印4.4数组元…

Avalonia学习1:下载通用皮肤SukiUI,并在windows上启动成功

目录 1、引言 2、碰到的问题 1、下载下拉VS2022老版本的用不了。 2、升级后&#xff0c;发现没有装wsl&#xff0c;导致启动不了&#xff0c;但wsl又由于国内的关系安装不了&#xff0c;怎么办呢&#xff0c; 1、引言 最近在想有没有什么可以开发在Linux下运行…

项目实践《招聘网站数据爬取》

文章目录 一、模块导入部分二、预定义参数部分三、函数定义部分&#xff1a;send_get(page)四、函数定义部分&#xff1a;process_data(data)五、函数定义部分&#xff1a;responsibility(job_url)六、函数定义部分&#xff1a;while_data()七、主程序执行部分&#xff1a;八、…

antd5 虚拟列表原理(rc-virtual-list)

github:https://github.com/react-component/virtual-list rc-virtual-list 版本 3.11.4(2024-02-01) 版本&#xff1a;virtual-list-3.11.4 Development npm install npm start open http://localhost:8000/List 组件接收 Props PropDescriptionTypeDefaultchildrenRender …

57、服务攻防——应用协议RsyncSSHRDP漏洞批扫口令猜解

文章目录 口令猜解——Hydra-FTP&RDP&SSH配置不当——未授权访问—Rsync文件备份协议漏洞——应用软件-FTP&Proftpd搭建 口令猜解——Hydra-FTP&RDP&SSH FTP&#xff1a;文本传输协议&#xff0c;端口21&#xff1b;RDP&#xff1a;windows上远程终端协议…