合宙Air105

2023-11-14

基础资料

基于Air105开发板:Air105 - LuatOS 文档

上手:开发上手 - LuatOS 文档

探讨重点

官方SFUD库操作-外置flash demo相关内容的学习及探讨。

扩展:

合宙Air103|SDIO (扩展) |LuatOS-SOC接口|官方demo|学习(15-3):SDIO - 文件读写操作_打酱油的工程师的博客-CSDN博客

合宙Air105|fs| io操作(扩展)|io.SEEK_END|io.SEEK_SET|io.SEEK_CUR|LuatOS-SOC接口|官方demo|学习(15-2):fs - 文件系统额外操作_打酱油的工程师的博客-CSDN博客

合宙Air105|fatfs| io操作(扩展)|SPI|可调功放|I2C|SPI|toHex()|os.remove|LuatOS-SOC接口|官方demo|学习(15-1):fatfs文件系统_打酱油的工程师的博客-CSDN博客

​ 参考博文

https://blog.csdn.net/Medlar_CN/article/details/128181736

 软件版本

AIR105:LuatOS@AIR105 base 22.12 bsp V0014 32bit

硬件准备

  • air105开发板
  • SPI FLASH 这里选择W25Q128

软件使用

接口文档可参考:https://wiki.luatos.com/api/sfud.html

​接线方式:

--  接线AIR105--------W25QXX

--[[SPI2_CSN/GPIO19 -- CS

SPI2_MISO/GPIO21 ----- DO

SPI2_MOSI/GPIO20 ----- DI

SPI2_CLK/GPIO18 ----- CLK

           +3.3V ----- VCC

            GND ----- GND]]

demo代码及解析:

    local spi_flash = spi.deviceSetup(2,pin.PB03,0,0,8,10*1000*1000,spi.MSB,1,0)--PB03

    --[[sfud.init(spi_id, spi_cs, spi_bandrate)/sfud.init(spi_device)

    初始化sfud

    参数

    传入值类型   解释

    int spi_id SPI的ID/userdata spi_device

    int spi_cs SPI的片选

    int spi_bandrate SPI的频率

    返回值

    返回值类型   解释

    bool    成功返回true,否则返回false

    ]]

    local ret = sfud.init(spi_flash)

    if ret then

        log.info("sfud.init ok")

    else

        log.info("sfud.init Error")

        return

    end

    --eraseWrite

    --sfud.getDeviceNum() 返回值: int  返回设备总数

    log.info("sfud.getDeviceNum",sfud.getDeviceNum())

    --返回值类型 userdata    成功返回一个数据结构,该结构(flash结构体)无法直接显示,专用于后续的sfud操作。不成功则返回nil

    --userdata可看做为sfud各类操作的基本模板。

    local sfud_device = sfud.getDeviceTable()

    --[[

        sfud.eraseWrite(flash, addr,data)

        先擦除再往 Flash 写数据

        参数

        传入值类型   解释

        userdata    flash Flash 设备对象 sfud.get_device_table()返回的数据结构

        int addr 起始地址

        string  data 待写入的数据

        返回值

        返回值类型   解释

        int 成功返回0

    ]]

    local str="sfud is a little filesystem(lfs)"

    log.info("sfud.eraseWrite",sfud.eraseWrite(sfud_device,1024,str))

    log.info("sfud.read",sfud.read(sfud_device,1024,string.len(str)))

    --[[sfud.mount(flash, mount_point, offset, maxsize)

        挂载sfud lfs文件系统

        参数

        传入值类型   解释

        userdata    flash Flash 设备对象 sfud.get_device_table()返回的数据结构

        string  mount_point 挂载目录名

        int 起始偏移量,默认0

        int 总大小, 默认是整个flash

        返回值

        返回值类型   解释

        bool    成功返回true

    ]]

    log.info("sfud.mount",sfud.mount(sfud_device,"/sfud"))

    --获取文件系统信息,传入值类型string,路径,默认”/”,可选,

    --返回值:boolean获取成功返回true,否则返回false,int,总的block数量;int,已使用的block数量;int,block的大小,单位字节;string,文件系统类型,例如lfs代表littlefs

    -- 打印根分区的信息

    log.info("fsstat", fs.fsstat("/"))  -- I/user.fsstat    true    128 4   4096    lfs

    -- 打印挂载的sfud分区的信息

    log.info("fsstat", fs.fsstat("/sfud")) -- I/user.fsstat true    2048    2   4096    lfs

