2025-09-27
单片机
00

目录

创建工程
简单阅读源码
简单应用

介绍了RT-Thread的bsp中如何实现对Flash的读写。用的是野火的F429开发板。

创建工程

首先找到RT-Thread提供的野火F429开发板的bsp,利用env工具建立一个工程

shell
scons --dist --target=mdk5 --project-path="test"

进入test目录,打开env工具,配置menuconfig

shell
#输入 menuconfig

image.png 打开板子上的Flash外设驱动

image.png 随后保存退出。更新pkgs

shell
pkgs --update

然后应该就可以打开MKD编译工程了。

简单阅读源码

关注Keil工程中的Drivers/spi_flash_init.c文件

c
static int rt_hw_spi_flash_init(void) { __HAL_RCC_GPIOF_CLK_ENABLE(); rt_hw_spi_device_attach("spi5", "spi50", rt_pin_get("PF.6")); if (RT_NULL == rt_sfud_flash_probe("W25Q128", "spi50")) { return -RT_ERROR; } return RT_EOK; } INIT_COMPONENT_EXPORT(rt_hw_spi_flash_init);

上面这段代码主要功能是挂载一个 SPI 设备到指定的 SPI 总线,并向内核注册 SPI 设备。 rt_sfud_flash_probe("W25Q128", "spi50")利用了SFUD组件

c
//函数的大概调用过程 rt_sfud_flash_probe(const char *spi_flash_dev_name, const char *spi_dev_name); --->rt_sfud_flash_probe_ex(const char *spi_flash_dev_name, const char *spi_dev_name, struct rt_spi_configuration *spi_cfg, struct rt_qspi_configuration *qspi_cfg); --->(struct rt_spi_device *) rt_device_find(spi_dev_name); --->sfud_device_init(sfud_dev); --->rt_device_register
c
rt_device_find这个函数应该是用于找到我们之前创建的SPI设备。SPI总线设备 sfud_device_init(sfud_dev)这个函数用于创建sfud设备,他将我们之前注册的SPI设备信息填充到sfud_dev中作为参数传入 rt_device_register用于注册rt_device设备。挂载在SPI总线上的设备
c
struct spi_flash_device { struct rt_device flash_device; struct rt_device_blk_geometry geometry; struct rt_spi_device * rt_spi_device; struct rt_mutex lock; void * user_data; };

简单应用

c
// 将代码烧写到开发板上后可以打开MobaXterm等类似设备 // 输入命令 sf 就可以得到相关用法提示.完成对flash的读写 sf probe spi50 // 挂载设备 sf read addr size sf write addr data...

SFUD 是一款开源的串行 Flash 通用驱动库,由 RT-Thread 社区的 Armink 开发。它的设计目标是解决嵌入式系统中不同品牌、不同型号 SPI Flash 芯片的驱动兼容性问题。