开发前准备

  • 硬件平台:nxp rt10xx单片机
  • IDE: Keil
  • spi设备驱动框架已经搭建完毕(本章使用spi2,flash挂载在该位置)

SFUD 简介

SFUD 全称 Serial Flash Universal Driver,是一款开源的串行 SPI Flash 通用驱动库。由于现有市面的串行 Flash 种类居多,各个 Flash 的规格及命令存在差异, SFUD 就是为了解决这些 Flash 的差异现状而设计,让我们的产品能够支持不同品牌及规格的 Flash,提高了涉及到 Flash 功能的软件的可重用性及可扩展性,同时也可以规避 Flash 缺货或停产给产品所带来的风险。

1.SFUD 在 rt-thread 组件中位置

sfud组件在如下路径,README部分有它的详细说明:

2.Env环境menuconfig配置

打开Env进入RT-Thread Components -> Device Drivers目录,选择如下:

3.工程中添加SFUD

文件:spi_flash_sfud.c sfud.c sfud_sfdp.c 及相关头文件

4.应用功能测试

底层IO初始化,注意我们的Flash挂载的位置,本章暂时用的spiqspi测试

     IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_07_LPSPI2_SCK, 0U); // IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_06_LPSPI2_PCS0, 0U);  IOMUXC_GPIO_SD_B1_06_GPIO3_IO06IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_08_LPSPI2_SD0, 0U); IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_09_LPSPI2_SDI, 0U); IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B1_07_LPSPI2_SCK, 0x10B0u);// IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B1_06_LPSPI2_PCS0, 0x10B0u);IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B1_08_LPSPI2_SD0, 0x10B0u);IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B1_09_LPSPI2_SDI, 0x10B0u);

方法一,代码中挂载 W25Q128的块设备,然后执行数据读:

static int hw_spiflash_init(void)
{int result = RT_EOK;rt_hw_spi_device_attach("spi2", "spi20", GET_PIN(3, 6));if(RT_NULL == rt_sfud_flash_probe("W25Q128","spi20")){rt_kprintf("probe fail w25q\r\n");return -RT_ERROR;}/*根据spi设备名称,查询挂载的SFUD Flash设备*/h_sfud_flash = rt_sfud_flash_find("spi20");    if(RT_NULL == h_sfud_flash){rt_kprintf("not find W25Q128\r\n");return -RT_ERROR;    }rt_kprintf("spi flash name is %s \n",h_sfud_flash->name);h_sfud_flash = rt_sfud_flash_find_by_dev_name(h_sfud_flash->name);   if(RT_NULL == h_sfud_flash){rt_kprintf("not find flash devie \n");}sfud_read(h_sfud_flash,0,sizeof(readBuf),readBuf);return result;
}

方法二,命令行操作:

实际就只需要spi2总线关联上 spi20 设备就行了,如下代码:

rt_hw_spi_device_attach("spi2", "spi20", GET_PIN(3, 6));

FAL简介

FAL (Flash Abstraction Layer) Flash 抽象层,是对 Flash 及基于 Flash 的分区进行管理、操作的抽象层,对上层统一了 Flash (框架图如下所示)

1.Env环境menuconfig配置

打开Env进入RT-Thread ComponentsFAL有如下选项(本章将FAL和SFUD直接关联了,所以全部选上):

参考文件夹:rt-thread->components->fal->samples->porting里面有相关内容,我们将fal_cfg.hfal_flash_sfud_port.c文件分别拷贝到上上级目录的inc和src中,等会儿修改相关内容

注:rt10xx不同于stm32,用户代码部分,很多只有外挂片外rom(flash,sd卡,emmc)启动(非bootrom官方固化好的片内rom代码)。

2.工程中添加FAL组件

文件:fal.c fal_flash.c fal_partition.c fal_rtt.c fal_flash_sfud_port.c

3.修改fal_cfg.h和fal_flash_sfud_port.c

fal_cfg.h 主要就是填写分区表的一些信息,内容如下:

分区结构体:

