rt-thread 之------fal移植

news2025/2/27 11:19:02

rt-thread 之 fal移植


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • rt-thread 之 fal移植
  • 前言
  • 一、fal是什么?
  • 二、移植
    • 1.片内flash fal移植
      • step1:使能`RT-Thread Components--->`中的fal选项,如下图所示:
      • step2:前两项是打开调试log输出和生成fal_cfg.h这两个文件,推荐默认选上,便于调试。
      • step3:使能片上flash操作
      • step 4 save .config文件
      • 如果编译遇到错误需要确认几点:
    • 2. 扩展外部flash
      • step1 配置SPI2的使能
      • step2 配置CS引脚
      • step3 使用env使能SPI代码
      • step4 使能片外flash
      • step5 使能SFUD
      • step6 添加对fal_cfg.h的修改
      • step7 修改 rt_hw_spi_flash_init()
  • 总结


前言


一、fal是什么?

FAL (Flash Abstraction Layer) Flash 抽象层
在这里插入图片描述

从上图可知,fal是对不同的flash设备做出抽象的接口,可以分区管理、读写且支持多块flash。

二、移植

首先在工程目录下打开env,我使用的是野火的模板,开发板是tb随便买的开发板,除了mcu与野火一致,其他外围电路都有些区别所以需要自己调整引脚和修改对应外设芯片。

1.片内flash fal移植

step1:使能RT-Thread Components--->中的fal选项,如下图所示:

在这里插入图片描述

step2:前两项是打开调试log输出和生成fal_cfg.h这两个文件,推荐默认选上,便于调试。

第三个选项是使用SFUD驱动,这是对外部flash操作时需要的,这个可以根据自己需求勾选。
注:生成的fal_cfg.h会在 E:\xxx\stm32f103-fire-arbitrary\board\ports目录下,而不是fal目录下samples/porting目录下的文件(E:\xxx\stm32f103-fire-arbitrary\rt-thread\components\fal\samples\porting)sample只是个例子,供大家参考,后面添加外部flash可以参考。
在这里插入图片描述

step3:使能片上flash操作

否则会缺少开发板对应的flash操作文件E:\xxx\stm32f103-fire-arbitrary\libraries\HAL_Drivers\drv_flash

在这里插入图片描述

使能片上flash后会在工程中添加这些文件中对应的一个。STM32F1就是drv_flash_f1.c

在这里插入图片描述
在这里插入图片描述

step 4 save .config文件

使用pkgs -- update命令下载软件包,env设置自动下载可以省略这一步。最后使用scons --target=mdk5生成keil的工程即可。最后打开工程编译一下,没有报错。

将fal的初始化添加到main()函数中初始化,如下图所示:
在这里插入图片描述
编译重新烧录并且重启一下开发板就可以看到如下打印信息,说明fal移植已经成功了。

在这里插入图片描述

如果编译遇到错误需要确认几点:

  1. 确认step3是否勾选,并且工程中是否有对应的drv_flash_xx.c
  2. 需要确认fal_cfg.h中外部变量stm32_onchip_flash是否和drv_flash_xx.c中定义的stm32_onchip_flash"onchip_flash"是一致的,代码如下:

fal_cfg.h

#ifndef _FAL_CFG_H_
#define _FAL_CFG_H_

#include <rtthread.h>
#include <board.h>

extern const struct fal_flash_dev stm32_onchip_flash;

/* flash device table */
#define FAL_FLASH_DEV_TABLE                                          \
{                                                                    \
    &stm32_onchip_flash,                                             \
}
/* ====================== Partition Configuration ========================== */
#ifdef FAL_PART_HAS_TABLE_CFG

/* partition table */
#define FAL_PART_TABLE                                                                      \
{                                                                                           \
    {FAL_PART_MAGIC_WROD,        "app",   "onchip_flash",       0,          496 * 1024, 0}, \
    {FAL_PART_MAGIC_WROD,        "param", "onchip_flash",       496* 1024 , 16 * 1024, 0},  \
}
#endif /* FAL_PART_HAS_TABLE_CFG */
#endif /* _FAL_CFG_H_ */

