xusiwei1236 发表于 2022-6-19 12:05

【先楫HPM6750测评】RT-Thread SDIO驱动和文件系统

本帖最后由 xusiwei1236 于 2022-6-19 12:07 编辑

<p>本篇将介绍&mdash;&mdash;如何在HPM6750EVKMINI开发板上使用RT-Thread的SDIO驱动和FATFS文件系统组件实现SD卡上的文件读写。</p>

<p>开始本篇实验前,需要搭建RT-Thread开发环境,可以参考我之前的帖子:<a href="https://bbs.eeworld.com.cn/thread-1205739-1-1.html">https://bbs.eeworld.com.cn/thread-1205739-1-1.html</a></p>

<p>在HPM6750上使用RT-Thread驱动SD卡实现文件读写只需要三步:</p>

<ul>
        <li>配置FATFS和SDIO功能</li>
        <li>编译项目代码</li>
        <li>烧录二进制到开发板</li>
</ul>

<p>PS:本篇内容特点&mdash;&mdash;实操性强,异常简单,有手就行。</p>

<h2>准备工作</h2>

<h3>准备好开发板和SD卡</h3>

<p>开始本篇实验之前,需要准备一个MicroSD卡,我这里准备的是一个32G的铠侠蓝卡:</p>

<p></p>

<h3>创建RT-Thread项目</h3>

<p>首先,使用RT-Thread Studio创建名为hpm_sdio_test的项目:</p>

<p></p>

<p>注:如果已有RT-Thread项目,则可以跳过此步骤。</p>

<p>&nbsp;</p>

<h2>配置RT-Thread</h2>

<p><em>这里仅以RT-Thread Studio为例,对RT-Thread进行配置。除此之外,使用RT-Thread的Env工具,在命令行环境下进行本节所述的操作也是可以的。</em></p>

<h3>打开FATFS和SDIO组件</h3>

<p>创建项目后,打开RT-Thread Settings,开启FATFS和SDIO配置:</p>

<p></p>

<p>可以看到,打开的组件,图标显示为彩色。这里的SDIO属于RT-Thead驱动框架的SDIO部分。</p>

<p>为了方便观察实验现象,这里最好再打开SDIO组件的调试日志:</p>

<p></p>

<p>图中顶栏的几个部分,对于RT-Thread Studio创建的RT-Thread项目,通常而言:</p>

<ul>
        <li>内核栏中的属于内核组件配置,相关源码位于rt-thread子目录;</li>
        <li>组件栏中的属于系统组件配置,相关源码位于rt-thread/components子目录;</li>
        <li>软件包栏中的属于三方组件配置,相关源码默认不在项目中;在打开相应配置并保存后,才会下载到项目的packages子目录;</li>
        <li>硬件栏中的属于BSP配置,相关源码通常在board子目录;</li>
</ul>

<h3>打开SDIO驱动</h3>

<p>前面打开的仅是SDIO驱动框架,要使用SDIO功能,还需要打开HPM开发板的SDXC驱动:</p>

<p>修改完成,Ctrl+S保存修改。</p>

<p>&nbsp;</p>

<h2>编译、烧录、运行</h2>

<h3>编译项目代码</h3>

<p>完成上面的配置工作后,Ctrl+B编译项目:</p>

<p>编译完成后,可以在控制台看到Flash和RAM占用情况。</p>

<h3>烧录二进制</h3>

<p>编译成功后,我们需要将生成的二进制文件烧录到开发板上。</p>

<p>开始测试之前,我们需要先将MicroSD卡插入开发板(RT-Thread目前还不支持SD卡热插拔):</p>

<p>插入SD卡后,将开发板通过USB线连接到PC。</p>

<p>此时,我们可以看到,正面的SD卡指示灯已经亮起了:</p>

<p></p>

<h3>运行程序</h3>

<p>接着,回到RT-Thread Settings,用Ctrl+Alt+D快捷键,将编译好的二进制文件烧录到开发板上。</p>

<p>烧录完成后,我们就可以在串口终端看到&mdash;&mdash;已经检查到sd卡了:</p>

<p></p>

<p>&nbsp;</p>

<h2>在msh中操作SD卡</h2>

<p>成功烧录前面编译的二进制后,我们就可以在RT-Thread系统上中使用SD卡了。本节我将在串口终端中演示&mdash;&mdash;如何在HPM6750开发板上使用RT-Thread提供的文件系统、目录、文件操作相关命令。</p>

<p>首先,我们可以通过help命令查看此时msh中支持哪些命令:</p>

<p></p>

<p>可以看到,这里有很多命令,我们接下将会使用到的有:</p>

<ul>
        <li>文件操作命令&mdash;&mdash;ls/cp/mv/cat/rm
        <ul>
                <li>可以写文件的命令&mdash;&mdash;echo</li>
        </ul>
        </li>
        <li>目录操作命令&mdash;&mdash;cd/pwd/mkdir</li>
        <li>文件系统操作命名&mdash;&mdash;mkfs/mount/umount/df</li>
</ul>

<p>使用过Linux的朋友应该会对上面这些命令感到熟悉。</p>

<p>接下来,我将会在msh中演示&mdash;&mdash;如何通过这些命令对SD卡进行一些操作。</p>

<p>&nbsp;</p>

<h3>查看块设备</h3>

<p>我们可以在串口终端内使用list_device命令查看设备:</p>

<p>此时,我们可以看到已经有了一个名为&ldquo;sd0&rdquo;的块设备。</p>

<p>&nbsp;</p>

<h3>格式化SD卡</h3>

