嵌入式系统应用-拓展-FLASH之操作 SFUD (Serial Flash Universal Driver)之KEIL移植

本文主要是介绍嵌入式系统应用-拓展-FLASH之操作 SFUD (Serial Flash Universal Driver)之KEIL移植,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1 SFUD介绍

1.1 初步介绍

SFUD 是一个开源的串行 SPI 闪存通用驱动库。由于市面上有各种类型的串行闪存设备,每种设备都具有不同的规格和指令,因此 SFUD 的设计目的是解决这些差异。这使得我们的产品可以支持不同品牌和规格的闪存,增强了软件功能的重用性和可扩展性。此外,它有助于减轻闪存供应短缺或产品停产的风险。

代码连接如下:源码连接

所以选择flash只要采用spi或者qspi通讯的SPI, 通过这个通用driver。

同事需要注意问题是:主控芯片的RAM: 0.2KB ROM: 5.5KB 尽量在这个以上,基本上市场上常见的主流芯片都可以支持。

1.2 支持 SFDP 标准的flash

SFDP 全程是Serial Flash Discoverable Parameter。通过一套标准的内部参数表。这些参数表可以由主机系统软件查询,以调整以适应多个供应商的不同特性。
该标准规定每个闪存中都将有一个参数表,其中存储着闪存规格参数,如闪存容量、写入粒度、擦除命令和地址模式等。目前,除了一些制造商的旧款闪存不支持这一标准外,其他新工厂生产的大多数闪存都已支持 SFDP 标准。因此,在初始化过程中,库将首先读取 SFDP 表参数

1.3 不支持 SFDP 标准的flash

如果闪存不支持 SFDP 标准,SFUD 将查询配置文件(/sfud/inc/sfud_flash_def.h)中提供的闪存参数信息表,以查看是否支持该闪存。如果不支持,则可以在配置文件中添加该闪存的参数信息。

1.4 为什么选择SFDP

避免因闪存断货、闪存停产或产品扩展而引起的项目风险。越来越多的项目将固件存储在串行闪存中,例如:ESP8266固件、主板BIOS以及其他常见电子产品的固件等。然而,各种闪存规格和指令并不统一。
使用SFUD可以避免不能适应不同类型的基于同一功能软件平台的闪存硬件平台的问题,提高软件的可重用性,简化软件流程,减少开发难度。
现在只需配置SPI通信,即可自由玩转串行闪存,也可用于制作闪存编程器/写入器。

2 SFUD 如何使用

2.1 选择合适的flash

以下flash 已经经过测试的,更到flash型号,要去看原有github上面介绍

型号 制造商 容量 最高速度 SFDP 标准 QSPI 模式 备注
W25Q40BV Winbond 4Mb 50Mhz 不支持 双线 已停产
W25Q80DV Winbond 8Mb 104Mhz 支持 双线
W25Q16BV Winbond 16Mb 104Mhz 不支持 双线 by slipperstree
W25Q16CV Winbond 16Mb 104Mhz 支持 未测试
W25Q16DV Winbond 16Mb 104Mhz 支持 未测试 by slipperstree
W25Q32BV Winbond 32Mb 104Mhz 支持 双线
W25Q64CV Winbond 64Mb 80Mhz 支持 四线
W25Q128BV Winbond 128Mb 104Mhz 支持 四线

2.2 基本结构体介绍

先说明下本库主要使用的一个结构体 sfud_flash 。其定义位于 /sfud/inc/sfud_def.h。每个 SPI Flash 会对应一个该结构体,该结构体指针下面统称为 Flash 设备对象。初始化成功后在 sfud_flash->chip 结构体中会存放 SPI Flash 的常见参数。如果 SPI Flash 还支持 SFDP ,还可以通过 sfud_flash->sfdp 看到更加全面的参数信息。以下很多函数都将使用 Flash 设备对象作为第一个入参,实现对指定 SPI Flash 的操作。

2.2.1 初始化设备

sfud_err sfud_init(void)

2.2.2 初始化指定的 Flash 设备

sfud_err sfud_device_init(sfud_flash *flash)

2.2.3 获取 Flash 设备对象

sfud_flash *sfud_get_device(size_t index)

2.2.4 读取数据

sfud_err sfud_read(const sfud_flash *flash, uint32_t addr, size_t size, uint8_t *data)

2.2.5 擦除flash数据

sfud_err sfud_erase(const sfud_flash *flash, uint32_t addr, size_t size)

2.2.6 擦除全部数据

sfud_err sfud_chip_erase(const sfud_flash *flash)

2.2.7 写入数据

sfud_err sfud_write(const sfud_flash *flash, uint32_t addr, size_t size, const uint8_t *data)

参数 描述
flash Flash 设备对象
addr 起始地址
size 从起始地址开始写入数据的总大小
data 待写入的数据

2.2.8 先擦除再往 Flash 写数据

注意:擦除操作将会按照 Flash 芯片的擦除粒度(详见 Flash 数据手册,一般为 block 大小。初始化完成后,可以通过 sfud_flash->chip.erase_gran 查看)对齐,请注意保证起始地址和擦除数据大小按照 Flash 芯片的擦除粒度对齐,否则执行擦除操作后,将会导致其他数据丢失。

