跳转至

little_flash文件系统(Air780EPM不支持)

一、演示功能概述

1.1 Little_flash 介绍

little_flash 是 LuatOS 的 SPI Flash 驱动库,将 SPI Flash 挂载为 lfs 文件系统,支持 NAND/NOR Flash,提供统一 API,简化设备存储扩展与驱动开发。

1.2 教程概述

实现使用 Air780EHM 核心板对 SPI FLASH 来挂载成 lfs 文件系统,并通过文件系统相关接口去操作 lfs 文件系统中的文件,并演示文件的读写、删除、追加等操作

二、准备硬件环境

参考:硬件环境清单第二章节内容,准备以及组装好硬件环境。

准备一块 Air780EHM 核心板:点击购买

SPI_FLASH 模块:

本次教程使用的是 W25Q32,此模块可在淘宝店购买 luat.taobao.com。

组装好如图所示:

三、准备软件环境

烧录工具:Luatools 工具

Air780EHM 烧录需要的固件和脚本文件:

LuatOS 运行所需要的 lib 文件:

使用 Luatools 烧录时,勾选 添加默认 lib 选项,使用默认 lib 脚本文件

四、软硬件资料

4.1 API 接口介绍

37 little_flash - 合宙模组资料中心

17 fs - 合宙模组资料中心

4.2 Air780EHM 与 SPI_FLASH 接线指示

Air780EHM核心板
SPI_FLASH
GND(任意)
GND
VDD_EXT
VCC
GPIO8/SPI0_CS
CS,片选
SPI0_SLK
CLK,时钟
SPI0_MOSI
DI,主机输出,从机输入
SPI0_MISO
DO,主机输入,从机输出

五、代码示例介绍

5.1 代码介绍

--[[
@module  main
@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑
@version 1.0
@date    2025.07.01
@author  孟伟
@usage
本demo演示的功能为:
实现使用Air780EHM核心板将spi_flash挂测成lfs文件系统,并演示lfs文件系统中的文件的读写、删除、追加等操作。
]]

--[[
必须定义PROJECT和VERSION变量,Luatools工具会用到这两个变量,远程升级功能也会用到这两个变量
PROJECT:项目名,ascii string类型
        可以随便定义,只要不使用,就行
VERSION:项目版本号,ascii string类型
        如果使用合宙iot.openluat.com进行远程升级,必须按照"XXX.YYY.ZZZ"三段格式定义:
            X、Y、Z各表示1位数字,三个X表示的数字可以相同,也可以不同,同理三个Y和三个Z表示的数字也是可以相同,可以不同
            因为历史原因,YYY这三位数字必须存在,但是没有任何用处,可以一直写为000
        如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
]]
PROJECT = "little_flash_demo"
VERSION = "001.000.000"
-- 在日志中打印项目名和项目版本号
log.info("main", PROJECT, VERSION)

--添加硬狗防止程序卡死
if wdt then
    wdt.init(9000)--初始化watchdog设置为9s
    sys.timerLoopStart(wdt.feed, 3000)--3s喂一次狗
end

-- 如果内核固件支持errDump功能,此处进行配置,【强烈建议打开此处的注释】
-- 因为此功能模块可以记录并且上传脚本在运行过程中出现的语法错误或者其他自定义的错误信息,可以初步分析一些设备运行异常的问题
-- 以下代码是最基本的用法,更复杂的用法可以详细阅读API说明文档
-- 启动errDump日志存储并且上传功能,600秒上传一次
-- if errDump then
--     errDump.config(true, 600)
-- end

-- 使用LuatOS开发的任何一个项目,都强烈建议使用远程升级FOTA功能
-- 可以使用合宙的iot.openluat.com平台进行远程升级
-- 也可以使用客户自己搭建的平台进行远程升级
-- 远程升级的详细用法,可以参考fota的demo进行使用