drv_flash_f1.c

 const struct fal_flash_dev stm32_onchip_flash = { "onchip_flash", STM32_FLASH_START_ADRESS, STM32_FLASH_SIZE, FLASH_PAGE_SIZE, {NULL, fal_flash_read, fal_flash_write, fal_flash_erase} };
  1. 确认fal.h中引用的fal_cfg.h因为看到有些教程把例程中的fal_cfg.h手动添加到目录中,如果step2勾选了添加fal_cfg.h则会在工程中出现两个fal_cfg.h,而且编译不会报错,所以需要确认最终生效的是哪个fal_cfg.h。建议移除一个fal_cfg.h

2. 扩展外部flash

根据板子原理图配合STMcube软件使能对应SPI,开发板是SPI2和PB12为CS引脚。因为原理图上PB12引脚没有给上拉电阻,且W25Q64这个芯片是低电平选中,所以需要配置默认输出高电平并且给个上拉推挽输出。
在这里插入图片描述

step1 配置SPI2的使能

在这里插入图片描述

step2 配置CS引脚

在这里插入图片描述

step3 使用env使能SPI代码

在这里插入图片描述

step4 使能片外flash

野火的开发板外部flash是挂在SPI1上面的,但是我的开发板是SPI2且CS引脚也不一致,所以到时候修改一下代码。
在这里插入图片描述

step5 使能SFUD

SFUD 是一款开源的串行 SPI Flash 通用驱动库。

SFUD简介链接

在这里插入图片描述

step6 添加对fal_cfg.h的修改

可以参考sample例程中文件修改。

#ifndef _FAL_CFG_H_
#define _FAL_CFG_H_

#include <rtthread.h>
#include <board.h>

extern const struct fal_flash_dev stm32_onchip_flash;
extern struct fal_flash_dev nor_flash0;
/* flash device table */
/* 添加外部flash nor_flash0 */
#define FAL_FLASH_DEV_TABLE                                          \
{                                                                    \
    &stm32_onchip_flash,                                             \
		&nor_flash0,																										 \
}
/* ====================== Partition Configuration ========================== */
#ifdef FAL_PART_HAS_TABLE_CFG
/* 添加分区表 easyflash和download区,这两个区都在外部flash上 */
/* partition table */
#define FAL_PART_TABLE                                                                      \
{                                                                                           \
    {FAL_PART_MAGIC_WROD,        "app",   "onchip_flash",       0,          496 * 1024, 0}, \
    {FAL_PART_MAGIC_WROD,        "param", "onchip_flash",       496* 1024 , 16 * 1024, 0},  \
	{FAL_PART_MAGIC_WORD, 			 "easyflash", FAL_USING_NOR_FLASH_DEV_NAME,         0, 4096*1024, 0}, \
    {FAL_PART_MAGIC_WORD,  			 "download", FAL_USING_NOR_FLASH_DEV_NAME, 				4096*1024, 4096*1024, 0}, \
}
#endif /* FAL_PART_HAS_TABLE_CFG */
#endif /* _FAL_CFG_H_ */

编译和烧录。

step7 修改 rt_hw_spi_flash_init()

在这里插入图片描述
运行结果报错了,原因是野火的外部flash是挂载在spi1上面的,而我的开发板是spi2所以需要对SFUD代码进行修改。这边需要根据实际电路进行修改。
在这里插入图片描述

#include <rtthread.h>
#include "spi_flash.h"
#include "spi_flash_sfud.h"
#include "drv_spi.h"

#if defined(BSP_USING_SPI_FLASH)
static int rt_hw_spi_flash_init(void)
{
    __HAL_RCC_GPIOA_CLK_ENABLE();
    rt_hw_spi_device_attach("spi2", "spi10", GPIOB, GPIO_PIN_12);

    if (RT_NULL == rt_sfud_flash_probe("W25Q64", "spi10"))
    {
        return -RT_ERROR;
    };

    return RT_EOK;
}
INIT_COMPONENT_EXPORT(rt_hw_spi_flash_init);

