为micropython启用文件系统(2)

本文介绍了在Micropython上启用FATFS文件系统的过程,涉及HAL_SDIO和SD卡读写代码的配置,以及oofatfs的移植。在keil中调试驱动和文件系统操作后,将代码整合到Micropython。关键步骤包括在main()中初始化VFS,实现open()函数,并正确使用fs_user_mount_t和mp_vfs_mount_t结构体。虽然参考帖子的部分内容已过时,但通过研究和实验,成功实现了文件系统的启用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为micropython启用文件系统(2)

进入micropython代码目录之前

首先,要准备一些代码SDIO驱动、SD卡读写代码、fatfs的移植。

  • 在lib/mm32f3270/mm32/drivers 目录下放置hal_sdio.h/.c文件,SDIO HAL驱动
  • 在ports/mm32/boards/MB_F3270 目录下放置sdcard_sdio.h/c文件,SD卡访问函数
  • 在ports/mm32/boards/MB_F3270 目录下创建fatfs_port.c,完成oofatfs的移植
  • 更新ports/mm32/boards/MB_F3270 目录下的pin_init.c和clock_init.c,配置SD卡需要使用的引脚复用功能和时钟。

特别注意,新增加的文件还好在makefile中登记一下才能编译到系统中,同时需要登记的还有micropython代码仓库中已经存在但未编译在最小系统中的一些文件,详见下节说明。

考虑到在micropython代码量比较大,调试比较麻烦,我是在keil中用example project单独把芯片驱动代码和SD卡读写读写操作的程序都调试好之后再迁移到micropython中。

fatfs_port.c中仅仅实现get_fattime()函数。这个函数是oofatfs创建或者修改文件时给文件添加时间戳的,读文件用不到。如果以后在micropython中加入硬件RTC的驱动程序,可以在此处读取当前的时间。大多数情况下,oofatfs对时间戳没要求,支持RTC还需要硬件电路的支持,配套一块纽扣电池,板子做得也不小巧,想想还是算了吧,写个假时间确保代码能编译通过就好。

#include "py/runtime.h"
#include "lib/oofatfs/ff.h"

DWORD get_fattime(void) 
{
    // TODO: Implement this function. For now, fake it.
    return ((2016 - 1980) << 25) | ((12) << 21) | ((4) << 16) | ((00) << 11) | ((18) << 5) | (23 / 2);
}

参考了一篇帖子

此时参考了一篇帖子,介绍如何在micropython中启用文件系统的。

找到代码注入种子(接入micropython的代码入口):
https://blog.youkuaiyun.com/weixin_43624808/article/details/101550511

按照帖子实际操作了一下,不能用。作者发帖用的micropython版本可能比较老,有很多代码在v1.6上已经不适用了,文字描述内容可能也只是给自己操作做一个记录,不大适合阅读求解。但我反复阅读下来之后也大概摸清了一个思路:

  • micropython中虽然已经包含fatfs的代码,但不是直接在disk_io.c中直接添加SD卡的读写函数,而是要先SD卡的读写函数注册到VFS(Virtual File System)中,要填充一些结构体,对应打开一些宏编译选项开关。
  • 必须要实现open()函数。micropython会用open()函数打开文件并读取import模块的代码。

帖子里没说明的是,还需要在main()函数执行一些初始化操作才能把文件系统用起来。我在比对着帖子看手头的v1.6代码,定位到nrf和stm32的main.c中对vfs的初始化调用。nrf的代码版本可能比较老,stm32持续保持更新,这里有两个点要注意:

  • fs_user_mount_t结构体的定义更新了,原来直接挂在vfs下的很多属性字段,例如type、readblocks[]、writeblocks[]等,现在都挂在blockdev字段上,然后才挂在vfs
  • 注意在main()中正确使用fs_user_mount_t和mp_vfs_mount_t。

参考帖子中对这块的代码描述可能不大准确。

### MicroPython 使用 SDIO 接口连接 MicroPython 提供了丰富的外设接口支持,其中包括对SD卡的支持。对于特定于SDIO接口的操作,在某些平台上如ESP32确实存在相应的库函数来实现初始化和数据传输操作[^1]。 当涉及到具体使用SDIO接口时,通常需要先完成必要的硬件配置工作,比如确保SD卡座正确焊接并连线到处理器对应的SDIO引脚组上。接着是在软件层面调用相应API来进行设备枚举、总线频率设定以及读写命令发送等动作。然而需要注意的是,并不是所有的MicroPython端口都实现了完整的SDIO协议栈;这取决于底层固件开发者的选择。 针对ESP32平台而言,可以利用`sdcard`模块配合指定参数以启用SDIO模式而非默认的SPI模式: ```python from machine import Pin, SDCard # 创建SDCard对象实例,这里假设已经按照官方指南完成了物理连接 sd = SDCard(slot=3) # slot编号依据实际使用的MCU而定,请查阅对应资料确认 vfs = os.VfsFat(sd) os.mount(vfs, '/sd') print('文件系统挂载成功') with open('/sd/test.txt', 'w') as f: f.write('Hello world!\r\n') ``` 上述代码片段展示了如何创建一个基于SDIO接口工作的SD卡实例,并将其作为FAT文件系统挂载至路径`/sd`下,之后就可以像操作本地存储那样对该介质上的文件执行各种I/O操作了。不过这段例子假定了读者能够找到适合自己所用开发板的具体slot值设置方法——这一点往往记录在各个移植版本的手册里[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值