/*** FAL partition*/
struct fal_partition
{uint32_t magic_word;/* partition name */char name[FAL_DEV_NAME_MAX];/* flash device name for partition */char flash_name[FAL_DEV_NAME_MAX];/* partition offset address on flash device */long offset;size_t len;uint32_t reserved;
};
typedef struct fal_partition *fal_partition_t;
#ifndef _FAL_CFG_H_
#define _FAL_CFG_H_#include <rtthread.h>
#include <board.h>/* enable SFUD flash driver sample */
#define FAL_FLASH_PORT_DRIVER_SFUDextern struct fal_flash_dev flash_w25q;/* flash device table */
#define FAL_FLASH_DEV_TABLE                                          \
{                                                                    \&flash_w25q,                                                     \
}
/* ====================== Partition Configuration ========================== */
#ifdef FAL_PART_HAS_TABLE_CFG
/* partition table */
#define FAL_PART_TABLE                                                                                              \
{                                                                                                                   \{FAL_PART_MAGIC_WROD, "bootloader",    FAL_USING_NOR_FLASH_DEV_NAME,                                    0,       256 * 1024, 0}, \{FAL_PART_MAGIC_WROD, "app",           FAL_USING_NOR_FLASH_DEV_NAME,                           256 * 1024,       768 * 1024, 0}, \{FAL_PART_MAGIC_WROD, "preset",        FAL_USING_NOR_FLASH_DEV_NAME,                        (1024) * 1024,       512 * 1024, 0}, \{FAL_PART_MAGIC_WROD, "img",           FAL_USING_NOR_FLASH_DEV_NAME,                  (1024 + 512) * 1024,  7 * 1024 * 1024, 0}, \{FAL_PART_MAGIC_WROD, "filesystem",    FAL_USING_NOR_FLASH_DEV_NAME,       (1024 + 512 + 7 * 1024) * 1024,  7 * 1024 * 1024, 0}, \
}
#endif /* FAL_PART_HAS_TABLE_CFG */
#endif /* _FAL_CFG_H_ */

修改文件内容:fal_flash_sfud_port.c,将sfudfal关联,函数数据等注册到fal_flash_dev结构体中

/**************************************************START OF FILE*****************************************************//*------------------------------------------------------------------------------------------------------------------
Includes
*/
#include <fal.h>#ifdef FAL_FLASH_PORT_DRIVER_SFUD
#include <sfud.h>
#include <spi_flash_sfud.h>#ifndef FAL_USING_NOR_FLASH_DEV_NAME
#define FAL_USING_NOR_FLASH_DEV_NAME             "W25Q128"
#endif/*------------------------------------------------------------------------------------------------------------------
Functions
*/
static int init(void);
static int read(long offset, uint8_t *buf, size_t size);
static int write(long offset, const uint8_t *buf, size_t size);
static int erase(long offset, size_t size);static sfud_flash_t h_sfud_dev = NULL;
struct fal_flash_dev flash_w25q =
{ .name     = FAL_USING_NOR_FLASH_DEV_NAME, .addr     = 0, .len      = (16 * 1024 * 1024), .blk_size = 4096, .ops      = {init, read, write, erase},.write_gran = 1
};static int init(void)
{if(RT_NULL == rt_sfud_flash_probe(FAL_USING_NOR_FLASH_DEV_NAME,"spi20")){rt_kprintf("probe fail w25q\r\n");return -RT_ERROR;}#ifdef RT_USING_SFUD/* RT-Thread RTOS platform */h_sfud_dev = rt_sfud_flash_find_by_dev_name(FAL_USING_NOR_FLASH_DEV_NAME);
#else/* bare metal platform */extern sfud_flash sfud_norflash0;h_sfud_dev = &sfud_norflash0;
#endifif (NULL == h_sfud_dev){return -1;}/* update the flash chip information */flash_w25q.blk_size = h_sfud_dev->chip.erase_gran;flash_w25q.len = h_sfud_dev->chip.capacity;return 0;
}static int read(long offset, uint8_t *buf, size_t size)
{sfud_read(h_sfud_dev, flash_w25q.addr + offset, size, buf);return size;
}static int write(long offset, const uint8_t *buf, size_t size)
{if (sfud_write(h_sfud_dev, flash_w25q.addr + offset, size, buf) != SFUD_SUCCESS){return -1;}return size;
}static int erase(long offset, size_t size)
{if (sfud_erase(h_sfud_dev, flash_w25q.addr + offset, size) != SFUD_SUCCESS){return -1;}return size;
}#endif /* FAL_FLASH_PORT_DRIVER_SFUD *//****************************************************END OF FILE*****************************************************/

4.应用功能测试

1.底层IO初始化,参考前面2.SPI BUS总线连接 SPI设备
rt_hw_spi_device_attach("spi2", "spi20", GET_PIN(3, 6));3.调用fal初始化函数
fal_init();4.操作 struct fal_flash_dev flash_w25q 结构体,实现读写操作等等
flash_w25q.ops.read(0,readBuf,sizeof(readBuf));

