【开源实战笔记】移植SFUD

举报
LongYorke 发表于 2021/07/31 16:45:03 2021/07/31
【摘要】 前言SFUD 是一款开源的串行 SPI Flash 通用驱动库。由于现有市面的串行 Flash 种类居多,各个 Flash 的规格及命令存在差异, SFUD 就是为了解决这些 Flash 的差异现状而设计,让我们的产品能够支持不同品牌及规格的 Flash,提高了涉及到 Flash 功能的软件的可重用性及可扩展性,同时也可以规避 Flash 缺货或停产给产品所带来的风险。主要特点:支持 SP...

前言

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
  • 越来越多的项目将固件存储到串行 Flash 中,例如:ESP8266 的固件、主板中的 BIOS 及其他常见电子产品中的固件等等,但是各种 Flash 规格及命令不统一。使用 SFUD 即可避免,在相同功能的软件平台基础下,无法适配不同 Flash 种类的硬件平台的问题,提高软件的可重用性;

  • 简化软件流程,降低开发难度。

  • 可以用来制作 Flash 编程器/烧写器

1 CubeMX配置

打开MCU 的SPI5相关引脚。此处使用软件片选,故而disable硬件片选信号

img

img

根据原理图使用PF6作为片选引脚

img

可以在sfud添加好相关宏定义用于移植

img

2 移植sfud

2.1 复制源码到工程中:

img

2.2 在keil中添加 SFUD 头文件路径与组件的源码文件:

img

在CubeMX生成的spi.h的中声明hspi对象

img

2.3 修改SFUD移植接口

sfud_flash_def.h

在SFUD_FLASH_CHIP_TABLE寻找到Flash芯片型号。

如果使用的Flash型号既不支持SFDP,也不在此Flash设备参数表中,那么就需要手动添加到该设备参数表中才可以正常使用。

img

sfud_cfg.h

填写相关枚举与宏。因为事例工程所使用的芯片STM32F429IG并没有QSPI功能,可以注释掉。

如果Flash型号支持SFDP,可以注释SFUD_USING_SFDP。可以减少需要编译的代码量。

img

img

img

sfud_port.c

该文件是面向应用的接口文件,是移植过程中的重点。

此处以STM32F429IG裸机工程为例进行移植示范

①此处添加了include “config.h”,config.h中添加了include “spi.h”
②调整spi_user_data中的spi成员的数据类型为HAL库的spi数据类型
③设置spi上锁,裸机工程中是关闭中断,RTOS中是关闭调度

img

④配置spi_write_read()读写函数

注意要添加代码段:while (HAL_SPI_GetState(spi_dev->hspix) != HAL_SPI_STATE_READY);

判断SPI回到准备状态才拉高片选电平

img

定义spi5对象配置相关引脚

img

此处添加case SFUD_W25Q256FV_DEVICE_INDEX

img

config.h中include了spi.h sfud.h stm32f4xx.h

img

3 使用sfud

初始化sfud

img

示例代码:

/*****************************w25qxx example****************************************/
char w25qxx_test_string[6][128]={
	"***************************Copyright (c)***************************",
	"**----------------------Hello World !!! -------------------------**",
	"** Thanks to armink:https://github.com/armink/SFUD               **",
	"** reference:                                                    **",
	"** https://mculover666.blog.csdn.net/article/details/105516371   **",
	"*******************************************************************"
};
//w25qxx_test测试
void w25qxx_test(void)
{
	int i;
	char sBuff[256]={0};
    const sfud_flash *flash = sfud_get_device_table() + 0;
	

	for(i=0;i<6;i++)
	{
		sfud_erase_write(flash, 0, strlen(w25qxx_test_string[i]),(uint8_t *)w25qxx_test_string[i]);
	    sfud_read(flash, 0, strlen(w25qxx_test_string[i]),(uint8_t *) sBuff);
	    printf("%s\n",sBuff);	
	}

}

4 测试

img

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。