RT-thread应用讲解——FLASH分区
RT-thread应用讲解——FLASH分区
目录
- RT-thread应用讲解——FLASH分区
- 前言
- 一、挂载FLASH
- 二、ENV配置
- 1、打开on-chip flash
- 2、打开FAL软件包
- 3、重新生成工程
- 三、分区处理
- 1、定义flash设备表
- 2、定义flash分区表
- 3、FAL初始化
- 四、运行测试
- 1、指定待操作的Flash设备或Flash分区
- 2、擦除数据
- 3、写入数据
- 4、读取数据
- 5、性能测试
- 五、结束语
前言
因为单片机的存储比较小,所以我们经常会用到外置FLASH来存储一些文件、数据或者OTA等。如果一个FLASH只用来做单一的功能,那只需要把所有内存都分配到这个功能上就行了,但是如果要用一个FLASH同时做多个功能,比如我用一部分内存来做文件系统,一部分用来存OTA升级固件,那在操作内存的时候就要注意地址的分配了,为了方便内存管理,我们通常会进行分区处理。
RT-thread系统就有分区和内存管理相关的软件包,这一点还是很方便的。
FAL软件包:http://packages.rt-thread.org/detail.html?package=fal
FAL软件包可以用于片内flash也可以用于片外flash,我这一讲主要介绍片外flash的使用。
一、挂载FLASH
首先我们要把这个片外flash挂载上。这个我之前的教程已经介绍过了,不知道的同学可以先看下我之前的博客。
RT-thread应用讲解——norflash
二、ENV配置
1、打开on-chip flash
2、打开FAL软件包
3、重新生成工程
设置完之后保存退出,然后重新生成工程即可。
在env输入下面的命令,重新生成新的工程。
提示:会使用env的话应该都知道这个操作,不多说了。
scons --target=mdk5
三、分区处理
1、定义flash设备表
打开fal_cfg.h文件(在board\ports文件夹里面),找到flash设备的定义,增加片外flash的定义。
注意:fal软件包里面也会有一个fal_cfg.h文件,这个只是demo,默认是不加入到工程里面的,也不会起作用。
定义flash设备表示例代码如下:
extern const struct fal_flash_dev stm32_onchip_flash_16k;
extern const struct fal_flash_dev stm32_onchip_flash_64k;
extern const struct fal_flash_dev stm32_onchip_flash_128k;
extern struct fal_flash_dev nor_flash0;/* flash device table */
#define FAL_FLASH_DEV_TABLE \
{ \&stm32_onchip_flash_16k, \&stm32_onchip_flash_64k, \&stm32_onchip_flash_128k, \&nor_flash0, \
}
2、定义flash分区表
同样是在fal_cfg.h文件里面,根据自己的需要定义分区表。
示例代码如下:
/* ====================== Partition Configuration ========================== */
#ifdef FAL_PART_HAS_TABLE_CFG/* partition table */
#define FAL_PART_TABLE \
{ \{FAL_PART_MAGIC_WROD, "bootload", "onchip_flash_16k", 0 * 1024, 128 * 1024, 0}, \{FAL_PART_MAGIC_WROD, "app", "onchip_flash_128k", 0 * 1024, 384 * 1024, 0}, \{FAL_PART_MAGIC_WROD, "download", "norflash0", 0 * 1024, 256 * 1024, 0}, \{FAL_PART_MAGIC_WROD, "factory", "norflash0", 256 * 1024, 384 * 1024, 0}, \{FAL_PART_MAGIC_WROD, "easyflash", "norflash0", 640 * 1024, 128 * 1024, 0}, \{FAL_PART_MAGIC_WROD, "cmb_log", "norflash0", 768* 1024, 128 * 1024, 0}, \{FAL_PART_MAGIC_WROD, "filesystem", "norflash0", 896 * 1024, 15488 * 1024, 0}, \
}#endif /* FAL_PART_HAS_TABLE_CFG */
#endif /* _FAL_CFG_H_ */
上面这个分区表详细描述信息如下:
分区名 | FLASH设备名 | 偏移地址 | 内存大小 | 说明 |
---|---|---|---|---|
“bootload” | “onchip_flash_16k” | 0 | 128 * 1024 字节 | bootload引导程序 |
“app” | “onchip_flash_128k” | 0 | 384 * 1024 字节 | 应用程序 |
“download” | “norflash0” | 0 | 256 * 1024 字节 | OTA升级固件 |
“factory” | “norflash0” | 256 * 1024 | 384 * 1024 字节 | 恢复出厂固件 |
“cmb_log” | “norflash0” | 640 * 1024 | 128 * 1024 字节 | 运行日志 |
“filesystem” | “norflash0” | 896 * 1024 | 15488 * 1024 字节 | 文件系统 |
提示:FLASH设备名要根据实际情况来写,比如onchip_flash_16k和onchip_flash_128k是默认的一个定义(在drv_flash_f4.c文件),stm32_onchip_flash_16k指定的起始地址就是stm32f4系列rom的起始地址,onchip_flash_128k则是从128k偏移开始的,如果这几个定义不满足你的需求可以自己在drv_flash_f4.c文件再定义一个。
最后贴一个fal_cfg.h文件完整的代码:
/** Copyright (c) 2006-2018, RT-Thread Development Team** SPDX-License-Identifier: Apache-2.0** Change Logs:* Date Author Notes* 2018-12-5 SummerGift first version*/#ifndef _FAL_CFG_H_
#define _FAL_CFG_H_#include <rtthread.h>
#include <board.h>#define FLASH_SIZE_GRANULARITY_16K (4 * 16 * 1024)
#define FLASH_SIZE_GRANULARITY_64K (64 * 1024)
#define FLASH_SIZE_GRANULARITY_128K (7 * 128 * 1024)#define STM32_FLASH_START_ADRESS_16K STM32_FLASH_START_ADRESS
#define STM32_FLASH_START_ADRESS_64K (STM32_FLASH_START_ADRESS_16K + FLASH_SIZE_GRANULARITY_16K)
#define STM32_FLASH_START_ADRESS_128K (STM32_FLASH_START_ADRESS_64K + FLASH_SIZE_GRANULARITY_64K)extern const struct fal_flash_dev stm32_onchip_flash_16k;
extern const struct fal_flash_dev stm32_onchip_flash_64k;
extern const struct fal_flash_dev stm32_onchip_flash_128k;
extern struct fal_flash_dev nor_flash0;/* flash device table */
#define FAL_FLASH_DEV_TABLE \
{ \&stm32_onchip_flash_16k, \&stm32_onchip_flash_64k, \&stm32_onchip_flash_128k, \&nor_flash0, \
}
/* ====================== Partition Configuration ========================== */#ifdef FAL_PART_HAS_TABLE_CFG/* partition table */
#define FAL_PART_TABLE \
{ \{FAL_PART_MAGIC_WROD, "bootload", "onchip_flash_16k", 0 * 1024, 128 * 1024, 0}, \{FAL_PART_MAGIC_WROD, "app", "onchip_flash_128k", 0 * 1024, 384 * 1024, 0}, \{FAL_PART_MAGIC_WROD, "download", "norflash0", 0 * 1024, 256 * 1024, 0}, \{FAL_PART_MAGIC_WROD, "factory", "norflash0", 256 * 1024, 384 * 1024, 0}, \{FAL_PART_MAGIC_WROD, "easyflash", "norflash0", 640 * 1024, 128 * 1024, 0}, \{FAL_PART_MAGIC_WROD, "cmb_log", "norflash0", 768* 1024, 128 * 1024, 0}, \{FAL_PART_MAGIC_WROD, "filesystem", "norflash0", 896 * 1024, 15488 * 1024, 0}, \
}#endif /* FAL_PART_HAS_TABLE_CFG */
#endif /* _FAL_CFG_H_ */
3、FAL初始化
在你的工程里面调用fal_init()函数,比如我这里是在main函数里面调用的(放其他位置也是可以的,只要调用了就行)。
提示:调用fal_init()函数之前要先包含fal.h这个头文件,不然就找不到这个函数了。
四、运行测试
正常运行的日志如下:
可以通过输出的日志再次核对你的分区是否有误。
fal本身就提供了一些测试命令,可以通过msh命令完成测试。
具体的命令可以输入fal查看。
关于这些测试的命令,我这里就简单地列一下,FAL软件包官方的介绍里面已经有详细的解析了,可以自行查阅。
FAL软件包:http://packages.rt-thread.org/detail.html?package=fal
1、指定待操作的Flash设备或Flash分区
示例如下:
fal probe download
2、擦除数据
示例如下:
fal erase 0 4096
3、写入数据
示例如下:
fal write 0 00 01 02 03 04
4、读取数据
示例如下:
fal read 0 5
5、性能测试
性能测试将会测试Flash的擦除、写入及读取速度,同时将会测试写入及读取数据的准确性,保证整个 Flash 或整个分区的 写入与读取数据的一致性。
示例如下:
fal bench 4096 yes
最后贴一个完整的测试示例:
五、结束语
好了,关于FLASH分区的介绍就到这里,如果还有什么问题,欢迎在评论区留言。如果这篇文章能够帮到你,就给我点个赞吧,如果想了解更多RT-thread和单片机的内容,可以关注一下博主,后续我还会继续分享更多的经验给大家。
教程相关源码:
https://pan.baidu.com/s/1N2D8dM31deKIqNqaIQfPiA
提取码:7nsx
RT-thread相关教程汇总:https://blog.csdn.net/ShenZhen_zixian/article/details/120563891
RT-thread应用讲解——FLASH分区相关推荐
- rt thread 外挂SPI flash步骤
第5版硬件出炉,外挂了W25Q64在stm32 的SPI1上,引脚如下. CS->PA15 SCK->PB3 MISO->PB4 MOSI->PB5 注意以上引脚也有SPI3, ...
- rt thread studio使用QBOOT和片外flash实现OTA升级
我们这里要使用单片机外部flash作为OTA的下载分区,外部flash硬件连接关系 PB3-->SPI3_CLK PB4-->SPI3_MISO PB5-->SPI3_MOSI PE ...
- stm32f407单片机rt thread 片外spi flash OTA升级配置示例
参考地址https://www.rt-thread.org/document/site/application-note/system/rtboot/an0028-rtboot/ 第一步,生成Boot ...
- RT Thread根据开发板制作BSP方法
之前一直不懂怎么使用RT Thread的软件包,感谢网上的大神,看了你们的博客后大概了解一些,在此做下记录.用RT Thread软件包需要RT Thread的系统,但是RT Thread和RT Thr ...
- rt thread 使用FAL遇到fal_init() undefined reference
rt thread FAL 0.5版,之前有没有不知道,遇到一个坑. 在main.cpp里面已经 #include <fal.h> fal_init() 编译报错,说 fal_init() ...
- Yeelink平台使用——远程控制 RT Thread + LwIP+ STM32
1.前言 [2014年4月重写该博文] 经过若干时间的努力终于搞定了STM32+LwIP和yeelink平台的数据互通,在学习的过程中大部分时间花在以太网协议栈学习上,但是在RT Th ...
- 通过mtd读写flash_关于如何在kernel起来之后通过直接dd读写nand flash分区来更新zImage的mtd问题...
关于如何在kernel起来之后通过直接dd读写nand flash分区来更新zImage的mtd问题 主要是设置struct mtd_partition中的mask_flags标志位 具体含义为: 1 ...
- 启明云端分享|sigmastar SSD201 \ SSD202D内存大小问题及flash分区问题解答
提示:作为Espressif(乐鑫科技)大中华区合作伙伴及sigmastar(厦门星宸)VAD合作伙伴,我们不仅用心整理了你在开发过程中可能会遇到的问题以及快速上手的简明教程供开发小伙伴参考.同时也用 ...
- Android Flash分区大小查看
正常的8G Flash有多少可以用的 这样算吧: 硬盘和U盘厂家的算法:8GB*1000=8000MB*1000=8000000KB*1000=8000000000B 电脑系统的算法:80000000 ...
最新文章
- 【Pandas库】(2) Series的基本操作方法
- 程序员面临的伦理困境
- 【Kotlin】扩展接收者 与 分发接收者 ( 类内部扩展用法 | 注意事项 | open 修饰扩展 )
- sqlserⅴer随机函数_sql server 函数--rand() 生成整数的随机数
- bzoj2463谁能赢呢?
- 最大排列问题的算法实现(Python)究竟最后调换位置的有哪几个?
- mysql 创建账号权限_mysql创建用户,并指定用户的权限(grant命令)
- java mongo 获取所有数据库_Spring Batch —从XML读取并写入Mongo
- 如何知道一个域名是否存在_域名检测API实现查看一个域名在微信中是否被封
- 1s后跳转 android_优雅保活方案,原来Android还可以这样保活
- 《Dubbo迈出云原生重要一步-应用级服务发现解析》
- python之禅怎么看_Python之禅
- 7-5 简单的代码生成程序-A (10 分)
- 玩转python字典与列表(下)
- 单元格中指定内容标红_你一直都不知道,键盘上“F4”在office中的强大功能
- 6678运行 linux,基于TMS320C6678的Linux镜像烧写演示
- vueminder ultimate 2020中文版(电脑桌面日历工具) v2020.07
- android cpu调度策略_最完整的Android CPU模式设置和功能
- 浙大机器学习(胡浩基)课程笔记
- 建站影视cms网站源码(含安装说明文档)