再次编译烧录,则显示正常加载外部flash。
在这里插入图片描述

总结

rt-thread移植fal库还是挺方便的几乎env使能配置就可以搞定了,只有fal_cfg.h配置文件需要用户根据实际情况去修改。
后续还会在这个基础上出一期easyflash移植的教程。

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

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

相关文章

MySQL查询优化实例

| 导语 通过几个小实例&#xff0c;对实际会经常用到的查询进行对比&#xff0c;通过MySQL的执行计划分析语句的执行性能&#xff0c;最后分析几个在实际中会遇到的小问题。 我们知道一般应用系统的读写比列在10:1左右&#xff0c;而且插入操作和一般的更新操作很少出现性能问…

jenkins的安装与配置(超详细)

Jenkins官网&#xff1a;https://jenkins.io/ 或 https://www.jenkins.io/zh/download/Jenkins官网文档&#xff1a;https://www.jenkins.io/zh/doc/jenkins安装包&#xff1a;http://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat/清华镜像&#xff1a;http://updates.jenkins…

SpringMVC学习篇(六)

SpringMVC之全局异常的处理 1 注解方式 1.1 准备工作 1.1.1 导入springmvc依赖和lombok依赖 <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.22</ve…

Nginx实现四层代理与七层代理

目录 一、实验环境准备 1、准备三台服务器 2、安装nginx环境 3、启动nginx环境 二、设置Nginx七层代理 1、proxy代理服务器配置&#xff08;轮询&#xff09; 2、设置加权轮询 3、健康检测功能 4、解决重复登录问题&#xff08;源地址哈希ip_hash&#xff09; 三、设…

StarRocks从入门到精通系列五:导入数据

StarRocks从入门到精通系列五:导入数据 一、导入总览二、从 Apache Kafka 持续导入三、使用 Apache Spark™ 批量导入四、从 Apache Flink持续导入一、导入总览 下图详细展示了在各种数据源场景下,应该选择哪一种导入方式。 数据导入是指将原始数据按照业务需求进行清洗、…

Springboot常用参数注解

访问路径为http://localhost:8080/ PathVariable GetMapping("/get/{id}/blank/{name}")public Map getValue(PathVariable("id") Integer id,PathVariable("name") String name,PathVariable Map<String,String> kv){Map map new Hash…

在Jeston NX上部署运行PaddleOCR教程(安装whl包方法)

文章目录基本概念介绍1.确定盒子环境pythonCUDAcuDNNTensorRT版本1.1 我还没有安装环境&#xff1a;一步到位整体安装1.2 我已经安装了环境&#xff1a;查询盒子环境版本1.3 默认python版本设置2.安装PaddlePaddle3. 安装PaddleOCR4. 运行例程5. 后续工作附&#xff1a;参考教程…

Java---Arrays类的常用方法

目录 1&#xff1a;Arrays常用的API方法 2&#xff1a;API方法具体举例 &#xff08;1&#xff09;toString方法 &#xff08;2&#xff09;sort方法 &#xff08;3&#xff09;binarySearch方法 &#xff08;4&#xff09;fill方法 &#xff08;5&#xff09;copyOf方法 …

如何在自己的项目中实现脚手架的命令行交互

背景 所在的公司大多数项目都是用Taro脚手架搭建的&#xff0c;因为业务上要实现多端开发 答应我&#xff0c;如果可以千万不要选择跨端开发&#x1f64f;。所以不同环境下运行、打包会有多个命令。如下图所示&#xff1a; 嗯&#xff1f;&#xff1f;好熟悉感觉在哪见过&…

LeetCode刷题(python版)——Topic69. x 的平方根

