衡山派D21x平台SDMC驱动与文件系统参数配置详解

news2026/4/12 17:22:17
衡山派D21x平台SDMC驱动与文件系统参数配置详解最近在衡山派D21x平台上做项目要用到SD卡存储数据发现很多朋友在配置SDMC驱动和挂载文件系统时容易卡住。今天我就把自己在实际项目中配置SD/MMC控制器SDMC的完整流程分享出来手把手教你如何在Luban-Lite系统下搞定驱动配置、文件系统挂载还有实用的热插拔功能。无论你是用RT-Thread内核还是Baremetal裸机模式这篇教程都能帮你快速上手。咱们从最基础的menuconfig配置开始一步步深入到文件系统挂载最后还会讲讲热插拔怎么设置。1. 驱动配置让系统认识你的SD卡要让D21x芯片能读写SD卡首先得告诉系统“我这里有个SD卡控制器要用”。这个配置过程都在menuconfig里完成相当于给系统做“硬件登记”。1.1 进入配置界面打开你的Luban-Lite项目根目录在终端里输入scons --menuconfig这个命令会打开一个图形化的配置界面用方向键和回车键就能操作很像老式的BIOS设置界面。1.2 选择SDMC控制器D21x芯片内置了3个SDMC控制器SDMC0、SDMC1、SDMC2你需要根据硬件设计选择实际连接SD卡的那个。大多数开发板默认用SDMC1。在menuconfig里按这个路径找到配置项Board options --- [ ] Using SDMC0 [*] Using SDMC1 # 按空格键选中出现*号表示启用 [ ] Using SDMC2 [*] Enable the interrupt of SDMC # 建议开启中断性能更好注意这里有个小技巧当你选中Using SDMC1时系统会自动帮你打开RT-Thread的SDIO设备驱动框架省去了后面单独配置的步骤。1.3 配置SDMC1详细参数选中SDMC1后下面会出现SDMC1 Parameter子菜单按回车进入SDMC1 Parameter --- Select SDMC1 BUSWIDTH (sdmc 4-bit mode) --- # 总线宽度一般选4-bit [ ] Using SDcard hotplug detection # 热插拔检测后面会讲 [ ] SDMC1 connect to a SDIO device # 如果不是接SDIO设备就别选 (3) SDMC1 driver phase # 驱动相位默认3 (0) SDMC1 sample phase # 采样相位默认0 (100000000) SDMC1 CMU clock frequency # 时钟频率默认100MHz这里有几个参数需要解释一下BUSWIDTHSD卡通信的数据线宽度。1-bit模式最兼容4-bit模式速度最快。如果你的SD卡座和芯片引脚连接了4根数据线就选4-bit。driver phase和sample phase这两个是信号相位调整参数主要影响SD卡兼容性。Luban-Lite已经提供了优化后的默认值3和0除非遇到特殊SD卡识别问题否则不要改动。CMU clock frequencySDMC控制器的时钟频率默认100MHz。这个值会影响SD卡的读写速度但也不是越高越好要参考SD卡本身的规格。1.4 RT-Thread内核的特殊配置如果你用的是RT-Thread内核不是裸机还需要额外配置SDIO框架。在menuconfig里找到Rt-Thread options --- RT-Thread Components --- Device Drivers --- [*] Using SD/MMC device driver # 启用SD/MMC设备驱动 (512) The stack size for sdio irq thread # 中断线程栈大小 (15) The priority level value of sdio irq thread # 中断线程优先级 (8192) The stack size for mmcsd thread # mmcsd线程栈大小 (22) The priority level value of mmcsd thread # mmcsd线程优先级 (16) mmcsd max partition # 最大分区数这些参数保持默认一般就够用了。唯一要注意的是栈大小如果你的应用比较复杂SD卡操作频繁可以把mmcsd thread的栈大小从8192适当调大避免栈溢出。2. 文件系统配置让SD卡能存文件驱动配置好了系统能识别SD卡了但还不能像U盘那样存文件。我们需要给SD卡“穿上”文件系统这件“外衣”。2.1 RT-Thread文件系统配置RT-Thread下最常用的文件系统是FatFS在配置里叫elm也就是我们电脑上U盘用的FAT32/exFAT格式。在menuconfig里按这个路径配置Rt-Thread options --- RT-Thread Components --- [*] DFS: device virtual file system --- # 启用虚拟文件系统 [*] Using posix-like functions, open/read/write/close # 启用类POSIX函数 [*] Using working directory # 启用工作目录 (4) The maximal number of mounted file system # 最大挂载文件系统数 (4) The maximal number of file system type # 支持的文件系统类型数 (16) The maximal number of opened files # 同时打开的最大文件数 [*] Using mount table for file system # 重要启用挂载表 [*] Enable elm-chan fatfs # 启用FatFS elm-chans FatFs, Generic FAT Filesystem Module --- # FatFS详细配置 [ ] Using devfs for device objects # 设备文件系统按需启用 [*] Enable ReadOnly file system on flash # 启用Flash只读文件系统 [ ] Enable RAM file system # RAM文件系统按需启用关键配置项说明Using mount table for file system这个一定要打开它允许系统启动时自动挂载文件系统不用我们手动写代码挂载。elm-chan fatfs这就是FatFS文件系统SD卡格式化时一般就格式化成FAT32。其他参数如最大打开文件数、最大挂载数等根据你的应用需求调整。普通应用默认值就够用。2.2 配置自动挂载表打开了Using mount table for file system后需要在代码里定义挂载表。这个表告诉系统“SD卡设备名叫sd0要挂载到/sdcard目录用elm文件系统”。打开你的板级支持包里的board.c文件找到或添加以下代码#ifdef RT_USING_DFS_MNTTABLE #include dfs_fs.h const struct dfs_mount_tbl mount_table[] { #ifdef AIC_USING_SDMC1 {sd0, /sdcard, elm, 0, 0, 0}, // 设备名, 挂载点, 文件系统类型, 标志, 数据 #endif {0} // 结束标记 }; #endif这段代码的意思是如果定义了SDMC1AIC_USING_SDMC1就把名为sd0的SD卡设备用elmFatFS文件系统挂载到/sdcard目录。最后三个0是标志位和私有数据一般填0就行。系统启动后你就能在/sdcard目录下访问SD卡的文件了。2.3 Baremetal模式的文件系统配置如果你用的是裸机模式Baremetal配置会更简单一些Local packages options --- Third-party packages options --- [*] DFS: device virtual file system for baremetal mode --- # 裸机文件系统 [*] Using posix-like functions, open/read/write/close (4) The maximal number of mounted file system (4) The maximal number of file system type (16) The maximal number of opened files [ ] Using mount table for file system # 裸机一般不用挂载表 [*] Enable elm-chan fatfs elm-chans FatFs, Generic FAT Filesystem Module --- [ ] Enable ReadOnly file system on flash [ ] Enable RAM file system裸机模式下文件系统挂载通常在main.c里手动完成#if defined(LPKG_USING_DFS_ELMFAT) defined(AIC_SDMC_DRV) if (dfs_mount(sdmc, /, elm, 0, 0) 0) pr_err(Failed to mount sdmc with FatFS\n); #endif注意这里设备名是sdmc不是sd0而且直接挂载到根目录/。这是因为裸机模式通常只有一个存储设备。3. 热插拔配置像U盘一样即插即用热插拔是个很实用的功能允许你在系统运行中插入或拔出SD卡系统会自动检测并挂载/卸载。这个功能在数据采集、日志导出等场景特别有用。3.1 热插拔支持现状目前Luban-Lite只实现了SDMC1的热插拔功能。如果你需要用SDMC0或SDMC2的热插拔需要自己参考源码扩展。热插拔的源码位置RT-Threadbsp/artinchip/drv/sdmc/drv_sdcard.cBaremetalbsp/artinchip/drv_bare/sdmc/sdcard.c3.2 启用热插拔检测配置很简单在menuconfig里打开一个选项就行Board options --- [*] Using SDMC1 SDMC1 Parameter --- [*] Using SDcard hotplug detection # 启用SD卡热插拔检测这个配置对RT-Thread和Baremetal都适用。启用后系统会监测SD卡座的检测引脚如果有的话或者通过软件方式检测SD卡状态变化。3.3 热插拔使用注意事项实际使用中有几点需要注意硬件支持热插拔需要硬件支持检测引脚。检查你的开发板原理图看SD卡座的CD/DAT3引脚是否接到了芯片的GPIO上。软件处理热插拔事件发生后系统会回调注册的函数。你需要在这个回调函数里处理挂载或卸载卡插入调用dfs_mount()挂载文件系统卡拔出调用dfs_unmount()卸载文件系统文件安全热插拔时如果有文件正在读写一定要先关闭文件。否则可能导致文件损坏或数据丢失。在实际项目中我一般会加个状态标志检测到卡拔出时先等待所有文件操作完成。多次插拔测试热插拔功能一定要充分测试。我遇到过的情况是快速连续插拔SD卡有时系统反应不过来。好的做法是加个防抖延时避免误触发。4. 实际配置经验分享最后分享几个我在实际项目中踩过的坑和总结的经验时钟频率不要盲目调高SDMC的CMU时钟默认是100MHz但并不是所有SD卡都能跑这么高。特别是老款或低速卡时钟太快反而会导致读写错误。如果遇到SD卡识别不稳定可以尝试把频率降到50MHz试试。相位参数慎改driver phase和sample phase这两个参数Luban-Lite给的默认值3和0是经过测试的。除非你确定是相位问题导致SD卡不识别否则不要随便改。改了之后可能这张卡能用了另一张卡又不行了。文件系统挂载失败排查如果SD卡驱动正常但文件系统挂载失败按这个顺序排查检查SD卡是否格式化FatFS支持FAT16/FAT32/exFAT检查挂载点目录是否存在RT-Thread下可能需要手动创建检查设备名是否正确RT-Thread用sd0Baremetal用sdmc查看系统日志通常会有错误信息提示热插拔的实时性热插拔检测不是瞬间完成的从物理插拔到系统响应有个过程。在要求严格实时性的应用里不要依赖热插拔事件作为关键操作的触发条件。多分区支持RT-Thread的SDIO驱动支持多分区最多16个配置里的mmcsd max partition就是设置这个的。如果你的SD卡有多个分区每个分区会被识别为sd0、sd1、sd2...挂载时设备名要相应调整。按照上面的步骤配置完编译下载到衡山派D21x开发板你的SD卡应该就能正常使用了。如果还有问题多看系统启动时的串口日志里面通常会有详细的错误信息对照着排查就行。

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

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

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…