当前位置: 首页 > news >正文

stm32 单片机(on-chip flash)(片上flash)使用 rt-thread 的FAL 软件包

一、开发环境

硬件:野火 stm32f407 开发板。
软件:rt-thread v4.1.1 stm32f407-atk-explorer bsp包。
注意
FAL:Flash 抽象层。在 V4.1.0 中,将 fal 软件包重新定义为 RT-Thread 内部组件,在使用方式上和以前有这些区别:
(1)原本使用 fal 需要在 RT-Thread 的包管理器中选择并进行下载;
(2)现在只需要在组件中打开使用即可

二、stm32f407 flash介绍

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
根据数据手册和参考手册可知道,stm32f407zgt6 内部 flash 大小为 1Mbytes=1024Kbytes,分为 4个 16Kbytes,1个 64 Kbytes,7个 128 Kbytes。

三、FAL 软件包介绍

3.1 介绍

FAL (Flash Abstraction Layer) Flash 抽象层,是对 Flash 及基于 Flash 的分区进行管理、操作的抽象层,对上层统一了 Flash 及 分区操作的 API (框架图如下所示),并具有以下特性:
1、支持静态可配置的分区表,并可关联多个 Flash 设备;
2、分区表支持 自动装载 。避免在多固件项目,分区表被多次定义的问题;
3、代码精简,对操作系统 无依赖 ,可运行于裸机平台,比如对资源有一定要求的 Bootloader;
4、统一的操作接口。保证了文件系统、OTA、NVM(例如:EasyFlash) 等对 Flash 有一定依赖的组件,底层 Flash 驱动的可重用性;
5、自带基于 Finsh/MSH 的测试命令,可以通过 Shell 按字节寻址的方式操作(读写擦) Flash 或分区,方便开发者进行调试、测试;
在这里插入图片描述

3.2 FAL 目录

名称说明
inc头文件目录
src源代码目录
samples例程目录

3.3 FAL API

在这里插入图片描述
在这里插入图片描述
API详细参考链接:
https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/fal/fal_api

四、配置方法

使用 FAL 的基本步骤如下所示

1、打开 FAL:从 Env 中打开 fal 软件包并下载到工程。在 V4.1.0 中,将 fal 软件包重新定义为 RT-Thread 内部组件,在组件中打开即可
2、FAL 移植:定义 flash 设备、定义 flash 设备表、定义 flash 分区表
在这里插入图片描述

3、调用 fal_init() 初始化该库:移植完成后,可在应用层调用,如在 main 函数中调用。

4.1 配置

使能 片上flash
在这里插入图片描述

打开 FAL,使用的是 4.1.1版本,所以在组件中打开使用
在这里插入图片描述
每个功能的配置说明如下:

1、开启调试日志输出(默认开启);
2、分区表是否在 fal_cfg.h 中定义(默认开启)。如果关闭此选项,fal 将会自动去指定 Flash 的指定位置去检索并装载分区表,具体配置详见下面两个选项;

  • 存放分区表的 Flash 设备;
  • 分区表的 结束地址 位于 Flash 设备上的偏移。fal 将从此地址开始往回进行检索分区表,直接读取到 Flash 顶部。如果不确定分区表具体位置,这里也可以配置为 Flash 的结束地址,fal 将会检索整个 Flash,检索时间可能会增加。

3、启用 FAL 针对 SFUD 的移植文件(默认关闭);

  • 应输入调用 rt_sfud_flash_probe 函数时传入的 FLASH 设备名称(也可以通过 list_device 命令查看 Block Device 的名字获取)。该名称与分区表中的 Flash 名称对应,只有正确设置设备名字,才能完成对 FLASH 的读写操作。

然后让 RT-Thread 的包管理器自动更新,或者使用 pkgs --update 命令更新包到 BSP 中。
在这里插入图片描述

将 测试参考文件中的 fal_cfg.h 文件放入 fal 文件夹的 头文件下
在这里插入图片描述
在这里插入图片描述
修改 片上 flash 的驱动 和 fal 的配置 。主要定义 flash 设备、定义 flash 设备表、定义 flash 分区表

定义flash设备
打开 drv_flash_f4.c 文件,会发现如下提示:
在这里插入图片描述

修改 drv_flash_f4.c ,增加 一下宏定义