LOG:

[2023-02-10 23:17:00.867] __y__Z_Remote_Upgrade 441:no ota info

[2023-02-10 23:17:00.867] no bl encrypt

[2023-02-10 23:17:00.867] main 672:bootloader build release Feb  1 2023 20:19:29!

[2023-02-10 23:17:00.867] Jump_AppRun 76:jump to 0x01010400 !



[2023-02-10 23:17:00.876] main 188:APP Build release Feb  9 2023 22:01:02!

[2023-02-10 23:17:00.876] I/main LuatOS@AIR105 base 22.12 bsp V0014 32bit

[2023-02-10 23:17:00.876] I/main ROM Build: Feb 10 2023 20:58:08

[2023-02-10 23:17:00.876] D/main loadlibs luavm 204792 15376 15376

[2023-02-10 23:17:00.876] D/main loadlibs sys   406456 51032 51616

[2023-02-10 23:17:00.876] I/user.main  sfuddemo        1.0.0

[2023-02-10 23:17:00.876] I/sfud Find a Winbond flash chip. Size is 8388608 bytes.

[2023-02-10 23:17:00.876] I/sfud LuatOS-sfud flash device is initialize success.

[2023-02-10 23:17:00.876] I/user.sfud.init ok

[2023-02-10 23:17:00.876] I/user.sfud.getDeviceNum 1

[2023-02-10 23:17:00.944] I/user.sfud.eraseWrite 0

[2023-02-10 23:17:00.944] I/user.sfud.read  sfud is a little filesystem(lfs)

[2023-02-10 23:17:00.944] D/sfud lfs_mount 0

[2023-02-10 23:17:00.944] D/sfud vfs mount /sfud ret 0

[2023-02-10 23:17:00.944] I/user.sfud.mount       true

[2023-02-10 23:17:00.944] I/user.fsstat true 128  4       4096         lfs

[2023-02-10 23:17:00.944] I/user.fsstat true 2048         2       4096         lfs

PS: SFUD (Serial Flash Universal Driver) 串行 Flash 通用驱动库

项目地址: https://github.com/armink/SFUD

SFUD 是一款开源的串行 SPI Flash 通用驱动库。由于现有市面的串行 Flash 种类居多,各个 Flash 的规格及命令存在差异, SFUD 就是为了解决这些 Flash 的差异现状而设计,让我们的产品能够支持不同品牌及规格的 Flash,提高了涉及到 Flash 功能的软件的可重用性及可扩展性,同时也可以规避 Flash 缺货或停产给产品所带来的风险。

  • 主要特点:支持 SPI/QSPI 接口、面向对象(同时支持多个 Flash 对象)、可灵活裁剪、扩展性强、支持 4 字节地址
  • 资源占用
    • 标准占用:RAM:0.2KB ROM:5.5KB
    • 最小占用:RAM:0.1KB ROM:3.6KB
  • 设计思路:
    • 什么是 SFDP :它是 JEDEC (固态技术协会)制定的串行 Flash 功能的参数表标准,最新版 V1.6B (点击这里查看)。该标准规定了,每个 Flash 中会存在一个参数表,该表中会存放 Flash 容量、写粒度、擦除命令、地址模式等 Flash 规格参数。目前,除了部分厂家旧款 Flash 型号会不支持该标准,其他绝大多数新出厂的 Flash 均已支持 SFDP 标准。所以该库在初始化时会优先读取 SFDP 表参数。
    • 不支持 SFDP 怎么办 :如果该 Flash 不支持 SFDP 标准,SFUD 会查询配置文件 ( /sfud/inc/sfud_flash_def.h ) 中提供的 Flash 参数信息表 中是否支持该款 Flash。如果不支持,则可以在配置文件中添加该款 Flash 的参数信息(添加方法详细见 2.5 添加库目前不支持的 Flash)。获取到了 Flash 的规格参数后,就可以实现对 Flash 的全部操作。

