介绍了RT-Thread的bsp中如何实现对Flash的读写。用的是野火的F429开发板。
首先找到RT-Thread提供的野火F429开发板的bsp,利用env工具建立一个工程
shellscons --dist --target=mdk5 --project-path="test"
进入test目录,打开env工具,配置menuconfig
shell#输入
menuconfig
打开板子上的Flash外设驱动
随后保存退出。更新pkgs
shellpkgs --update
然后应该就可以打开MKD编译工程了。
关注Keil工程中的Drivers/spi_flash_init.c文件
cstatic 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
crt_device_find这个函数应该是用于找到我们之前创建的SPI设备。SPI总线设备 sfud_device_init(sfud_dev)这个函数用于创建sfud设备,他将我们之前注册的SPI设备信息填充到sfud_dev中作为参数传入 rt_device_register用于注册rt_device设备。挂载在SPI总线上的设备
cstruct 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 芯片的驱动兼容性问题。