//芯片型号:STM32407xG
//起始地址
#define STM32_FLASH_START_ADRESS_16K        ADDR_FLASH_SECTOR_0
#define STM32_FLASH_START_ADRESS_64K        ADDR_FLASH_SECTOR_4
#define STM32_FLASH_START_ADRESS_128K       ADDR_FLASH_SECTOR_5
//大小
#define FLASH_SIZE_GRANULARITY_16K          (4*16*1024)         //4个16K
#define FLASH_SIZE_GRANULARITY_64K          (64*1024)           //1个64K
#define FLASH_SIZE_GRANULARITY_128K         (7*128*1024)        //7个128K

完整代码如下:

/** Copyright (c) 2006-2022, RT-Thread Development Team** SPDX-License-Identifier: Apache-2.0** Change Logs:* Date           Author       Notes* 2018-12-5      SummerGift   first version*/#include "board.h"#ifdef BSP_USING_ON_CHIP_FLASH
#include "drv_config.h"
#include "drv_flash.h"#if defined(RT_USING_FAL)
#include "fal.h"
#endif//#define DRV_DEBUG
#define LOG_TAG                "drv.flash"
#include <drv_log.h>/* Base address of the Flash sectors Bank 1 */
#define ADDR_FLASH_SECTOR_0     ((uint32_t)0x08000000) /* Base @ of Sector 0, 16 Kbytes */
#define ADDR_FLASH_SECTOR_1     ((uint32_t)0x08004000) /* Base @ of Sector 1, 16 Kbytes */
#define ADDR_FLASH_SECTOR_2     ((uint32_t)0x08008000) /* Base @ of Sector 2, 16 Kbytes */
#define ADDR_FLASH_SECTOR_3     ((uint32_t)0x0800C000) /* Base @ of Sector 3, 16 Kbytes */
#define ADDR_FLASH_SECTOR_4     ((uint32_t)0x08010000) /* Base @ of Sector 4, 64 Kbytes */
#define ADDR_FLASH_SECTOR_5     ((uint32_t)0x08020000) /* Base @ of Sector 5, 128 Kbytes */
#define ADDR_FLASH_SECTOR_6     ((uint32_t)0x08040000) /* Base @ of Sector 6, 128 Kbytes */
#define ADDR_FLASH_SECTOR_7     ((uint32_t)0x08060000) /* Base @ of Sector 7, 128 Kbytes */
#define ADDR_FLASH_SECTOR_8     ((uint32_t)0x08080000) /* Base @ of Sector 8, 128 Kbytes */
#define ADDR_FLASH_SECTOR_9     ((uint32_t)0x080A0000) /* Base @ of Sector 9, 128 Kbytes */
#define ADDR_FLASH_SECTOR_10    ((uint32_t)0x080C0000) /* Base @ of Sector 10, 128 Kbytes */
#define ADDR_FLASH_SECTOR_11    ((uint32_t)0x080E0000) /* Base @ of Sector 11, 128 Kbytes *//* Base address of the Flash sectors Bank 2 */
#define ADDR_FLASH_SECTOR_12     ((uint32_t)0x08100000) /* Base @ of Sector 0, 16 Kbytes */
#define ADDR_FLASH_SECTOR_13     ((uint32_t)0x08104000) /* Base @ of Sector 1, 16 Kbytes */
#define ADDR_FLASH_SECTOR_14     ((uint32_t)0x08108000) /* Base @ of Sector 2, 16 Kbytes */
#define ADDR_FLASH_SECTOR_15     ((uint32_t)0x0810C000) /* Base @ of Sector 3, 16 Kbytes */
#define ADDR_FLASH_SECTOR_16     ((uint32_t)0x08110000) /* Base @ of Sector 4, 64 Kbytes */
#define ADDR_FLASH_SECTOR_17     ((uint32_t)0x08120000) /* Base @ of Sector 5, 128 Kbytes */
#define ADDR_FLASH_SECTOR_18     ((uint32_t)0x08140000) /* Base @ of Sector 6, 128 Kbytes */
#define ADDR_FLASH_SECTOR_19     ((uint32_t)0x08160000) /* Base @ of Sector 7, 128 Kbytes */
#define ADDR_FLASH_SECTOR_20     ((uint32_t)0x08180000) /* Base @ of Sector 8, 128 Kbytes  */
#define ADDR_FLASH_SECTOR_21     ((uint32_t)0x081A0000) /* Base @ of Sector 9, 128 Kbytes  */
#define ADDR_FLASH_SECTOR_22     ((uint32_t)0x081C0000) /* Base @ of Sector 10, 128 Kbytes */
#define ADDR_FLASH_SECTOR_23     ((uint32_t)0x081E0000) /* Base @ of Sector 11, 128 Kbytes *///芯片型号:STM32407xG
//起始地址
#define STM32_FLASH_START_ADRESS_16K        ADDR_FLASH_SECTOR_0
#define STM32_FLASH_START_ADRESS_64K        ADDR_FLASH_SECTOR_4
#define STM32_FLASH_START_ADRESS_128K       ADDR_FLASH_SECTOR_5
//大小
#define FLASH_SIZE_GRANULARITY_16K          (4*16*1024)         //4个16K
#define FLASH_SIZE_GRANULARITY_64K          (64*1024)           //1个64K
#define FLASH_SIZE_GRANULARITY_128K         (7*128*1024)        //7个128K/*** @brief  Gets the sector of a given address* @param  None* @retval The sector of a given address*/
static rt_uint32_t GetSector(rt_uint32_t Address)
{rt_uint32_t sector = 0;if((Address < ADDR_FLASH_SECTOR_1) && (Address >= ADDR_FLASH_SECTOR_0)){sector = FLASH_SECTOR_0;}else if((Address < ADDR_FLASH_SECTOR_2) && (Address >= ADDR_FLASH_SECTOR_1)){sector = FLASH_SECTOR_1;}else if((Address < ADDR_FLASH_SECTOR_3) && (Address >= ADDR_FLASH_SECTOR_2)){sector = FLASH_SECTOR_2;}else if((Address < ADDR_FLASH_SECTOR_4) && (Address >= ADDR_FLASH_SECTOR_3)){sector = FLASH_SECTOR_3;}else if((Address < ADDR_FLASH_SECTOR_5) && (Address >= ADDR_FLASH_SECTOR_4)){sector = FLASH_SECTOR_4;}else if((Address < ADDR_FLASH_SECTOR_6) && (Address >= ADDR_FLASH_SECTOR_5)){sector = FLASH_SECTOR_5;}else if((Address < ADDR_FLASH_SECTOR_7) && (Address >= ADDR_FLASH_SECTOR_6)){sector = FLASH_SECTOR_6;}else if((Address < ADDR_FLASH_SECTOR_8) && (Address >= ADDR_FLASH_SECTOR_7)){sector = FLASH_SECTOR_7;}
#if defined(FLASH_SECTOR_8)else if((Address < ADDR_FLASH_SECTOR_9) && (Address >= ADDR_FLASH_SECTOR_8)){sector = FLASH_SECTOR_8;}
#endif
#if defined(FLASH_SECTOR_9)else if((Address < ADDR_FLASH_SECTOR_10) && (Address >= ADDR_FLASH_SECTOR_9)){sector = FLASH_SECTOR_9;}
#endif
#if defined(FLASH_SECTOR_10)else if((Address < ADDR_FLASH_SECTOR_11) && (Address >= ADDR_FLASH_SECTOR_10)){sector = FLASH_SECTOR_10;}
#endif
#if defined(FLASH_SECTOR_11)else if((Address < ADDR_FLASH_SECTOR_12) && (Address >= ADDR_FLASH_SECTOR_11)){sector = FLASH_SECTOR_11;}
#endif
#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx)else if((Address < ADDR_FLASH_SECTOR_13) && (Address >= ADDR_FLASH_SECTOR_12)){sector = FLASH_SECTOR_12;}else if((Address < ADDR_FLASH_SECTOR_14) && (Address >= ADDR_FLASH_SECTOR_13)){sector = FLASH_SECTOR_13;}else if((Address < ADDR_FLASH_SECTOR_15) && (Address >= ADDR_FLASH_SECTOR_14)){sector = FLASH_SECTOR_14;}else if((Address < ADDR_FLASH_SECTOR_16) && (Address >= ADDR_FLASH_SECTOR_15)){sector = FLASH_SECTOR_15;}else if((Address < ADDR_FLASH_SECTOR_17) && (Address >= ADDR_FLASH_SECTOR_16)){sector = FLASH_SECTOR_16;}else if((Address < ADDR_FLASH_SECTOR_18) && (Address >= ADDR_FLASH_SECTOR_17)){sector = FLASH_SECTOR_17;}else if((Address < ADDR_FLASH_SECTOR_19) && (Address >= ADDR_FLASH_SECTOR_18)){sector = FLASH_SECTOR_18;}else if((Address < ADDR_FLASH_SECTOR_20) && (Address >= ADDR_FLASH_SECTOR_19)){sector = FLASH_SECTOR_19;}else if((Address < ADDR_FLASH_SECTOR_21) && (Address >= ADDR_FLASH_SECTOR_20)){sector = FLASH_SECTOR_20;}else if((Address < ADDR_FLASH_SECTOR_22) && (Address >= ADDR_FLASH_SECTOR_21)){sector = FLASH_SECTOR_21;}else if((Address < ADDR_FLASH_SECTOR_23) && (Address >= ADDR_FLASH_SECTOR_22)){sector = FLASH_SECTOR_22;}else /* (Address < FLASH_END_ADDR) && (Address >= ADDR_FLASH_SECTOR_23) */{sector = FLASH_SECTOR_23;}
#endifreturn sector;
}/*** Read data from flash.* @note This operation's units is word.** @param addr flash address* @param buf buffer to store read data* @param size read bytes size** @return result*/
int stm32_flash_read(rt_uint32_t addr, rt_uint8_t *buf, size_t size)
{size_t i;if ((addr + size) > STM32_FLASH_END_ADDRESS){LOG_E("read outrange flash size! addr is (0x%p)", (void*)(addr + size));return -1;}for (i = 0; i < size; i++, buf++, addr++){*buf = *(rt_uint8_t *) addr;}return size;
}/*** Write data to flash.* @note This operation's units is word.* @note This operation must after erase. @see flash_erase.** @param addr flash address* @param buf the write data buffer* @param size write bytes size** @return result*/
int stm32_flash_write(rt_uint32_t addr, const rt_uint8_t *buf, size_t size)
{rt_err_t result      = RT_EOK;rt_uint32_t end_addr = addr + size;rt_uint32_t written_size = 0;rt_uint32_t write_size = 0;if ((end_addr) > STM32_FLASH_END_ADDRESS){LOG_E("write outrange flash size! addr is (0x%p)", (void*)(addr + size));return -RT_EINVAL;}if (size < 1){return -RT_EINVAL;}HAL_FLASH_Unlock();__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);while (written_size < size){if (((addr + written_size) % 4 == 0) && (size - written_size >= 4)){if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, addr + written_size, *((rt_uint32_t *)(buf + written_size))) == HAL_OK){if (*(rt_uint32_t *)(addr + written_size) != *(rt_uint32_t *)(buf + written_size)){result = -RT_ERROR;break;}}else{result = -RT_ERROR;break;}write_size = 4;}else if (((addr + written_size) % 2 == 0) && (size - written_size >= 2)){if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, addr + written_size, *((rt_uint16_t *)(buf + written_size))) == HAL_OK){if (*(rt_uint16_t *)(addr + written_size) != *(rt_uint16_t *)(buf + written_size)){result = -RT_ERROR;break;}}else{result = -RT_ERROR;break;}write_size = 2;}else{if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_BYTE, addr + written_size, *((rt_uint8_t *)(buf + written_size))) == HAL_OK){if (*(rt_uint8_t *)(addr + written_size) != *(rt_uint8_t *)(buf + written_size)){result = -RT_ERROR;break;}}else{result = -RT_ERROR;break;}write_size = 1;}written_size += write_size;}HAL_FLASH_Lock();if (result != RT_EOK){return result;}return size;
}/*** Erase data on flash.* @note This operation is irreversible.* @note This operation's units is different which on many chips.** @param addr flash address* @param size erase bytes size** @return result*/
int stm32_flash_erase(rt_uint32_t addr, size_t size)
{rt_err_t result = RT_EOK;rt_uint32_t FirstSector = 0, NbOfSectors = 0;rt_uint32_t SECTORError = 0;if ((addr + size) > STM32_FLASH_END_ADDRESS){LOG_E("ERROR: erase outrange flash size! addr is (0x%p)\n", (void*)(addr + size));return -RT_EINVAL;}if (size < 1){return -RT_EINVAL;}/*Variable used for Erase procedure*/FLASH_EraseInitTypeDef EraseInitStruct;/* Unlock the Flash to enable the flash control register access */HAL_FLASH_Unlock();__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);/* Get the 1st sector to erase */FirstSector = GetSector(addr);/* Get the number of sector to erase from 1st sector*/NbOfSectors = GetSector(addr + size - 1) - FirstSector + 1;/* Fill EraseInit structure*/EraseInitStruct.TypeErase     = FLASH_TYPEERASE_SECTORS;EraseInitStruct.VoltageRange  = FLASH_VOLTAGE_RANGE_3;EraseInitStruct.Sector        = FirstSector;EraseInitStruct.NbSectors     = NbOfSectors;if (HAL_FLASHEx_Erase(&EraseInitStruct, (uint32_t *)&SECTORError) != HAL_OK){result = -RT_ERROR;goto __exit;}__exit:HAL_FLASH_Lock();if (result != RT_EOK){return result;}LOG_D("erase done: addr (0x%p), size %d", (void*)addr, size);return size;
}#if defined(RT_USING_FAL)static int fal_flash_read_16k(long offset, rt_uint8_t *buf, size_t size);
static int fal_flash_read_64k(long offset, rt_uint8_t *buf, size_t size);
static int fal_flash_read_128k(long offset, rt_uint8_t *buf, size_t size);static int fal_flash_write_16k(long offset, const rt_uint8_t *buf, size_t size);
static int fal_flash_write_64k(long offset, const rt_uint8_t *buf, size_t size);
static int fal_flash_write_128k(long offset, const rt_uint8_t *buf, size_t size);static int fal_flash_erase_16k(long offset, size_t size);
static int fal_flash_erase_64k(long offset, size_t size);
static int fal_flash_erase_128k(long offset, size_t size);const struct fal_flash_dev stm32_onchip_flash_16k =
{"onchip_flash_16k",STM32_FLASH_START_ADRESS_16K,FLASH_SIZE_GRANULARITY_16K,(16 * 1024),{NULL,fal_flash_read_16k,fal_flash_write_16k,fal_flash_erase_16k,},8,
};
const struct fal_flash_dev stm32_onchip_flash_64k =
{"onchip_flash_64k",STM32_FLASH_START_ADRESS_64K,FLASH_SIZE_GRANULARITY_64K,(64 * 1024),{NULL,fal_flash_read_64k,fal_flash_write_64k,fal_flash_erase_64k,},8,
};
const struct fal_flash_dev stm32_onchip_flash_128k =
{"onchip_flash_128k",STM32_FLASH_START_ADRESS_128K,FLASH_SIZE_GRANULARITY_128K,(128 * 1024),{NULL,fal_flash_read_128k,fal_flash_write_128k,fal_flash_erase_128k,},8,
};static int fal_flash_read_16k(long offset, rt_uint8_t *buf, size_t size)
{return stm32_flash_read(stm32_onchip_flash_16k.addr + offset, buf, size);
}
static int fal_flash_read_64k(long offset, rt_uint8_t *buf, size_t size)
{return stm32_flash_read(stm32_onchip_flash_64k.addr + offset, buf, size);
}
static int fal_flash_read_128k(long offset, rt_uint8_t *buf, size_t size)
{return stm32_flash_read(stm32_onchip_flash_128k.addr + offset, buf, size);
}static int fal_flash_write_16k(long offset, const rt_uint8_t *buf, size_t size)
{return stm32_flash_write(stm32_onchip_flash_16k.addr + offset, buf, size);
}
static int fal_flash_write_64k(long offset, const rt_uint8_t *buf, size_t size)
{return stm32_flash_write(stm32_onchip_flash_64k.addr + offset, buf, size);
}
static int fal_flash_write_128k(long offset, const rt_uint8_t *buf, size_t size)
{return stm32_flash_write(stm32_onchip_flash_128k.addr + offset, buf, size);
}static int fal_flash_erase_16k(long offset, size_t size)
{return stm32_flash_erase(stm32_onchip_flash_16k.addr + offset, size);
}
static int fal_flash_erase_64k(long offset, size_t size)
{return stm32_flash_erase(stm32_onchip_flash_64k.addr + offset, size);
}
static int fal_flash_erase_128k(long offset, size_t size)
{return stm32_flash_erase(stm32_onchip_flash_128k.addr + offset, size);
}#endif
#endif /* BSP_USING_ON_CHIP_FLASH */