sfud - SPI FLASH sfud软件包

已适配 Air101/Air103 Air105 ESP32C3 Air780

备注

本页文档由这个文件自动生成。如有错误,请提交issue或帮忙修改后pr,谢谢!

小技巧

本库有专属demo点此链接查看sfud的demo例子

sfud.init(spi_id, spi_cs, spi_bandrate)/sfud.init(spi_device)

初始化sfud

参数

传入值类型

解释

int

spi_id SPI的ID/userdata spi_device

int

spi_cs SPI的片选

int

spi_bandrate SPI的频率

返回值

返回值类型

解释

bool

成功返回true,否则返回false

例子

--spi

log.info("sfud.init",sfud.init(0,20,20 * 1000 * 1000))

--spi_device

local spi_device = spi.deviceSetup(0,17,0,0,8,2000000,spi.MSB,1,0)

log.info("sfud.init",sfud.init(spi_device))

sfud.getDeviceNum()

获取flash设备信息表中的设备总数

参数

返回值

返回值类型

解释

int

返回设备总数

例子

log.info("sfud.getDeviceNum",sfud.getDeviceNum())

sfud.getDevice(index)

通过flash信息表中的索引获取flash设备

参数

传入值类型

解释

int

index flash信息表中的索引

返回值

返回值类型

解释

userdata

成功返回一个数据结构,否则返回nil

例子

local sfud_device = sfud.getDevice(1)

sfud.getDeviceTable()

获取flash设备信息表

参数

返回值

返回值类型

解释

userdata

成功返回一个数据结构,否则返回nil

例子

local sfud_device = sfud.getDeviceTable()

sfud.chipErase(flash)

擦除 Flash 全部数据

参数

传入值类型

解释

userdata

flash Flash 设备对象 sfud.get_device_table()返回的数据结构

返回值

返回值类型

解释

int

成功返回0

例子

sfud.chipErase(flash)

sfud.erase(flash,add,size)

擦除 Flash 指定地址指定大小

参数

传入值类型

解释

userdata

flash Flash 设备对象 sfud.get_device_table()返回的数据结构

number

add 擦除地址

number

size 擦除大小

返回值

返回值类型

解释

int

成功返回0

例子

sfud.erase(flash,add,size)

sfud.read(flash, addr, size)

读取 Flash 数据

参数

传入值类型

解释

userdata

flash Flash 设备对象 sfud.get_device_table()返回的数据结构

int

addr 起始地址

int

size 从起始地址开始读取数据的总大小

返回值

返回值类型

解释

string

data 读取到的数据

例子

log.info("sfud.read",sfud.read(sfud_device,1024,4))

sfud.write(flash, addr,data)

向 Flash 写数据

参数

传入值类型

解释

userdata

flash Flash 设备对象 sfud.get_device_table()返回的数据结构

int

addr 起始地址

string

data 待写入的数据

返回值

返回值类型

解释

int

成功返回0

例子

log.info("sfud.write",sfud.write(sfud_device,1024,"sfud"))

sfud.eraseWrite(flash, addr,data)

先擦除再往 Flash 写数据

参数

传入值类型

解释

userdata

flash Flash 设备对象 sfud.get_device_table()返回的数据结构

int

addr 起始地址

string

data 待写入的数据

返回值

返回值类型

解释

int

成功返回0

例子

log.info("sfud.eraseWrite",sfud.eraseWrite(sfud_device,1024,"sfud"))

sfud.mount(flash, mount_point, offset, maxsize)

挂载sfud lfs文件系统

参数

传入值类型

解释

userdata

flash Flash 设备对象 sfud.get_device_table()返回的数据结构

string

mount_point 挂载目录名

int

起始偏移量,默认0

int

总大小, 默认是整个flash

返回值

返回值类型

解释

bool

成功返回true

例子

log.info("sfud.mount",sfud.mount(sfud_device,"/sfud"))

log.info("fsstat", fs.fsstat("/"))

log.info("fsstat", fs.fsstat("/sfud"))

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

