说明一下环境和设备:RTthread studio+cubemx,芯片是stm32f429bit6+w25q256fv
rtthread版本是4.1
创建工程就不说了,只需要基本工程就行,可以参考我之前的文章STM32使用RT-thread完成点灯,pwm,按键中断,定时器中断,ADC-CSDN博客
这里就直接说需要改哪些地方吧,在基础工程(串口正常打印)上,打开这3个功能(可以单独使用sfud或者sfud+fal),打开后修改相应的地方就行
SPI,并开启sfud
下面我们点开cubemx的文件,把spi相应的引脚配置好(软件nss),并在board.h中添加相应的spi定义,onchipflash等。
struct rt_spi_device *spi_dev_w25q;
rt_uint8_t w25x_read_id=0x90;
rt_uint8_t id[5] = {0};
spi_dev_w25q =(struct rt_spi_device *)rt_device_find("spi50");
if (spi_dev_w25q == RT_NULL)
{
rt_kprintf("spi can't find %s device!\n", "spi5");
return;
}
else{
rt_kprintf("spi find %s device!\n", "spi5");
rt_spi_send_then_recv(spi_dev_w25q, &w25x_read_id, 1, id, 5);
rt_kprintf("use rt_spi_send_then_recv() read w25q ID is:%x%x\n",id[3], id[4]);
}
这个是直接操作spi的,spi50就是spi5下的第一个设备,如果配置没有问题,就能成功读出芯片ID,这个可以参考flash的example
一般引脚配置正确都是没问题的。
下一步可以添加自动初始化sfud设备
#define W25QXX_SPI "spi5"
#define W25QXX_SPI0 "spi50"
#define S_FLASH_DEV_NAME "W25Q256"
static int rt_hw_spi_flash_init(void)//ok
{
rt_hw_spi_device_attach( W25QXX_SPI , W25QXX_SPI0 , GPIOF, GPIO_PIN_6);
if (RT_NULL == rt_sfud_flash_probe( S_FLASH_DEV_NAME , W25QXX_SPI0 ))
{
LOG_E("spi flash probe failed!\n");
return -RT_ERROR;
};
return RT_EOK;
}
INIT_COMPONENT_EXPORT(rt_hw_spi_flash_init);
最后一句就是添加到初始化,如果开启调试信息,复位时就会打印相应运行信息,这里需要配置cs引脚(cubemx中一定要配置引脚的模式,不然可能初始化时会没有开启相应时钟)
没有问题后基本上操作flash就没有问题了。
下一步添加fal
添加后编译大概率报错,因为自带示例程序,只需要把文件改成这样的结构就行(复制删除移动或者排除编译都可以),当然你要自己写也行。
然后还需要修改相应文件fal_falsh_sfud_port.c
头文件
#define FLASH_SIZE_GRANULARITY_16K (4 * 16 * 1024)
#define FLASH_SIZE_GRANULARITY_64K (1 * 64 * 1024)
#define FLASH_SIZE_GRANULARITY_128K (3* 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;
extern struct fal_flash_dev nor_flash0;
//&stm32f2_onchip_flash,
/* flash device table */
#define FAL_FLASH_DEV_TABLE \
{ &stm32_onchip_flash_16k, \
&stm32_onchip_flash_128k, \
&nor_flash0, \
}
/* ====================== Partition Configuration ========================== */
#ifdef FAL_PART_HAS_TABLE_CFG
/* partition table */
#define FAL_PART_TABLE \
{ \
{FAL_PART_MAGIC_WORD, "bl", "onchip_flash_16k", 0, FLASH_SIZE_GRANULARITY_16K, 0}, \
{FAL_PART_MAGIC_WORD, "app", "onchip_flash_128k", 0, FLASH_SIZE_GRANULARITY_128K, 0}, \
{FAL_PART_MAGIC_WORD, "easyflash", "W25Q256", 0, 10*1024*1024, 0}, \
{FAL_PART_MAGIC_WORD, "download", "W25Q256", 10*1024*1024, 2*1024*1024, 0}, \
}
其中FAL_FLASH_DEV_TABLE和FAL_PART_TABLE根据自己情况进行修改,W25Q256是之前定义的。然后onchip的是其他头文件中可能有的,可以直接搜索文件看是否有相识的。
添加相应的头文件目录
没有报错之后使用fal_init();初始化
正常的话就会如下图
easyflash开启后操作也是差不多de
文件结构如下,如果ports文件夹不在只需要搜索一下,再右键添加构建就行
查找缺少文件的关键词
搜索结果如下,把需要的文件右键添加构建就行
修改部分,改为和fal中的一样,添加所有需要的头文件等
没有报错后就使用easyflash_init();进行初始化
成功就是这样的
测试代码
uint8_t read_ef[8] = {0};
char *read;
ef_set_env("param1", "123456");
read=ef_get_env("param1");
ef_set_env_blob("param2", "9876",8);
ef_get_env_blob("param2",read_ef,8,NULL);
rt_kprintf("use ef_read read w25q :%s\n blob %s\n",read,read_ef);
如果需要可以留言邮箱,我发完整工程