注意:
在这里插入图片描述

修改 fal_cfg.h 文件,如下:

定义 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;/* flash device table */
#define FAL_FLASH_DEV_TABLE                                          \
{                                                                    \&stm32_onchip_flash_16k,                                           \&stm32_onchip_flash_64k,                                                     \&stm32_onchip_flash_128k,                                                     \
}

定义 flash 分区表

#ifdef FAL_PART_HAS_TABLE_CFG
/* partition table */
#define FAL_PART_TABLE                                                               \
{                                                                                    \{FAL_PART_MAGIC_WORD,        "flash16k",       "onchip_flash_16k",    0,            64*1024, 0}, \{FAL_PART_MAGIC_WORD,       "flash64k",        "onchip_flash_64k",    0,            64*1024, 0}, \{FAL_PART_MAGIC_WORD,       "flash128k_1",     "onchip_flash_128k",   0,            1*128*1024, 0}, \{FAL_PART_MAGIC_WORD,       "flash128k_6",     "onchip_flash_128k",   1*128*1024,   6*128*1024, 0}, \
}

完整代码如下:

/** Copyright (c) 2006-2018, RT-Thread Development Team** SPDX-License-Identifier: Apache-2.0** Change Logs:* Date           Author       Notes* 2018-05-17     armink       the first version*/#ifndef _FAL_CFG_H_
#define _FAL_CFG_H_#include <rtconfig.h>
#include <board.h>/* ===================== 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,        "flash16k",       "onchip_flash_16k",    0,            64*1024, 0}, \{FAL_PART_MAGIC_WORD,       "flash64k",        "onchip_flash_64k",    0,            64*1024, 0}, \{FAL_PART_MAGIC_WORD,       "flash128k_1",     "onchip_flash_128k",   0,            1*128*1024, 0}, \{FAL_PART_MAGIC_WORD,       "flash128k_6",     "onchip_flash_128k",   1*128*1024,   6*128*1024, 0}, \
}
#endif /* FAL_PART_HAS_TABLE_CFG */#endif /* _FAL_CFG_H_ */

