rt-thread ------fal移植
系列文章目录
rt-thread 之 生成工程模板
文章目录
- 系列文章目录
- 前言
- 一、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移植已经成功了。
如果编译遇到错误需要确认几点:
- 确认step3是否勾选,并且工程中是否有对应的
drv_flash_xx.c
- 需要确认
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} };
- 确认
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移植的教程。
rt-thread ------fal移植相关推荐
- rt thread 使用FAL遇到fal_init() undefined reference
rt thread FAL 0.5版,之前有没有不知道,遇到一个坑. 在main.cpp里面已经 #include <fal.h> fal_init() 编译报错,说 fal_init() ...
- RT Thread Free Modbus移植问题整理
RT Thread Free Modbus移植问题整理 问题描述: 在读写寄存器中,写数据正常,只能读1个寄存器的值,多个值会异常. 在移植过程中发现串口(或RS485)数据接收长度异常. 一.环境描 ...
- 正点原子delay函数移植到rt thread操作系统(HAL库)
正点原子教程中涉及到的操作系统只涉及了UCOS的教程,其中例程的system文件夹中的delay.c函数只是适配了UCOS. 下面将delay.c函数移植到rt thread中,使用的bsp是rt t ...
- rt thread studio使用QBOOT和片外flash实现OTA升级
我们这里要使用单片机外部flash作为OTA的下载分区,外部flash硬件连接关系 PB3-->SPI3_CLK PB4-->SPI3_MISO PB5-->SPI3_MOSI PE ...
- Yeelink平台使用——远程控制 RT Thread + LwIP+ STM32
1.前言 [2014年4月重写该博文] 经过若干时间的努力终于搞定了STM32+LwIP和yeelink平台的数据互通,在学习的过程中大部分时间花在以太网协议栈学习上,但是在RT Th ...
- RT Thread根据开发板制作BSP方法
之前一直不懂怎么使用RT Thread的软件包,感谢网上的大神,看了你们的博客后大概了解一些,在此做下记录.用RT Thread软件包需要RT Thread的系统,但是RT Thread和RT Thr ...
- 基于rt thread smart构建EtherCAT主站
我把源码开源到到了gitee,https://gitee.com/rathon/rt-thread-smart-soem 有兴趣的去可以下载下来跑一下 软件工程推荐用vscode 打开.rt thre ...
- RT Thread利用STM32CUBEMX和RT Thread studio来创建模板工程
(1)RT Thread利用STM32CUBEMX来创建模板工程 1.参考文档: 基于 CubeMX 移植 RT-Thread Nano:RT-Thread 文档中心 注意:串口2必须使能异步模式(启 ...
- stm32f407单片机rt thread 片外spi flash OTA升级配置示例
参考地址https://www.rt-thread.org/document/site/application-note/system/rtboot/an0028-rtboot/ 第一步,生成Boot ...
- xpt 2046的触摸屏 rt thread设备驱动框架
1 基于rtt 开发触摸屏驱动 准备使用rtt 框架 , 驱动xpt 2046的触摸屏, 翻阅大量资料发现, 大部分文章强调的是时序图, 而且很多代码要么直接操作寄存器, 要么是io 口模拟, 只能用 ...
最新文章
- News | Atomwise获投1.23亿美元推进AI药物研发
- 全局变量与静态全局变量
- 简述平均池化和最大池化
- Oracle通过OCI批量加载需要注意的问题
- 信息抽取(五)实体命名识别之嵌套实体识别哪家强,我做了一个简单的对比实验
- Matlab常用的11个快捷键【注释、自动对齐、跳转指定行、设置标签and断点、自动补全、历史命令、强制中断运行、退出、单行注释转多行】
- 如何通便清肠快速见效_如何三个月合理瘦身减脂
- 高等数学下-赵立军-北京大学出版社-题解-练习10.2
- 景色宜人的openeim001
- Leetcode每日一题:973.k-closest-points-to-origin(最接近原点的K个点)
- 系统学习机器学习之正则化(二)
- 【Windows】win10电脑Miracast投屏到电视
- 一份好的商业计划书该怎么写
- linux IIC子系统分析(七)——实例分析通过i2c-dev操作I2C设备
- 国内从事CV相关的企业
- 信度效度难度区分度是什么意思_如何区分信度、效度、难度、区分度?
- ISO26262 功能安全各个阶段测试要求
- 十年测试经验的阿里p10讲解python初阶:函数和模块 python全栈自动化测试系类4-2
- Winsock 函数简介
- 【单片机毕业设计】【mcuclub-jj-013】基于单片机的衣柜的设计