RT-Thread配置STM32的SPI Flash,SFUD,FAL,easyflash流程

说明一下环境和设备: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);

如果需要可以留言邮箱,我发完整工程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山间朝暮-CanEve

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值