嵌入式系统应用-拓展-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. 编译通过没有问题,说明代码移植到工程没有问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/7245.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

408数据结构-树与森林 自学知识点整理

前置知识:树的基本概念与性质 树的存储结构 树既可以采用顺序存储结构,又可采用链式存储结构。但无论采取哪种方式,都要求能够唯一地反映树中各结点之间的逻辑关系。 1. 双亲表示法 这种存储结构采用一组连续空间来存储每个结点&#xff0…

「C++ 内存管理篇 00」指针

目录 一、变量,变量名和指针 1. 什么是变量? 2. 变量名和指针 3. 使用指针获取数据 二、指针变量和数组变量 三、编译器对指针的等级有着严格的检查 四、指针的加减 1. 存放指针的变量的加减 2. 存放指针的变量的自增自减 3. 两个指针相减 一、变量&…

【一步一步了解Java系列】:探索Java基本类型转换的秘密

看到这句话的时候证明:此刻你我都在努力~ 加油陌生人~ 个人主页: Gu Gu Study ​​ 专栏:一步一步了解Java 喜欢的一句话: 常常会回顾努力的自己,所以要为自己的努力留下足迹。 如果喜欢能否点个赞支持一下&#…

内网端口转发与代理

思路:渗透的前提是双方能够建立通信。目前无法和win7建立通信,但是拿到了windows2003的权限,所以可以在Windows2003主机上面建立节点,作为跳板机去访问到内网。 目前状态:控制win2003(IP:192.1…

活动回放 | 如何进行全增量一体的异构数据库实时同步

以 AI领域为代表的新技术不断涌现,新的应用风口也逐渐清晰。为了加紧跟上技术发展的步伐,越来越多的企业开始着手,对仍以传统关系型数据库为主的应用后端进行现代化升级。 这就涉及到如何在不影响并保持现有业务系统正常运转的前提下&#xf…

软件测试产品交付包括哪些内容?

软件测试产品交付通常会包括以下内容: 1. 测试计划:详细的测试方案、测试范围、测试资源与时间安排等内容。 2. 测试用例:包括功能测试用例、性能测试用例、安全测试用例等各类测试用例。 3. 测试环境:包括硬件环境、软件环境、网络环境、数据环境等测试所需要的各种环境。 4. …

LeetCode 面试题 17.14 —— 最小 k 个数

阅读目录 1. 题目2. 解题思路一3. 代码实现一4. 解题思路二5. 代码实现二 1. 题目 2. 解题思路一 第一种方法就是利用快速排序,第一次排序后,数组被划分为了左右两个区间 [ 0 , i ] , [ i 1 , a r r . s i z e ( ) − 1 ] [0, i], [i1, arr.size()-1]…

Docker入门指南:Docker容器的部署(一)

🍀 前言 博客地址: CSDN:https://blog.csdn.net/powerbiubiu 👋 简介 当今软件开发领域中,Docker 成为了一种流行的容器化技术。Docker 可以帮助开发者将应用程序及其依赖项打包到一个独立且可移植的容器中&#xf…

Hibernate 元数据模型(MetaModel)提示类没有找到错误

在进行一次编译的时候,提示下面的错误信息: java: java.lang.ClassNotFoundException: org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor 问题和解决 如果你对 Hibernate 的元数据还是不非常了解的话,请参考文章: JPA 的…

2002-2021年各地区平均受教育年限数据(分性别)(含原始数据+计算过程+计算结果)

2002-2021年各地区平均受教育年限数据(分性别)(含原始数据计算过程计算结果) 1、时间:2002-2021年 2、来源:国家统计局、统计年鉴、各省年鉴 3、指标:行政区划代码、地区、年份、人均受教育年…

C++11,{}初始化,initializer_list,decltype,右值引用,类和对象的补充

c98是C标准委员会成立第一年的C标准,C的第一次更新是C03,但由于C03基本上是对C98缺陷的修正,所以一般把C98与C03合并起来,叫做C98/03; 后来原本C委员会更新的速度预计是5年更新一次,但由于C标准委员会的进…

Linux环境下的事件驱动力量:探索Libevent的高性能I/O架构

hello !大家好呀! 欢迎大家来到我的Linux高性能服务器编程系列之《Linux环境下的事件驱动力量:探索Libevent的高性能I/O架构》,在这篇文章中,你将会学习到Libevent的高性能I/O原理以及应用,并且我会给出源码…

一竞技MSI:淘汰赛抽签结果出炉 BLG和T1同半区,TES首轮交手TL!

北京时间5月6日,MSI在今天进入短暂的休赛,在昨天结束的入围赛之后,PSG战队作为外卡赛区唯一的队伍进入到正赛,另外欧洲赛区的FNC战队也是击败GAM战队拿到正赛的资格。在比赛结束之后,也是进行了淘汰赛的胜败分组赛的抽…

Llama3-Tutorial之LMDeploy高效部署Llama3实践

Llama3-Tutorial之LMDeploy高效部署Llama3实践 Llama 3 近期重磅发布,发布了 8B 和 70B 参数量的模型,lmdeploy团队对 Llama 3 部署进行了光速支持!!! 书生浦语和机智流社区同学光速投稿了 LMDeploy 高效量化部署 Llam…

OpenHarmony实战开发-上传文件

Web组件支持前端页面选择文件上传功能,应用开发者可以使用onShowFileSelector()接口来处理前端页面文件上传的请求。 下面的示例中,当用户在前端页面点击文件上传按钮,应用侧在onShowFileSelector()接口中收到文件上传请求,在此接…

详解xml-java语言

1.XML在线学习手册 XML 教程 2.XML可以做什么 1.给两个程序之间进行数据通信。现在用的最多的是JSON。 2.给服务器做配置文件。 3.存储复杂的数据关系。 4.还可以充当小型的数据库。 3.书写格式 <?xml version"1.0" encoding"UTF-8" ?> <…

使用Gitbook生成电子书

背景 《Google工程实践文档》相对原文Google’s Engineering Practices documentation &#xff0c;部分内容过时了。需要更新中文版&#xff0c;并使用Gitbook把Markdown文件转换成对应的PDF电子书。   上一次生成PDF电子书是5年前&#xff0c;当时生成电子书的环境早已不在…

虚拟键代码

虚拟键代码 虚拟键码 (Winuser.h) - Win32 apps | Microsoft Learn 在Windows操作系统中&#xff0c;虚拟键代码&#xff08;Virtual-Key Codes&#xff09;是一组用来表示键盘上按键的数值。这些代码通常用于Windows API函数&#xff0c;以便程序能够识别和处理键盘输入。 虚拟…

Linux第三节--常见的指令介绍集合(持续更新中)

点赞关注不迷路&#xff01;&#xff0c;本节涉及初识Linux第三节&#xff0c;主要为常见的几条指令介绍。 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&#x1f44d;&#x1f3fb; 收藏 ✨ 加关注&#x1f440; 期待与你共同进步! Linux下基本指令 1. man指令 Linu…

百科词条创建机构有哪些?

在互联网时代&#xff0c;百度百科作为我国最大的中文百科全书&#xff0c;已经成为人们获取知识、查询信息的重要途径。随着百度百科影响力的不断扩大&#xff0c;越来越多的人和企业试图通过创建企业词条来提升自身知名度&#xff0c;企业和个人为了在百度百科上占据一席之地…