-- 启动一个循环定时器
-- 每隔3秒钟打印一次总内存,实时的已使用内存,历史最高的已使用内存情况
-- 方便分析内存使用是否有异常
-- sys.timerLoopStart(function()
--     log.info("mem.lua", rtos.meminfo())
--     log.info("mem.sys", rtos.meminfo("sys"))
-- end, 3000)

--加载little_flash应用模块
require "little_flash"

-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!
--[[
@module  little_flash
@summary little_flash测试功能模块
@version 1.0
@date    2025.07.01
@author  孟伟
@usage
本demo是 Air780EHM + spi_flash. 以 Air780EHM核心板为例, 接线如下:

Air780EHM            SPI_FLASH
GND(任意)            GND
VDD_EXT              VCC
GPIO8/SPI0_CS        CS,片选
SPI0_SLK             CLK,时钟
SPI0_MOSI            DI,主机输出,从机输入
SPI0_MISO            DO,主机输入,从机输出
]]
--使用spi0,cs接在gpio8上
local spi_id,pin_cs = 0,8
function little_flash_func()
    sys.wait(1000)
    log.info("lf", "SPI", spi_id, "CS PIN", pin_cs)
    --以对象的方式初始化spi_flash
    spi_flash = spi.deviceSetup(spi_id,pin_cs,0,0,8,20*1000*1000,spi.MSB,1,0)
    log.info("lf", "spi_flash", spi_flash)
    little_flash_device = lf.init(spi_flash)   --初始化 little_flash
    if little_flash_device then
        log.info("lf.init ok",little_flash_device)
    else
        log.info("lf.init Error")
        return
    end

    if lf.mount then
        --挂载 little_flash lfs文件系统
        local ret = lf.mount(little_flash_device,"/little_flash")
        log.info("lf.mount", ret)
        if ret then
            log.info("little_flash", "挂载成功")
            --获取lfs文件系统信息
            log.info("fsstat", fs.fsstat("/little_flash"))

            -- 挂载成功后,可以像操作文件一样操作
            --以写模式打开文件,并返回文件句柄,io接口含义可参考lua5.3手册https://wiki.luatos.com/_image/lua53doc/contents.html
            local f = io.open("/little_flash/test", "w")
            local write_str = os.date()
            log.info("/little_flash/test文件写入数据",write_str)
            --写入当前时间到文件中
            f:write(write_str)
            --关闭文件
            f:close()
            --读取文件内容并打印
            local read_str = io.readFile("/little_flash/test")
            log.info("little_flash", read_str)
            if write_str == read_str then
                log.info("写入测试成功,写入字符串与读出字符串一样")
            else
                log.info("写入测试失败,写入字符串与读出字符串不一样")
            end

            -- 文件追加
            --文件追加测试写入之前先删除一下
            os.remove("/little_flash/test2")
            --将"LuatOS"字符串写入到test2文件中
            io.writeFile("/little_flash/test2", "LuatOS-")
            --以追加的方式打开test2文件
            local f = io.open("/little_flash/test2", "a+")
            local time_str = os.date()
            f:write(time_str)
            write_str = "LuatOS-"..time_str
            log.info("/little_flash/test2文件写入数据",write_str)

            --关闭文件
            f:close()
            read_str = io.readFile("/little_flash/test2")
            log.info("little_flash", read_str)
            if write_str == read_str then
                log.info("追加测试成功,写入字符串与读出字符串一样")
            else
                log.info("追加测试失败,写入字符串与读出字符串不一样")
            end
        else
            log.info("little_flash", "挂载失败")
        end
    end
end
--创建并且启动一个task
--运行这个task的主函数little_flash_func
sys.taskInit(little_flash_func)

5.2 功能测试

通过日志可以看到,lfs 文件系统挂载成功,lfs 的文件系统中的文件读写、追加、删除等操作都可正常运行

六、总结

至此,我们已经用 Air780EHM 核心板演示了 将 spi_flash 挂载为文件系统的功能,演示了挂载的过程,以及文件的文件读写、追加等操作。