注意:
在这里插入图片描述

编译,警告提示

rt-thread\components\fal\src\fal_rtt.c(647): warning:  #223-D: function "strtol" declared implicitly

添加头文件 #include <stdlib.h> 即可。

五、 测试代码

调用 fal_init() 进行初始化。

/** Copyright (c) 2006-2021, RT-Thread Development Team** SPDX-License-Identifier: Apache-2.0** Change Logs:* Date           Author       Notes* 2018-11-06     SummerGift   first version* 2018-11-19     flybreak     add stm32f407-atk-explorer bsp*/#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
#include <fal.h>/* defined the LED0 pin: PF7 */
#define LED0_PIN    GET_PIN(F, 7)int main(void)
{/* set LED0 pin mode to output */rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);fal_init();while (1){rt_pin_write(LED0_PIN, PIN_HIGH);rt_thread_mdelay(500);rt_pin_write(LED0_PIN, PIN_LOW);rt_thread_mdelay(500);}
}

编译下载到开发板。

六、测试结果

在这里插入图片描述
fal 指令
在这里插入图片描述
fal probe 指令
在这里插入图片描述

参考
https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/fal/fal

https://blog.csdn.net/E2242/article/details/134853391

https://shequ.stmicroelectronics.cn/thread-644240-1-1.html

