QCC300x笔记(5) -- 外部Flash的读写操作

2023-11-16

哈喽大家好,这是该系列博文的第五篇~ 篇~


<<【系列博文索引】快速通道 >

1.    QCC300X 外部Flash的读写
        QCC300x是使用外部Flash片子,使用外部flash的好处就是成本下来了,大家都知道,CSR的片子一直是很贵的,这样的片子就只能对成本要求不高的项目优先,在使用外部Flash时,我们一般默认使用32M(因为官方配置就是这个参数,会让使用方便的多),然而我们在使用过程往往使用不了这么大的空间,现在我们就利用起来,一起来学习对外部Flash的应用。

        1.1.    为外部flash分区
            要对外部Flash使用,必先是对外部Flash进行分区,上一节做Upgrade时有对分区文件说明,即XXX.ptn文件。
          需要注意的是外部的Flash可以作为两种用途使用,一种是只读的文件系统,另一种是未处理的连续数据分区(Raw Serial),只读的文件系统是对于代码,语音文件,用户文件等保存于Flash中,但是这个需要以文件的形式打包写入,在代码中不可以被修改,仅仅可以读取。
        未处理的连续数据分区,就是纯粹的Flash数据,在程序中可以写入和读取。

        使用文件系统时我们需要挂载分区,使用Raw Serial分区时 不需要挂载分区。

        我们想实现一个在Flash中的数据写入和读取,所以Flash在原来的分区下添加一个Raw Serial分区:

        0, 8K, PS, (none) # For PS Store
        1, 32K, RO, i1107e_patch_bundle.xuv # Logical #0 : For DSP & firmware patches #0,1
        2, 32K, RO, (erase) # Logical #0 : For DSP & firmware patches #0,2
        3, 612K, RO, (erase) # Logical #1 Audio prompts #1,1
        4, 612K, RO, (erase) # Logical #1 Audio prompts #1,2
        5, 300K, RO, i1107e.xuv # Logical #2 Main application image and other files. #2,1
        6, 300K, RO, (erase) # Logical #2 Main application image and other files. #2,2
        7, 8K, RO, system_i1107e.xuv # Logical #3 PSFS  #3,1
        8, 8K, RO, (erase) # Logical #3 PSFS #3,2
        9, 8K, RS, (erase) 
        10, 8K, RS, (erase) 
        11, *, RS, (erase)
        即添加分区9和10,大小为8K,分区类型是RS(Raw Serial),(erase)每次下载重新擦除。

        需要说明一下,这个分区文件涉及下载软件Xide.exe的下载流程,新添加的分区尽量填写每次下载擦除,否则会影响下载,
        我之前有调试过使用(none)会导致下载有很久的卡顿,导致下载时间超长。

        1.2.    Flash写入数据
        Flash在分好区后就可以读写了,Flash的读写也是一个流的概论,写入需要获取一个Sink,读取需要获取一个Source ,需要注意的是Flash在没有数据时是读取不到数据的,直接读取未写入数据的Flash会是空。

        1.2.1.    获取Flash的Sink
        获取Sink的方法,ADK提供了两个函数,可以获取Flash的Sink,分别是
        Sink StreamPartitionOverwriteSink(partition_filesystem_devices device,
        uint16 partition) 
        Sink StreamPartitionResumeSink(partition_filesystem_devices device,
        uint16 partition,uint16 first_word); 

        可以在Partition 和Stream的代码文件中找到。

        第一个函数重新写入Flash,获取的Sink写入后会覆盖之前写入的数据。

        第二个函数是再次写入Flash。第三个参数是需要写入的起始地址,如果Sink中已经存在数据,可以使用
        uint32 PartitionSinkPosition(Sink sink)函数来获取已经存在的Flash数据大小

        partition_filesystem_devices :是选择分区文件的类型,我们需要选择Flash
        Partition:这个参数就是我们分区时分的分区号,就是XXX.ptn文件中添加的9或10分区号。

        1.2.2.    设置Flash的写入配置
        Flash在写入是需要设置其写入配置,配置需要如下函数设置:
        bool PartitionSetMessageDigest(Sink sink, partition_message_digest_type md_ty, uint16 *data, uint16 len) 
        这个函数可以设置Flash的配置,
        sink: The sink that is writing to the partition
        md_type: The type of message digest:
            PARTITION_MESSAGE_DIGEST_APP_SIGNATURE: Signed with the application DFU key (see note)
            PARTITION_MESSAGE_DIGEST_CRC: Filesystem CRC
            PARTITION_MESSAGE_DIGEST_SKIP: Do not perform verification
        data: pointer to the message digest
        len: length of message digest. 2 for CRC verification, 66 for signature verification 

        1.2.3.    获取Flash的状态
        这一步不是必要的,我们在操作Flash,如果需要查看看状态可使用:
        bool PartitionGetInfo(partition_filesystem_devices device, uint16 partition,partition_info_key key, uint32 *value) 

        参数说明:
        device: The device to query. Set to PARTITION_SERIAL_FLASH to query the serial flash device.
        partition: The number of the partition to query.
        key: The type of information requested:
            PARTITION_INFO_IS_MOUNTED: Whether a partition is mounted or not (1 = mounted, 0 = unmounted).
            PARTITION_INFO_SIZE: The size of the partition in words.
            PARTITION_INFO_TYPE: The type of the partition (0 = unused, 1 = filesystem, 2 = PS Store).
        value: The pointer to return the query result to 

        1.2.4.    写入Flash数据
        写入数据是最后的一步,但是没有前面的铺垫,是不能写入成功的,我们得到的分区Sink,就是我们写入数据入口。

        拿到Sink后,我们不能盲目写入,可以使用SinkSlack(Sink sink),查看一下Sink可以写入的最大数据量,我测试过程中获取到的是48,说明Flash每次最大只能写入48个字符,如果我们需要大量写入,可以分批写入数据。

        数据写入:
        第一步:使用SinkMap(Sink sink) 获取一个指针;SinkClaim(Sink sink ,uint16 extra) 声明一下写入的大小,为了检查能否写入,如果返回0xFFFF,说明不能写入。

        第二步:使用memcpy() 把需要写入的数据搬运到SinkMap()指针指向的地址上,

        第三步:使用SinkFlush(Sink sink uint6 amount)实现Flash的真正写入。

        第四步:使用SinkClose(Sink sink)关闭Sink
        需要注意的是:
        1,Sink写入数据后,如果需要读取,必先使用第四步关闭Sink才能读取,但是使用SinkClose()关闭Sink后,不能再次对Flash写入,需要使用重启写入函数对Flash重启写入。
        2,如果需要多次分批写入Flash,不要SinkClose()关闭Sink,完全写入完成后,再关闭Sink,关闭后,再次写入Flash失效,需要重新覆盖写入,

        3,Sink再次写入时,需要重新获取Sink,获取的Sink偏移需要PartitionSinkGetPosition函数获取即可。

        如果上面的步骤没有出错,恭喜你,你的Flash数据写入成功。

        1.2.5.    Flash写入程序附录
        示例代码只是初步演示:

        Flash的写入:        

