stm32f407使用rt thread 的easy flash 和fal

昨天调了一下fal,初步把easy flash给编译进去了,然后再记录一下几个坑。easyflash的官方文档其实说的有点不明不白的,很多人就为了流量把官方的文档拷来拷去的,我把几个关键点列一下,以后带小弟可以记得住。本篇文章不是教程,如果你上来就照我这个来估计看不懂我说的啥。

这个连接里的哥们写的也不错,基本如果你调试的时候掉进坑里有问题的话,自己研究一会,看看我的这篇,还有他这篇,就差不多了。

https://club.rt-thread.org/ask/question/427423.html

首先明确第一个概念:fal提供了设备表和分区表,这是基础。easyflash是指定使用fal分区表的某一个分区。

所以第一步fal要配置对。当然easyflash也可以硬怼HAL,下面会提到怎么做,但不建议这么干。

目前我用的是stm32f407的片内flash,它有1MB。好像F429是有2个bank,就有2MB。下一版我的硬件还是要加一个外部flash,因为要上OTA在线升级功能,内部flash肯定就不够了

fal_cfg.h设备和分区表如下:

/*
 * Copyright (c) 2006-2021, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2021-06-02     alanl       the first version
 */
#ifndef _FAL_CFG_H_
#define _FAL_CFG_H_


//#include <rtconfig.h>
//#include <board.h>

#define FLASH_SIZE_GRANULARITY_16K   (4 * 16 * 1024)
#define FLASH_SIZE_GRANULARITY_64K   (1 * 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)
/* ===================== Flash device Configuration ========================= */
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;

/* flash device table */
#define FAL_FLASH_DEV_TABLE                                          \
{                                                                    \
    &stm32_onchip_flash_16k,                                           \
    &stm32_onchip_flash_64k,                                           \
    &stm32_onchip_flash_128k,                                           \
}
/* ====================== Partition Configuration ========================== */
#ifdef FAL_PART_HAS_TABLE_CFG
/* partition table */
#define FAL_PART_TABLE                                                               \
{                                                                                    \
    {FAL_PART_MAGIC_WORD,        "bl",     "onchip_flash_16k",         0,   64*1024, 0}, \
    {FAL_PART_MAGIC_WORD,       "app",     "onchip_flash_64k",   0,  64*1024, 0}, \
    {FAL_PART_MAGIC_WORD,       "app2",     "onchip_flash_128k",   0,  4*128*1024, 0}, \
    {FAL_PART_MAGIC_WORD,  "easyflash", "onchip_flash_128k", 4*128*1024, 2*128*1024, 0}, \
}//0x0808000,start ADDR_FLASH_SECTOR_8
#endif /* FAL_PART_HAS_TABLE_CFG */

#endif

几个点注意一下。

  1. stm32f407的片内flash地址定义在/drivers/drv_flash_f4.c里面,其实很多起始地址之类的在里面都定义过了,我这代码里面很多也都是重复定义。
  2. ”onchip_flash_16k“这些字段不是你自己随便起的,是在drv_flash_f4.c里面看16k的设备定义结构体里面,全文搜stm32_onchip_flash_16k,找到结构体定义,里面有个带引号的。
  3. 分区表里面我把easyflash分区的offset设置为4*128*1024,因为我知道前面的地址里都有代码。
  4. 如何知道前面的地址有代码呢?你的代码编译完的时候可以看到占用的ROM大小,例如rt studio 最后就报占用的rom大小。例如我的代码编译完是417K,那差不多就是4*128K,128K是片内flash一个sector的大小,在drv_flash_f4.c里面已经知道了大概就是0x08060000左右。
  5. 打开stm32 stlink utility看,0x08060000已经被写了,下一个sector就是0x08080000了,就从0x08080000开始呗。所以easyflash的起始offset就是这么来的。
  6. 分区长度就不用说了,看后面还剩几个sector。

EasyFlash参数设置的注意点。

  1. 自己需要建一个ef_fal_port.c文件,这个文件下好easyflash扩展包之后手动在文件夹 /package/easyflash/port里面可以找到,但不在rt studio的资源管理器里面。我建议把它拉到的application目录里面去,在rt thread studio里面添加进来。这个文件是实现flash读写的接口驱动,rt thread里下的包是基于fal的,也都用fal接口给你写完了,如果没有用到fal,那就自己把接口函数写了就行了,比如直接怼stm32 HAL库。
  2. 这个文件的最上面有个FAL_EF_PART_NAME,默认是"ef", 我改成“easyflash“,因为fal分区表里面是"easyflash"
  3. rt-thread settings ,easyflash设置里面,最小擦写粒度是131072=128*1024,因为片内flash最小是擦一个扇区就是128K。如果后面用外部flash例如W25Q64这种,一般也是128K一擦。
  4. 下面最小写入粒度选8bit,它这里面也有提示。
  5. 如果擦写粒度和写入粒度没设对的话,每次启动的时候命令行里面会报什么扇区错误,擦除,GC错误什么的。我在这坑里掉了20分钟,后来看官方说“分区首次使用的话它是要擦除一次的,所以第一次报sector header check failed是对的”,这让我想到了应该是擦除没成功导致的,改了擦除颗粒度就对了。

  • 28
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值