zhuhongbin fa26584b5c Signed-off-by: zhuhongbin <kptzhu@163.com> | 3 years ago | |
---|---|---|
.. | ||
README.md | 3 years ago | |
fal_cfg.h | 3 years ago | |
fal_flash_sfud_port.c | 3 years ago | |
fal_flash_stm32f1_port.c | 3 years ago | |
fal_flash_stm32f2_port.c | 3 years ago | |
fal_flash_stm32f4.c | 3 years ago |
本示例主要演示 Flash 设备及分区相关的移植。
在定义 Flash 设备表前,需要先定义 Flash 设备,参考 fal_flash_sfud_port.c
(基于 SFUD 万能 SPI Flash 驱动的 Flash 设备)与 fal_flash_stm32f2_port.c
(STM32F2 片内 Flash)这两个文件。这里简介下 fal_flash_stm32f2_port.c
里的代码实现。
针对 Flash 的不同操作,这里定义了如下几个操作函数:
static int init(void)
:可选 的初始化操作
static int read(long offset, uint8_t *buf, size_t size)
:读取操作
参数 | 描述 |
---|---|
offset | 读取数据的 Flash 偏移地址 |
buf | 存放待读取数据的缓冲区 |
size | 待读取数据的大小 |
return | 返回实际读取的数据大小 |
static int write(long offset, const uint8_t *buf, size_t size)
:写入操作参数 | 描述 |
---|---|
offset | 写入数据的 Flash 偏移地址 |
buf | 存放待写入数据的缓冲区 |
size | 待写入数据的大小 |
return | 返回实际写入的数据大小 |
static int erase(long offset, size_t size)
:擦除操作参数 | 描述 |
---|---|
offset | 擦除区域的 Flash 偏移地址 |
size | 擦除区域的大小 |
return | 返回实际擦除的区域大小 |
用户需要根据自己的 Flash 情况分别实现这些操作函数。在文件最底部定义了具体的 Flash 设备对象(stm32f2_onchip_flash):
const struct fal_flash_dev stm32f2_onchip_flash = { "stm32_onchip", 0x08000000, 1024*1024, 128*1024, {init, read, write, erase} };
"stm32_onchip"
: Flash 设备的名字Flash 设备表定义在 fal_cfg.h
头文件中,定义分区表前需 新建 fal_cfg.h
文件 。
参考 示例文件 samples/porting/fal_cfg.h 或如下代码:
/* ===================== Flash device Configuration ========================= */
extern const struct fal_flash_dev stm32f2_onchip_flash;
extern struct fal_flash_dev nor_flash0;
/* flash device table */
#define FAL_FLASH_DEV_TABLE \
{ \
&stm32f2_onchip_flash, \
&nor_flash0, \
}
Flash 设备表中,有两个 Flash 对象,一个为 STM32F2 的片内 Flash ,一个为片外的 Nor Flash。
Flash 分区基于 Flash 设备,每个 Flash 设备又可以有 N 个分区,这些分区的集合就是分区表。在配置分区表前,务必保证已定义好 Flash 设备及设备表。
分区表也定义在 fal_cfg.h
头文件中。参考 示例文件 samples/porting/fal_cfg.h 或如下代码:
#define NOR_FLASH_DEV_NAME "norflash0"
/* ====================== Partition Configuration ========================== */
#ifdef FAL_PART_HAS_TABLE_CFG
/* partition table */
#define FAL_PART_TABLE \
{ \
{FAL_PART_MAGIC_WORD, "bl", "stm32_onchip", 0, 64*1024, 0}, \
{FAL_PART_MAGIC_WORD, "app", "stm32_onchip", 64*1024, 704*1024, 0}, \
{FAL_PART_MAGIC_WORD, "easyflash", NOR_FLASH_DEV_NAME, 0, 1024*1024, 0}, \
{FAL_PART_MAGIC_WORD, "download", NOR_FLASH_DEV_NAME, 1024*1024, 1024*1024, 0}, \
}
#endif /* FAL_PART_HAS_TABLE_CFG */
上面这个分区表详细描述信息如下:
分区名 | Flash 设备名 | 偏移地址 | 大小 | 说明 |
---|---|---|---|---|
"bl" | "stm32_onchip" | 0 | 64KB | 引导程序 |
"app" | "stm32_onchip" | 64*1024 | 704KB | 应用程序 |
"easyflash" | "norflash0" | 0 | 1MB | EasyFlash 参数存储 |
"download" | "norflash0" | 1024*1024 | 1MB | OTA 下载区 |
用户需要修改的分区参数包括:分区名称、关联的 Flash 设备名、偏移地址(相对 Flash 设备内部)、大小,需要注意以下几点:
注意:每个分区定义时,除了填写上面介绍的参数属性外,需在前面增加
FAL_PART_MAGIC_WORD
属性,末尾增加0
(目前用于保留功能)