完整代码请联系版主               ‘

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

QCC300x笔记(5) -- 外部Flash的读写操作 的相关文章

  • Oracle 按创建时间排序,如果创建时间为空,将记录放置在最后

    oracle处理方式 在oracle中字段为空值时 被认为为最大 可通过 nulls last 将空值放到最后 语法 select from 表名 order by 排序字段 desc nulls last 实战 select from u
  • win10操作系统瘦身之微信减肥法

    很多人发现 win 10的系统盘空间一直在减少 甚至到跳出空间不足红色警告 但是又不知道哪里出问题 系统盘的容量到底被什么给吃了 所以今天就说说系统瘦身中 很管用的一个方法 减少微信的历史记录法 首先看下微信软件某个目录的空间占用情况 图1
  • 给自己的逆向工程阶段性学习感想总结

    想到哪写哪 逆向工程的学习比起近似的pwn来说 还是没那么吃基础的 不过基础知识和能力的牢固程度还是近乎决定了一个re手的上限 自己在这方面还是欠缺了不少 目前最吃亏的一个方面是代码分析能力 或者说算法能力 或者说正向能力 发现在做中难题的
  • Unity3D:角色拾取技术

    工程包下载 Unity3D虚拟现实开发之角色拾取 这个是成品图 角色拾取的原理是 由摄像机与屏幕上鼠标点击的位置确定一条射线 由此射线射向3D世界 最先和此射线相交的物体就是被选中的物体 然后对该物体的操控编写对应的代码即可 具体代码如下
  • 【python基础知识】21.高效偷懒的正确打开方式-毕业篇

    文章目录 前言 明确项目目标 分析过程 拆解项目 逐步执行 代码实现 版本1 0 输入表头 确定模版数据 阶段2 获取 复用模版数据 阶段3 0 写入csv文件 结语 前言 光阴似箭 日月如梭 不知不觉我们来到了Python基础语法课的最后
  • springboot项目启动报错:java.io.EOFException: null

    springboot项目启动时报 java io EOFException null异常 但是不影响功能 可能原因是由于tomcat上次非正常关闭时有一些活动session被持久化 表现为一些临时文件 在重启时 tomcat尝试去恢复这些s
  • ARM(IMX6U)裸机汇编LED驱动实验——驱动编写、编译链接起始地址、烧写bin文件到SD卡中并运行

    参考 Linux之ARM IMX6U 裸机汇编LED驱动实验 驱动编写 作者 一只青木呀 发布时间 2020 08 07 09 13 48 网址 https blog csdn net weixin 45309916 article det
  • Masm for Winodws 集成实验环境安装绿色免费版

    Masm for Winodws 集成实验环境安装绿色免费版 用于汇编的开发环境 绿色安全下载途径 希望能帮到有需要的人 不喜勿喷 提取文件后解压后 打开文件下载安装即可 百度网盘下载 链接 https pan baidu com s 1U
  • notepad++ 配置 python 以及Anaconda中的python(已解决)

    说明 无论是自己的电脑单独安装的python 还是Anaconda虚拟环境安装的python都是一样的 区别就是 独立安装的python 的exe文件路径添加的环境变量了 不需要制定它的路径直接运行下面的命令就可以 而Anaconda中的p
  • 常用js

    1 去掉字符串两端的空格 对字符串去两端空格 function stringTrim str if str null str undefined return null 用正则表达式将前后空格 用空字符串替代 return str repl
  • win10中不同版本jdk切换

    1 设置系统变量 java home8 java home8 以及java home 2 若无法切换jdk版本 可以在系统变量path中 删除默认路径 3 测试版本切换是否成功 一定要重启cmd
  • 使用mongodb数据库+node.js封装接口详细过程

    学习内容 使用mongodb存储数据 用node语言编写后端 学习产出 下载mongoose依赖包 npm install mongoose 创建一个js文件 keys js 文件写入路径配置 模块入口 module exports mon
  • python(六)——函数

    函数 函数 定义函数 传递实参 位置实参 关键字实参 形参默认值 缺省参数 多值参数 多值参数拆包 返回值 使用默认值让实参变为可选 通过容器返回多个变量 通过列表返回 元组返回多个返回值 函数的注释 模块 模块的定义 导入特定的函数 给导
  • 修改maven的默认镜像为阿里镜像

    在maven的配置文件中 默认的镜像仓库地址为 http repo maven apache org maven2 该地址下载jar包速度慢一些 这里可以修改为阿里的镜像仓库地址 http maven aliyun com nexus co