一、题设 给你一个非负整数 x &#xff0c;计算并返回 x 的 算术平方根 。 由于返回类型是整数&#xff0c;结果只保留 整数部分 &#xff0c;小数部分将被 舍去 。 注意&#xff1a;不允许使用任何内置指数函数和算符&#xff0c;例如 pow(x, 0.5) 或者 x ** 0.5 。 示例 1…

2022年下半年网络规划设计师下午真题及答案解析

1.若系统正在将( )文件修改的结果写回磁盘时系统发生掉电&#xff0c;则对系统的影响相对较大。A.目录 B.空闲块 C.用户程序 D.用户数据 2.采用三级模式结构的数据库系统中&#xff0c;如果对一个表创建聚簇索引&#xff0c;那么改变的是数据库的( )。 A.外模式…

信号(1.信号概念 2.信号的处理方式 3.信号阶段 用户态,内核态)

目录1.临界资源2.临界值3.原子性4.互斥5.什么是信号量6.什么是信号1.信号概念2.信号的处理方式3.信号阶段1.信号使用前&#xff0c;信号的产生2.为什么进程会崩溃3.信号产生中4.信号产生后1.临界资源 被多个进程能够看到看到额资源叫做临界资源 如果没有堆临界资源进任何的保护…

技术分享 | AlertManager 源码解析

作者&#xff1a;石蓓蓓 爱可生研发工程师&#xff0c;主要负责爱可生产品云DMP树产品的研发工作。 本文来源&#xff1a;原创投稿 *爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。 AlertManager 是处理对应用程序的告警的…

ZIP压缩文件的打开密码和自动加密有什么不同?

ZIP是常用的压缩文件格式&#xff0c;对于重要的内容&#xff0c;我们还可以设置密码&#xff0c;从而达到保护文件内容的目的。 通过WinRAR给ZIP文件设置密码保护&#xff0c;可以设置“打开密码”和“自动加密”&#xff0c;那两者有什么不同呢&#xff1f; 设置打开密码是…

【附源码】Python计算机毕业设计万达影院售票管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

图相似度计算——SIMGnn源码解读

在运行代码的时候&#xff0c;需要首先指定参数&#xff0c;--histogram&#xff0c;表示使用直方图特征 1.数据集 数据集我们使用的是AIDS数据集&#xff0c;为内置的数据集&#xff0c;整个数据集大约700张图&#xff0c;每个图少于10个点&#xff0c;每个点由29维的向量组成…

多视角碰撞,探索 Serverless 企业落地更多可能性丨阿里云用户组厦门站

2022 年 9 月 24 日&#xff0c;阿里云在厦门举办了第 12 场阿里云用户组&#xff08;AUG&#xff09;活动&#xff0c;活动主题为“提效降本&#xff0c;Serverless 助力企业快速落地云原生”&#xff0c;吸引了众多技术从业者及企业管理者到场交流。 2009 年&#xff0c;伯克…

油气田工业控制系统现状

石油石化行业综述 石油石化行业分为上游、中游和下游。其中&#xff0c;上游从事的业务包括原油、天然气 的勘探、开发&#xff0c;中游主要是油气 的存储与运输&#xff0c;下游则涵盖炼油、化工、天然气加工等流程型业务及加油站零售等产品配送、销售型业务。通常情况下&…

常用 numpy 函数(长期更新)

文章目录np.where()np.zeros()np.zeros_like()np.divide()np.linalg.norm()np.uint8()np.clip()np.where() np.where有两种用法 np.where(condition,x,y) 当where内有三个参数时&#xff0c;第一个参数表示条件&#xff0c;当条件成立时where方法返回x&#xff0c;当条件不成…

超强功能WebSSH安装,解决Web远程SSH终端

项目地址&#xff1a;https://github.com/huashengdun/webssh 一个简单的 Web 应用程序&#xff0c;用作 ssh 客户端以连接到您的 ssh 服务器。它是用 Python 编写的&#xff0c;基于 tornado、paramiko 和 xterm.js。 特征&#xff1a; 支持SSH密码认证&#xff0c;包括空密…