<p>初次使用的SD卡,可能没有文件系统,或者文件系统不是FAT格式的,需要将SD卡格式化为FAT文件系统,RT-Thread后续才能挂载成功。</p>

<p>**注意:**格式化操作会导致SD卡上已有数据全部丢失;因此,在执行格式化操作前,请确认SD卡上没有重要数据,或者你已对SD卡上的重要数据进行了备份。</p>

<p>接下来,我们可以通过mkfs命令对SD卡进行格式化:</p>

<p>mkfs执行会持续一段时间,请耐心等待(具体因不同SD卡容量和速度等级而异,我的32GB卡消耗了几秒钟)。</p>

<p>&nbsp;</p>

<h3>挂载文件系统</h3>

<p>接下来,我们可以在串口终端内使用mount命令将SD卡挂载到根目录:</p>

<p>这里,我先使用了mount -h查看了mount命令的用法。</p>

<p>另外需要注意的是,fstype参数使用的是elm(这里的elm实际就是FATFS)。</p>

<p>&nbsp;</p>

<h3>简单的文件读写测试</h3>

<p>前面提到echo命令比较特殊,可以写文件,接下来使用echo写文件,cat读文件,ls查看文件:</p>

<p>这里使用了ls、echo、cat命令,进行了文件读写操作。</p>

<p>&nbsp;</p>

<h3>简单的目录操作测试</h3>

<p>接下来,进行简单的目录操作演示。</p>

<p>这里首先使用了pwd查看当前工作目录,然后演示了ls、mkdir、cd命令;</p>

<p>如果你是对RT-Thread了解不多,看到这里可能会非常惊奇&mdash;&mdash;在一个可以运行在单片机的RTOS上,居然可以这么方便的进行文件系统、目录、文件操作。</p>

<p>&nbsp;</p>

<h2>业务代码中使用SD卡</h2>

<p>前面都是使用命令进行相关操作的,实际项目中往往需要在业务代码中使用前面的那些功能,包括文件系统、目录、文件操作。</p>

<h3>使用代码进行相关操作</h3>

<p>所谓&ldquo;授人以鱼不如授人以渔&rdquo;,这里不准备展开介绍前面所有命令行操作如何用代码实现,只介绍如何找到前面那些操作的源码实现。总体来说,主要有两个方法:</p>

<ul>
        <li>grep大法
        <ul>
                <li>grep结合正则表达式进行搜索</li>
                <li>使用其他你熟悉的工具也是可以的</li>
        </ul>
        </li>
        <li>RTFSC(read the f**king source code)
        <ul>
                <li>根据搜索到的位置打开文件并阅读源码</li>
        </ul>
        </li>
</ul>

<p>对,会这两招就可以了(找到之后该干什么不用我说了吧)。</p>

<p>下面以搜索mount命令的实现代码为例进行演示。我们知道RT-Thread的msh命令是通过MSH_开头的宏注册到命令列表中的。因此可以搜索:</p>

<p></p>

<p>接下来,就可以打开./rt-thread/components/finsh/msh_file.c文件,跳转到526进行查看了:</p>

<p>可以看到这里调用了dfs_munt实现了文件系统挂载功能。</p>

<p>&nbsp;</p>

<h2>完善细节</h2>

<h3>使能RTC</h3>

<p>绝大部分文件系统都有文件的创建、修改时间信息,FATFS也不例外。因此,为了能够让SD卡上文件具有正确的创建、修改时间信息正常,建议使用SD卡的同时启用RTC(Real Time Clock)功能。</p>

<p>在RT-Thread系统中,RTC的实现有两种,一种是纯软件方式,另一种是硬件方式。</p>

<p>软件方式的RTC,RT-Thread内核已经有了完整的实现,一般用于没有硬件RTC的设备上(或者硬件RTC驱动还没有支持的情况下)。RT-Thread的硬件RTC,和其他硬件功能类似,有RTC驱动框架和RTC硬件驱动两部分。其中,RTC驱动框架已有RT-Thread内核实现,RTC硬件驱动由厂商实现(一般通过BSP或者CSP提供出来)。</p>

<p>RTC驱动框架的配置项可以通过RT-Thread Settings进行设置:</p>

<p></p>

<p>HPM6750的BSP中已经实现了RTC硬件驱动,我们可以在RT-Thread Settings中设置硬件RTC功能:</p>

<p></p>

<h3>使能网络和NTP&mdash;&mdash;实现联网自动对时</h3>

<p>使能WiFi联网,具体操作参考我此前的帖子:<a href="https://bbs.eeworld.com.cn/thread-1206656-1-1.html">https://bbs.eeworld.com.cn/thread-1206656-1-1.html</a></p>

<p>RT-Thread的netutils软件包种包含了NTP功能,使能NTP功能可以参考帖子中使能netutils软件包中ifconfig相关的介绍。</p>

<p>&nbsp;</p>

<h2>本篇小结</h2>

<p>可以看到,在基于RT-Thread系统的项目中,我们没有添加任何代码,就可以实现对HPM6750开发板上的SD卡进行文件系统、目录、文件相关操作。这是因为RT-Thread系统本身已经积累了大量优秀开发者的工作成果,其中包括SDIO驱动框架、FATFS支持、芯片厂的SDXC驱动。所谓的&ldquo;站在巨人的肩膀上&rdquo;,大概就是这种体验吧。</p>

<p>本篇就到这里了,感谢你的阅读,下次再会。</p>
页: [1]
查看完整版本: 【先楫HPM6750测评】RT-Thread SDIO驱动和文件系统