随机推荐

  • Node.js 版本管理工具 n 使用指南

    Node js 版本更新很快 目前 node v20 x 已经发布 我们在使用时避免不了会需要切换不同的 Node js 的版本来使用不同版本的特性 所以就出现了像 windows 上的 nvm MacOS 上的 n 工具 本文就介绍一下如
  • super class java_Java中的getGenericSuperclass的基本用法

    通过getGenericSuperclass方法可以获取当前对象的直接超类的Type 使用该方法可以获取到泛型T的具体类型 package cn tzz lang clazz public class User private Intege
  • IDEA查询项目中未被使用的代码

    IDEA查询项目中未被使用的代码 IDEA内置的很多功能非常强大 通过analyze分析功能 可以实现根据自己需求来检索未使用的内容 步骤如下 在弹出的输入框中 输入undeclared 然后选择下拉框中箭头指向内容 双击 下图中的选择方式
  • XML中的转义

    在XML中 有一些符号作为XML 的标记符号 一些特定情况下 属性值必须带有这些特殊符号 下面主要是讲解一些常用的特殊符号的处理 例一 双引号的使用 双引号作为XML 属性值的开始结束符号 因此无法在值中直接使用 处理方式可以分为两种 a
  • 时间序列分析全集-python3

    文章目录 1 导言 1 1 基本定义 1 2 预测评估指标 2 移动 平滑 评估 2 1 滑动窗口估计 2 1 1 moving average 2 1 2 weighted average 2 2 指数平滑 2 2 1 exponenti
  • U盘安装CentOS7

    官网找到CentOS7的ISO镜像 CentOS 7 x86 64 DVD 2207 02 iso 大小4 42G 准备一个8G的U盘 格式化 然后通过UltraISO工具将ISO镜像写入到U盘 接着开机启动U盘 华硕是按esc键 选择in
  • pip install 快速下载和安装包的方法

    一个 快速下载和安装包的方法 转载自他人 见下面链接 输入指令 pip default timeout 100 install 库名称 i http pypi douban com simple trusted host pypi doub
  • 在geany中使用中文注释

    geany中使用中文注释如果不加以特别说明会报错误 像这样 只需在首行指定编码格式 就可以愉快使用中文注释了 coding utf 8 coding utf 8 magicians alice david altman for magici
  • 通俗易懂的RNN

    目录 一 什么是RNN 二 为什么要发明RNN 三 RNN的基础知识 1 循环核介绍 2 循环核按时间步展开 3 记忆体 4 循环计算层 5 TF描述循环计算层 二 RNN的补充知识 1 RNN梯度消失的原因 一 什么是RNN RNN Re
  • 字符大全

    icon a m1 爱心符号 心形符号 扑克符号 1 m2 笑脸符号 2 gt c m3 商标符号 版权符号大全 3
  • Android TextView加载带有多张图片的HTML,并且解决图片造成的OOM

    版权声明 本文为博主原创文章 未经博主允许不得转载 转载请注明本文出自 renxhui 的博客 http blog csdn net qq 34760508 article details 70146189 请尊重他人的辛勤劳动成果 谢谢
  • 区块链能否开启人工智能金融2.0时代?

    随着人们对区块链技术地不断探索挖掘 区块链在金融领域的应用也是越来越多 其对传统金融机构的影响也越来越深 人们越来越期望能够利用区块链开启人工智能金融2 0时代 这将对银行业的再造与重构产生颠覆性的结果 随着全球区块链技术峰会的频繁举办 这
  • 获取任意月份天数

    获取月份天数 import java text ParseException import java text SimpleDateFormat import java util Calendar public class demo2 pu
  • 下载安装VMware,centos7,创建虚拟机一条龙

    1 vmware下载安装 1 阿里云盘下载 VMware workstation full 16 exe https www aliyundrive com s zxRkiiJnzmN 提取码 91mh 2 安装 双击exe 修改安装位置到
  • Stable diffusion模型种类说明

    1 基础模型 pruned是完整版模型 emaonly是剪枝版模型 如果想要训练自己的模型 需要下载完整的大模型 1 SD系列 sd v1 4 sd v1 5 sd v2之类的 都是stable diffusion自带的大模型 效果会比较差
  • 刷脸支付服务商红利市场不容错过

    相比当下流行的扫码支付 刷脸支付更便捷 资金流动更安全 且还有马云 马化腾多次亲自站台宣传 想不火都难 目前 与刷脸相关的网络热度词包括刷脸支付 手机扫码 消费者 人工智能 花钱等等 通过这些关联词也说明了一个问题 刷脸支付在落地方面取得了
  • MYSQL给选中结果添加赋予行号row number

    SELECT r r 1 rank a from SELECT from mytable WHERE 1 a SELECT r 0 b
  • IDEA通过git回滚到某个提交节点或某个版本

    1 项目右键后 点击 Git Show History 这里会显示有历史提交的版本记录 这里我们假设要回滚到 提交 版本中 2 选中 提交 右键Copy Revision Number 3 回到项目 右键 Git Repository Re
  • [carla入门教程]-6 小项目:基于carla-ros-bridge构建一个小型比赛赛道

    本专栏教程将记录从安装carla到调用carla的pythonAPI进行车辆操控并采集数据的全流程 带领大家从安装carla开始 到最终能够熟练使用carla仿真环境进行传感器数据采集和车辆控制 第六节 基于carla ros bridge
  • QCC300x笔记(5) -- 外部Flash的读写操作

    哈喽大家好 这是该系列博文的第五篇 篇 lt lt 系列博文索引 快速通道 gt 1 QCC300X 外部Flash的读写 QCC300x是使用外部Flash片子 使用外部flash的好处就是成本下来了 大家都知道 CSR的片子一直是很贵的