为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.csdn.net/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。
参考帖子中对这块的代码描述可能不大准确。