sfud_err sfud_read_status(const sfud_flash *flash, uint8_t *status)

3 SFUD库的移植到KEIL工程中

3.1 下载源码

可以从github上面下载,也可以从这里下载。

3.2 文件夹介绍

  1. demo 文件是参考代码
  2. docs 是文档说明
  3. 里面源代码
    在这里插入图片描述

3.3 移植文件

  1. 把SFUD的代码移植到你的工程下面;

  2. 添加源文件;
    在这里插入图片描述

  3. 添加头文件路径;
    在这里插入图片描述

  4. 编译通过没有问题,说明代码移植到工程没有问题。

这篇关于嵌入式系统应用-拓展-FLASH之操作 SFUD (Serial Flash Universal Driver)之KEIL移植的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/966139

相关文章

System类获取系统属性

package com.zhong; import java.util.Properties; /**  *   * @author zhong  *  */ public class SystemPropertyTest {          public static void main(String[] args) {         //启动脚本传递参数         if(args

Spark的应用场景有哪些?

Spark 是一种与 Hadoop 相似的开源集群计算环境,是专为大规模数据处理而设计的快速通用的计算引擎,现已形成一个高速发展应用广泛的生态系统,主要应用场景如下:   1. Spark是基于内存的迭代计算框架,适用于需要多次操作特定数据集的应用场合。需要反复操作的次数越多,所需读取的数据量越大,受益越大,数据量小但是计算密集度较大的场合,受益就相对较小;   2. 由于RDD的特性,Spa

Apache Shiro对web应用的支持-08

Apache Shiro for Web Applications 虽然Apache Shiro旨在用于保护任何基于JVM的应用程序,但它最常用于保护Web应用程序。它极大地简化了基于简单URL模式匹配和过滤器链定义来保护Web应用程序的方式。除了Shiro的API之外,Shiro的Web支持还包括一个丰富的JSP标记库来控制页面输出。 特征 简单的ShiroFilter web.xml定

嵌入式C和汇编混合编程规则——ATPCS规则

ATPCS规则  为了使单独编译的C语言程序和汇编程序之间能够相互调用,必须为子程序之间的调用规定一定的规则.ATPCS就是ARM程序和THUMB程序中子程序调用的基本规则。 一.ATPCS概述 ATPCS规定了一些子程序之间调用的基本规则.这些基本规则包括子程序调用过程中寄存器的使用规则,数据栈的使用规则,参数的传递规则.为适应一些特定的需要,对这些基本的调用规则进行一些修改得到几种不

Android_02_在内部或外部存储中读写文件的操作

前言:  Ram内存:运行内存,相当于电脑的内存  Rom内存:内部存储空间,相当于电脑的硬盘 sd卡:外部存储空间,相当于电脑的移动硬盘 1>在内部存储中读写文件 代码示例如下: package com.itheima.rwinrom;import java.io.BufferedReader;import java.io.File;import java.io.File

有懂discuz的吗?我需要在我自己的系统注册一个账号的时候,也把当前注册的账号放在discuz的用户里面。应该怎么做呀。需要discuz和java的接口吗?需要更改哪些东西。

discuz-ucenter_api_for_java 有懂discuz的吗?我需要在我自己的系统注册一个账号的时候,也把当前注册的账号放在discuz的用户里面。应该怎么做呀。需要discuz和java的接口吗?需要更改哪些东西。 所有的代码 1.UC.java package com.fivestars.interfaces.bbs.api;import java.io.IO

java流操作对文件的分割和合并

学习文件的输入输出流,自己做一个小的示例,对文件进行分割和合并。     下面是代码: <span style="font-size:14px;">package com.dufy.file;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import

Kali:系统安装之后进行所需配置

apt设置源 由于官网的源需要墙或者想使用国内的源,可以修改source.list vi /etc/source.list 打开文件并修改为其他可用的源地址,以下可供参考 deb http://ftp.sjtu.edu.cn/debian wheezy main non-free contribdeb-src http://ftp.sjtu.edu.cn/debian wheezy ma

现成轮子OSAL操作系统抽象层的移植

简单介绍一下Z-STACK中的OSAL,值得一看的现成轮子; 什么是 OSAL? 今天同学忽然问我有没有搞过OSAL,忽然间一头雾水,于是在搜索引擎上找到了答案,发现这是一个十分实用的东西。 OSAL(operating system abstraction layer),操作系统抽象层,是一种以实现多任务为核心的系统资源管理机制,实现了类似RTOS的某些功能,但并不能称之为真正意义上的RT

状态机的三种骚操作,值得你了解

点击上方“小麦大叔”,选择“置顶/星标公众号” 福利干货,第一时间送达 大家好,我是小麦,这次我们一起来学习C语言实现状态机的三种方法解析。 状态机的实现无非就是 3 个要素:状态、事件、响应。转换成具体的行为就 3 句话。 发生了什么事?现在系统处在什么状态?在这样的状态下发生了这样的事,系统要干什么? 用 C 语言实现状态机主要有 3 种方法:switch—case 法、表格驱动法、函数指针