https://www.st.com.cn/zh/microcontrollers-microprocessors/stm32f4-series/documentation.html


http://www.mrgr.cn/news/56599.html

相关文章:

  • 在 Windows 环境下,Git 默认会自动处理 CRLF 和 LF 之间的转换。
  • FileLink内外网文件交换——致力企业高效安全文件共享
  • 来个Oracle一键检查
  • Spring6梳理15——Bean的作用域
  • tracert和ping的区别
  • 「毅硕|生信教程」 micromamba:mamba的C++实现,超越conda
  • Python | Leetcode Python题解之第502题IPO
  • 利用 Direct3D 绘制几何体—7.编译着色器
  • OracleSQL语句 某字段重复数据只取一条
  • word中某些段落行间距无法更改
  • Java 之 Map遍历并删除的几种方法对比
  • 一种用于传感器网络的新型OPC UA PubSub协议绑定(MQTT-SN)
  • go 语言 Gin Web 框架的实现原理探究
  • Java | Leetcode Java题解之第501题二叉搜索树中的众数
  • 有什么好点子帮助更好的学习英语吗?
  • MySQL-事物隔离级别
  • C++ —— 实现一个日期类
  • 使用Mock库进行依赖注入的实用指南
  • TinyC编译器5—词法分析
  • git 下载慢
  • input标签v-model属性失效
  • 信发软件之展示excel文档——未来之窗行业应用跨平台架构
  • 图像处理学习笔记-20241021
  • Ubuntu配置FTP
  • eCAP超声波测距-ePWM电机调速
  • 影刀RPA实战:网页爬虫之我爱听评书