【开源实战笔记】移植SFUD
前言
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硬件片选信号
根据原理图使用PF6作为片选引脚
可以在sfud添加好相关宏定义用于移植
2 移植sfud
2.1 复制源码到工程中:
2.2 在keil中添加 SFUD 头文件路径与组件的源码文件:
在CubeMX生成的spi.h的中声明hspi对象
2.3 修改SFUD移植接口
sfud_flash_def.h
在SFUD_FLASH_CHIP_TABLE寻找到Flash芯片型号。
如果使用的Flash型号既不支持SFDP,也不在此Flash设备参数表中,那么就需要手动添加到该设备参数表中才可以正常使用。
sfud_cfg.h
填写相关枚举与宏。因为事例工程所使用的芯片STM32F429IG并没有QSPI功能,可以注释掉。
如果Flash型号支持SFDP,可以注释SFUD_USING_SFDP。可以减少需要编译的代码量。
sfud_port.c
该文件是面向应用的接口文件,是移植过程中的重点。
此处以STM32F429IG裸机工程为例进行移植示范
①此处添加了include “config.h”,config.h中添加了include “spi.h”
②调整spi_user_data中的spi成员的数据类型为HAL库的spi数据类型
③设置spi上锁,裸机工程中是关闭中断,RTOS中是关闭调度
④配置spi_write_read()读写函数
注意要添加代码段:while (HAL_SPI_GetState(spi_dev->hspix) != HAL_SPI_STATE_READY);
判断SPI回到准备状态才拉高片选电平
定义spi5对象配置相关引脚
此处添加case SFUD_W25Q256FV_DEVICE_INDEX
config.h中include了spi.h sfud.h stm32f4xx.h
3 使用sfud
初始化sfud
示例代码:
/*****************************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 测试
- 点赞
- 收藏
- 关注作者
评论(0)