合宙Air105 的相关文章

  • 如何使用循环将字符串连接成一个?

    有人可以帮我解决字符串连接问题吗 我从寄存器读取数据 它的函数 utf regAddr length 我得到带有十进制数字的表格 然后将其转换为十六进制并循环字符串 我需要将这些字符串连接成一个 Lua中没有像 这样的操作符 functio
  • Corona/Box2D 检测与非移动静态物体的碰撞

    出于发帖原因 这是我正在尝试做的事情的简单版本 在屏幕上我有一个简单的圆形对象 它是静态的并且不会移动 然后用户可以拖放一条直线 如果该线穿过该圆圈 我希望触发碰撞事件 看来除非其中一个物体正在移动 否则永远不会检测到碰撞 绘制线条时能否检
  • 如何访问废弃的函数参数?

    在 Lua 中 调用带有多余参数的函数将简单地丢弃这些参数 有没有可能与debug库来访问这些被丢弃的参数 我不是在寻找可变参数函数 function test local info debug getinfo 1 u print info
  • 十六进制常数 = 格式错误的数字?

    我有一个 Lua 脚本 我试图在其中使用十六进制数字 0x 如果我使用官方 Windows 二进制文件在控制台中运行此脚本 它可以正常工作 但是如果我在我的应用程序中运行它 简单的 dofile 我得到 malformed number n
  • 了解静态链接嵌入式lua环境中lua扩展dll的构建/加载

    我有一个相对复杂的 lua 环境 我试图了解以下内容如何工作 起始设置包括以下两个模块 主要应用 无lua环境 DLL 静态链接到lua lib 包括解释器 该 dll 被加载到主应用程序中 并运行 lua 控制台解释器和可从控制台访问的
  • 循环直到在表中找到 2 个特定值?

    我试图找到一种更聪明的方法来解决这个问题 这是与游戏相关的代码的摘录 它循环遍历每个背包的每个插槽 直到找到铲子和绳子 local continue local foundShovel foundRope for i 0 Container
  • lua_resume 的 from 参数的含义

    From Lua 5 2 参考手册 http www lua org manual 5 2 manual html lua resume int lua resume lua State L lua State from int nargs
  • Kong - 验证上游 ssl(ssl_proxy 打开)

    我已经成功为 API 安装了 kong 网关 该 API 通过上游负载平衡到多个目标 应用程序服务器 现在 我有一个我的应用程序服务器的自签名证书 kong 和目标之间的 ssl 握手应该失败 我推断 kong 不验证上游证书 经过一些研究
  • Lua :: 如何编写加载多个CPU的简单程序?

    我还无法用 Lua 编写一个可以加载多个 CPU 的程序 自从Lua通过协程支持这个概念 http www lua org pil 9 4 html 我相信这是可以实现的 我失败的原因可能是以下之一 这在Lua中是不可能的 我写不出来 an
  • 为什么 LuaJIT 这么好?

    编辑 不幸的是 LuaJIT 已从下面链接的比较中删除 This 比较 http shootout alioth debian org u64 which programming languages are fastest php编程语言的
  • Lua中如何在另一个表的表成员中搜索

    我正在编写一个 lua 程序 它有一个表 该表是另一个表的成员 当我向该成员表添加新日期时 一切正常 但是 当我想在该表中搜索时 无论我给出什么键 我总是会将最后一行添加到表中 如何在该成员表中正确搜索 Stream name functi
  • VB6 - Lua 集成

    我想知道是否有人有任何集成 Lua 和 VB6 的技巧 我正在运行一个小型在线角色扮演游戏 添加一些脚本会很棒 嗯 这是可行的 我曾经为 Lua 5 0 2 做过 但找不到文件 在您拥有的选项中 您可以 将 Lua 封装在公开 Lua AP
  • Lua 将字符串转换为数字 - 取决于语言环境

    刚刚注意到字符串 and tonumber 在 Lua 中是依赖于语言环境的 知道如何在不使用的情况下将字符串转换为数字tonumber 谢谢 例如将字符串 58 5 转换为 58 5 另外 当我尝试将带点的数字传递给函数时 该函数会转换
  • 如何在lua中获取shell脚本的返回码?

    我正在lua中执行一个脚本 os execute sh manager scripts update system sh f 我想获得脚本的输出 如果退出状态为 7 则返回 7 I tried local output os execute
  • 如何通过 C API 在自己的环境中执行不受信任的 Lua 文件

    我想通过调用在其自己的环境中执行不受信任的 lua 文件lua setfenv http pgl yoyo org luai i lua setfenv这样它就不会影响我的任何代码 该函数的文档仅解释了如何调用函数 而不解释如何执行文件 目
  • 在Luasocket中,在什么条件下,即使在select告诉它可以安全读取之后,accept调用也可以阻塞?

    卢阿索基特select http w3 impa br diego software luasocket socket html select函数应该告诉何时可以在不阻塞的情况下读取套接字 它显然也可以用来告诉服务器套接字何时准备好接受新连
  • 如何终止Lua脚本?

    如何终止 Lua 脚本 现在我在 exit 方面遇到问题 我不知道为什么 这更像是一个 Minecraft ComputerCraft 问题 因为它使用了包含的 API 这是我的代码 while true do if turtle dete
  • LuaJ 导入 Lua 方法

    我正在使用 LuaJ 并且我有一个 lua文件充满了一堆函数 如何通过 LuaJ 导入这些函数以在 Java 中使用 一种选择是将文件编译为 Java 代码并导入它 另一种方法是使用可嵌入解释器直接从 Java 代码中调用 Lua 文件 E
  • 关闭 Löve2D 中的抗锯齿功能

    我在用着L ve2D http love2d org用于编写一个小游戏 L ve2D 是 Lua 的开源游戏引擎 我遇到的问题是 当您在非整数位置绘制精灵时 某些抗锯齿过滤器会自动应用于精灵 love graphics draw sprit
  • Lua中有状态迭代器和无状态迭代器的区别

    Lua中无状态和有状态迭代器有什么区别 请详细解释一下 什么时候需要使用无状态 什么时候需要使用另一种 我需要例子来理解这个概念 首先让我们就一个定义达成一致 在 Lua 中 迭代器是function 类似对象 每次调用时都会返回序列中的下

