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

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

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的写入:

完整代码请联系版主               ‘

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

  1. STM32 进阶教程 13 – FLASH的读写操作

    前言 在嵌入式应用开发中,经常会遇到掉电后还要保存的信息,这些信息通常只能保存在外部的一些存储芯片中,如外部flash,外部EEPROM, 其实这些信息同样可以保存在STM32自带的内部flash中, ...

  2. NAND FLASH的读写操作(硬件原理图分析)

    转载:NAND FLASH的读操作及原理 硬件原理 上面是我使用的NAND FLASH的硬件原理图,面对这些引脚,很难明白他们是什么含义,下面直接引用韦东山老师的课程中的提问: NAND FLASH是 ...

  3. 华大单片机HC32L136X单片机flash数据读写操作使用

    此款单片机是由有64K的字节flash,一共有128页,一页有512字节,以下是容量划分: 这里使用的是字节位宽的数据读写操作进行演示,其他2种方式大同小异,需要用到自己去研究,首先需要添加对应的fl ...

  4. STM32 FLASH 简单读写操作【有代码】

    [举报再看养成习惯,噢 不对,点赞再看 养成习惯.感谢支持] STM32的Flash操作分为读写:读写. 一.读操作 读取比较简单,直接指针解引用地址就可以读取.注意一下读取的单位即可 /****** ...

  5. python学习笔记之数据库表的读写操作

    一.executemany()函数 建立数据库mariadb_learn,并且在userinfor表里面写入20个用户的账号和密码信息.代码如下 import pymysql #随机生成20条用户数据 ...

  6. OTA升级-1-通过链表对单片机FLASH进行读写操作

    一.flash读取到链表操作过程: 1.FLASH 读取方法 *(uint32_t *)0x8000000;//读一个字 *(uint8_t *)0x8000000;//读一个字节; *(uint16 ...

  7. 「rust笔记」rust之文件读写操作

    前言 Unix 哲学: "一切皆文件". 它描述了 Unix 的特性–所有输入/输出资源, 如文档, 目录, 硬盘驱动器, 调制解调器, 键盘, 打印机甚至一些进程间和网络通信, ...

  8. QCC300x笔记(0)-- 系列博文索引

    博文索引 QCC300x笔记(1) – QCC3007芯片入门进阶(一) QCC300x笔记(2) – QCC3007芯片入门进阶(二) QCC300x笔记(3) – QCC3007开发调试经验 QC ...

  9. ZYNQ-QSPI Flash读写操作

    学习内容 本文首先介绍Flash和QSPI Flash控制器的相关内容,然后使用 QSPI Flash 控制器,开发板上的 QSPI Flash 进行写. 读操作.通过对比读出的数据是否等于写入的数据 ...

最新文章

  1. 手把手教你上手python库pydbgen(附代码、安装地址)
  2. [转载]Mysql数据库千万级数据处理优化
  3. Java——BigInteger类和BigDecimal类
  4. HTML字体怎么显示,教你如何用CSS来控制网页字体的显示样式
  5. 关于Cocos2d-x的专属数据类型
  6. 语义模型及自然语言处理系统基础算法
  7. hadoop管理命令——fsck
  8. 【Linux】CentOS下vim的配置
  9. swfupload ajax,swfupload ajax无刷新上传图片实例代码
  10. 计算机网络调试+定额,第一章-计算机网络系统设备安装工程-定额.doc
  11. php微信怎么关注公众号,微信如何关注公众号即自动注册登录?
  12. w10计算机网络标志不见了怎么办,Win10系统网络图标不见了怎么办?
  13. MYSQL备份还原失败终极解决方法
  14. python分析报告怎么写_【总结】竞品分析报告撰写的方法
  15. DTL语言学习(四){% spaceless %}、{% autospace %}和{% verbatim %}标签
  16. 【100题】给定入栈序列,判断一个序列是否可能为输出序列
  17. Akka Dispatchers和Routers
  18. 北京新生儿医保办理指南
  19. 文章选题立意新颖的一个简单妙招
  20. 手机6G运行内存和8G运行内存该如何选择?看完觉得买亏了

热门文章

  1. LINQ读书笔记(一)
  2. Tensorrt下的Yolox部署
  3. 网络抓包与HTTP协议
  4. 匈牙利算法和卡尔曼滤波器
  5. c语言xml解析器libxm2
  6. 关于OLTP 和OLAP 干货知识分享
  7. 程序员要如何提升自己的外形?
  8. 物通博联·4G全网通PLC网关(产品)
  9. 阿里云OSS上传及智能图像识别垃圾识别
  10. 基于AT89C52单工串行通信系统设计