或者省略步骤4,执行命令行操作:

【RT-Thread】nxp rt10xx SFUD和FAL组件搭建与使用相关推荐

  1. rt thread 使用FAL遇到fal_init() undefined reference

    rt thread FAL 0.5版,之前有没有不知道,遇到一个坑. 在main.cpp里面已经 #include <fal.h> fal_init() 编译报错,说 fal_init() ...

  2. rt thread studio使用QBOOT和片外flash实现OTA升级

    我们这里要使用单片机外部flash作为OTA的下载分区,外部flash硬件连接关系 PB3-->SPI3_CLK PB4-->SPI3_MISO PB5-->SPI3_MOSI PE ...

  3. stm32f407单片机rt thread 片外spi flash OTA升级配置示例

    参考地址https://www.rt-thread.org/document/site/application-note/system/rtboot/an0028-rtboot/ 第一步,生成Boot ...

  4. RT-Thread FAL 组件使用

    RT-Thread FAL 组件使用 FAL 组件开源项目地址:https://gitee.com/RT-Thread-Mirror/fal/tree/master FAL 组件是 RT-Thread ...

  5. Yeelink平台使用——远程控制 RT Thread + LwIP+ STM32

    1.前言     [2014年4月重写该博文]     经过若干时间的努力终于搞定了STM32+LwIP和yeelink平台的数据互通,在学习的过程中大部分时间花在以太网协议栈学习上,但是在RT Th ...

  6. 【RT-Thread】nxp rt10xx 设备驱动框架之--adc搭建和使用

    ADC(Analog-to-Digital Converter) 指模数转换器.将模拟电压信号转换成数字信号,通常ADC接口会连接一些传感器,如:温度传感器:陀螺仪加速度计:电位器等等. 开发前准备 ...

  7. 关于RT thread系统节拍时钟的配置

    关于RT thread系统节拍时钟的配置                  -----本文基于rt-thread-3.1.3版本编写 首先,使用RTthread OS时,要配置(或者明白)它的系统节拍 ...

  8. RTthread的FAL组件介绍

    RTthread的FAL组件介绍 文章目录 RTthread的FAL组件介绍 前言 一.FAL组件下载安装及配置 二.FAL组件使用 1.分区介绍 2.数据处理函数 向分区写入数据 从分区读取数据 擦 ...

  9. RT Thread Free Modbus移植问题整理

    RT Thread Free Modbus移植问题整理 问题描述: 在读写寄存器中,写数据正常,只能读1个寄存器的值,多个值会异常. 在移植过程中发现串口(或RS485)数据接收长度异常. 一.环境描 ...

最新文章

  1. 被捞起的“海底数据中心”,故障率仅为陆地1/8,微软新型数据存储模式又有新进展...
  2. 企业dns 服务器的搭建
  3. 《深入理解Java虚拟机》读后总结(一)JVM内存模型
  4. Nginx 禁止访问某个目录或文件的设置方法
  5. python公式_Python读取excel文件中带公式的值的实现
  6. java ios压缩图片,Java、ios图片上传
  7. 李迟2022年3月工作生活总结
  8. 记一次PHP服务器500错误的解决方法
  9. [渝粤教育] 中国地质大学 大学英语(3) 复习题
  10. 要尊重员工的正当权益
  11. 项目报告制作-中型无盘网吧
  12. 遗传算法框架deap简介与使用
  13. “24岁,一门手艺,年入百万”:真正厉害的人,都做到了这4件事
  14. 十字链表画法——蓝墨云班课实践改错
  15. 荣耀“打倒华为”第一机
  16. TEACH_NLP——开篇
  17. 计网必会:HTPP详解(非常全面)、cookie、缓存
  18. 告别传统机房:3D 机房数据可视化实现智能化与VR技术的新碰撞
  19. 什么是 HTTP cookie?
  20. IEC61850中涉及到的逻辑节点(LN)所代表的含义

热门文章

  1. 前端html页面中的命名规范
  2. 鱼子单位换算器v1.0.1 - 跨物理量单位换算器
  3. vcg函数值_几个经典的数学库之一学习---VCGlib(2)
  4. php intersect,PHP中的array_intersect()函数
  5. IDEA创建maven项目没有srcmainjava目录问题解决
  6. 如何在公司建立好一个较为完整的固定资产设备台账
  7. 什么是SRRC?流程是什么?申请需要哪些资料?
  8. win10神州网信V2022版本,登录微软账号
  9. zabbix使用web界面监控本机
  10. 机房一体化监测解决方案