随机推荐

  • 三层架构:软件设计架构

    1 界面层 表示层 用户看的得界面 用户可以通过界面上的组件和服务器进行交互 2 业务逻辑层 处理业务逻辑的 3 数据访问层 操作数据存储文件
  • ---复位现象---GD32 MCU插入SD卡MCU立刻复位

    问题描述 程序运行正常 但是在插入SD卡的瞬间 单片机硬件复位 程序重新运行 之后状态一切正常 可以读取到SD卡 如果上电前插入SD卡 则一切正常 原因 使用示波器测试MCU电源 在SD卡插入瞬间 MCU电源电压跌落到2 5V以下 正常GD
  • 重载输入<<,输出>>,前置和后置++,--运算符

    由于系统给定的输入 lt lt 输出 gt gt 前置和后置 运算符只能处理类似于int float等系统已经定义好的类型的变量 为了能对我们自己定义的类的对象也能进行这些操作 我们就要重载这些运算符 定义一个复数类的对象 class Co
  • 基于OPENCV4的火焰烟雾检测

    现在目标检测主要采用深度学习训练模型 然后采用OPENCV4调用 烟雾火焰检测 采用CAFFE训练一个模型 采用OPENCV4调用 C PYTHON都可以调用 可以加Q 2830025146进行讨论 效果测试在 https download
  • 前端安全

    有哪些可能引起前端安全的问题 跨站脚本攻击 Cross Site Scripting XSS 一种代码注入方式 为了与 CSS 区分所以被称为 XSS 早期常见于网络论坛 起因是网站没有对用户的输入进行严格的限制 使得攻击者可以将脚本上传到
  • 行人重识别数据集汇总

    最近一段时间在做行人重识别方向的研究 行人重识别 Person Re Identification 作为图像识别领域的一个分支 在实际生活中具有极其重要的意义 目前 城市里的用于公共治安领域的摄像头已经大量部署 几乎到了几十米到几百米一个覆
  • Android 11(targetSdkVersion 30)不能获得存储权限的问题和适配指南

    虽然原文说的比较详细了 但我补充一两点 也为了方便自己总结和避坑 Android权限大致可分为三类 普通权限 只需要在清单文件中注册即可 危险权限 需要在代码中动态申请 以弹系统 Dialog 的形式进行请求 特殊权限 需要在代码中动态申请
  • 苹果新iPad创新乏力,中国发售遇冷失宠

    7月20日清晨 北京三里屯苹果店外有点冷清 十几个顾客在门口安静地排着队 曾经活跃的黄牛党没了踪影 守候在一旁的工作人员正在拆除原本打算维持秩序的护栏 如果不是店面上巨大的苹果标志 你恐怕很难把这个场景和苹果新品首发联系在一起 要知道在半年
  • 测试用例入门(三)-使用边界值分析法编写测试用例

    在 软件测试 一书中是这样描述边界值分析法的作用 如果在悬崖峭壁边可以自信 安全的行走而不掉下去 平地就不在话下了 本篇文章中的演示代码均由Python编写 目录 一 边界值分析法概述 二 边界条件的判断 三 边界两侧的判断 四 次边界条件
  • 输入华氏温度输出摄氏温度

    华氏温度转化为摄氏温度 c 5 9 f 32 数据 输入华氏温度 f 输出摄氏温度 c f int input 请输入华氏度 c f 32 5 9 print 6 2f华氏度对应的摄氏度为 6 2f f c 中间出过一点小问题 比如第一行双
  • input标签的类型

    今天学习突然想着input有哪些类型呢 然后就查了下资料 记录一下 1 文本框 type text 2 密码框 type password 3 单选框 type radio 4 复选框 type checkbox 5 图片上传 type f
  • linux切换用户时报错 this account is currently not available

    linux切换用户时报错 this account is currently not available 在安装完redis之后系统创建了一个名叫redis用户 但切换到这个用户的时候却报了错 this account is current
  • 网站怎么创建?

    网站怎么创建 现在很多公司企业都会有自己的网站 即使是没有网站的公司也抓紧时间纷纷入局 希望能在互联网的流量中分到一杯羹 那么网站怎么创建呢 下面给大家简单说一说 网站怎么创建步骤1 首先我们准备好一个域名 一个网站需要有域名才能访问 我们
  • 论文笔记:DEEP DECLARATIVE DYNAMIC TIME WARPING FOREND-TO-END LEARNING OF ALIGNMENT PATHS

    个人感觉 可微DTW的主要优点作为一个损失函数 可以进行梯度反向传播 如果目标只是两个时间序列的相似度 可能不太需要 1 Intro 1 1 背景 DTW 笔记 Dynamic Time Warping 动态时间规整 DTW的python实
  • 寒假训练 第一节 时空复杂度分析

    算法是由若干条指令所组成的的有穷序列 其中每一条指令表示计算机的一个或多个操作 一个好的算法首先要具备正确性 可读性和健壮性 在具备这三个条件后 就应该考虑算法的效率问题 即算法的时间效率和空间效率两方面 时间复杂度 一个算法所需要的运算时
  • windows 搭建ssh服务

    1 官网下载安装包 mls software com 2 点击安装 一直默认即可 3 配置 opensshServer 4 成功登录
  • android6.0源码分析之Camera API2.0下的初始化流程分析

    在文章android源码分析之Camera API2 0简介中 对Camera API2 0的框架以及代码做了简单介绍 本文将基于android6 0源码 分析Camera API2 0下的Camera2内置应用中 对Camera的初始化的
  • umi3 antDesignPro布局layout配置快速搭建项目

    umi3 快速搭建项目 1 环境准备 2 创建项目 3 修改配置 应用antd layout布局 1 安装antd layout插件 2 修改 umirc 文件配置路由 3 根据配置文件中component新建路由对应的组件 1 环境准备
  • c语言中weak的作用

    转载至 https blog csdn net q2519008 article details 82774774 在u boot源码中看到 weak关键字 在移植过程中遇到了问题 用例 weak在不同的环境中用法不同 在stm32源码中也
  • 合宙Air105

    基础资料 基于Air105开发板 Air105 LuatOS 文档 上手 开发上手 LuatOS 文档 探讨重点 官方SFUD库操作 外置flash demo相关内容的学习及探讨 扩展 合宙Air103 SDIO 扩展 LuatOS SOC