RT-thread应用讲解——norflash

  • 07/08 14:34

在实际应用中,因为单片机本身ROM的容量比较小,如果需要存储比较大的文件(如图片、运行数据、日志等)一般会选择外接flash或者sd卡等外设。那这一讲主要讲解一下RT-thread如何挂载一个外置flash。

一、硬件介绍

我这里选用的flash芯片是W25Q32,内存32M。W25Q32是通过SPI通讯的,所以我们要在MCU上面选用一组SPI用于通讯。我用的MCU是stm32f429vet6,选用SPI1作为通讯。原理图如下:

在这里插入图片描述

二、ENV配置

对于ENV我就不多做介绍了,我前面发布的教程都介绍过了,RT-thread官网上也有很详细的说明。

env使用方法:https://www.rt-thread.org/document/site/programming-manual/env/env/#bsp-menuconfig

1、使能SPI

输入以下指令,打开配置页面。

menuconfig

使能自己要使用的SPI接口。

在这里插入图片描述

提示:如果没有自己要用的SPI接口的话,可以通过修改Kconfig文件自己添加。

Kconfig文件一般是在工程根目录下board文件夹里面。

在这里插入图片描述

2、使能FLASH

RT-thread有一个FLASH的示例,可以直接使用,打开使能即可。

在这里插入图片描述

提示:如果默认使用的接口和你要使用的不一致,需要自己修改,(你是使用的bsp不一样,这个默认的接口很可能也不一样,比如stm32f407的bsp和stm32f429的bsp就不同)。

修改的地方也是在Kconfig文件,一般是在工程根目录下board文件夹里面。

在这里插入图片描述

修改完之后重新进入menuconfig页面就能看到变化。

3、重新生成工程

在env输入下面的命令,重新生成新的工程。

提示:会使用env的话应该都知道这个操作。

scons --target=mdk5

三、STM32CubeMX配置

上面只是使能了RT-thread中间层的配置,还需要打开底层HAL库的硬件接口才行。

1、使用STM32CubeMX配置SPI引脚

STM32CubeMX的使用我前面就有讲,具体就不多介绍了,不懂的同学可以翻一下我之前的博客。

RT-Thread零基础快速入门第1讲——新建工程

打开自己工程里面的STM32CubeMX。

提示:一般的路径是“根目录boardCubeMX_Config”。

如:E:stm32f429-norflashboardCubeMX_Config

使能对应的SPI,然后看下引脚是否和你的电路一致,如果不对的话可以在右边的芯片图上找到你要配置的引脚,修改成对应的SPI接口即可。

提示:STM32CubeMX只需要修改SCK、MISO和MOSI三个引脚即可,CS引脚不需要在这里配置。

在这里插入图片描述

2、生成新的工程

点击右上角的GENERATE CODE,生成新工程即可。

注:如果生成工程时提示你是否需要下载新版本的固件库,可以下载也可以继续使用旧的,一般都是没问题的。

在这里插入图片描述

四、挂载FLASH

RT-thread在使用SPI的时候需要先把外设挂载到SPI总线上(不管你接的是什么外设,只要是SPI接口都需要先挂载)。然后还要挂载FLASH,这个和SPI的挂载是不同的。

如果你上面ENV配置使能了FLASH,那这个挂载部分的示例代码会被加到你的工程里面。

示例代码的文件名是spi_flash_init.c,但要注意的是有些bsp可能没有这个文件,也有一些是没有这个文件的需要自己写。

提示:这个文件一般在boardports文件里面。如:E:stm32f429-norflashboardports

不管有没有这个文件,反正只要把挂载部分的代码加到你的工程里面,然后调用就行了,示例代码如下:

#include <rtthread.h>
#include "spi_flash.h"
#include "spi_flash_sfud.h"
#include "drv_spi.h"

#if defined(BSP_USING_SPI_FLASH)
static int rt_hw_spi_flash_init(void)
{
    __HAL_RCC_GPIOB_CLK_ENABLE();
    rt_hw_spi_device_attach("spi1", "spi10", GPIOA, GPIO_PIN_4);  // 挂载到spi1,CS引脚配置为PA4

    if (RT_NULL == rt_sfud_flash_probe("norflash0", "spi10")) // 挂载flash,设备命名为norflash0(这个命名可以自定义)
    {
        return -RT_ERROR;
    };

    return RT_EOK;
}
INIT_COMPONENT_EXPORT(rt_hw_spi_flash_init);
#endif

注意:即使你的工程里面有spi_flash_init.c这个文件,也要检查spi挂载的接口是否正确。

五、运行测试

正常运行的话应该是这样的:

在这里插入图片描述

提示:如果出现下面这种情况的话,说明上面的配置没配好,或者硬件连接有问题

在这里插入图片描述

1、查看flash设备是否挂载成功

可以通过以下指令查看:

list_device

如果挂载成功,会显示flash的设备名称(设备名称是上面挂载的时候自定义的)。

提示:设备名称太长的话会显示不全,但是不影响使用。

在这里插入图片描述

2、测试flash读写

测试数据读写可以使用sf命令。

提示:可以输入“sf”,查看所有sf相关的命令及说明。

在这里插入图片描述

1)初始化flash

sf probe spi10

提示:spi10是设备号,这里要根据自己实际使用的情况输入。

2)读取数据

sf read addr size

提示:使用该命令前要先确保probe成功,addr是要读取flash的地址,size是要读取的长度。

例如:sf read 0x1000 3
这个命令的意思是从0x1000地址开始读取,读取3个字节长度的数据。(输入命令时地址可以用16进制,也可以用10进制)。

3)写入数据

sf write addr data1 ... dataN

提示:使用该命令前要先确保probe成功,addr是要写入flash的地址,data1到dataN是具体要写入的数据,每个数据通过空格隔开。

例如:sf write 0x1000 1 2 3

这个命令的意思是从0x1000地址开始写入数据,依次写入三个数据(1 2 3)。

最后贴一个完整的流程:

先检查flash是否挂载成功,然后测试数据读写,先从0x1000地址开始读取3个数据,数据是FF FF FF,然后从0x1000地址开始写入3个数据(1、2、3),最后再读取0x1000地址,验证数据是否正确写入。

在这里插入图片描述

六、结束语

到此,flash的挂载就介绍完了,总的来说整个流程其实是很简单。但是这一讲只简单的介绍了flash的挂载,更多的应用我后面会继续讲解。

如果这篇文章能够帮到你,就给我点个赞吧,如果想了解更多RT-thread和单片机的内容,可以关注一下博主,后续我还会继续分享更多的经验给大家。

这一讲的源码下载链接:https://pan.baidu.com/s/1N2D8dM31deKIqNqaIQfPiA
提取码:7nsx

下一讲基于flash讲解文件系统的应用:RT-thread应用讲解——文件系统

人工客服
(售后/吐槽/合作/交友)
  • 器件型号:NC7S08M5X_NL
    • 数量 1
    • 建议厂商 Fairchild Semiconductor Corporation
    • 器件描述 AND Gate, HC/UH Series, 1-Func, 2-Input, CMOS, PDSO5, 1.60 MM, LEAD FREE, MO-178AA, SOT-23, 5 PIN
    • 参考价格 暂无数据
    • 风险等级
    • ECAD模型
    • 数据手册
    • 查看更多信息
  • 器件型号:KSZ8863MLLI-TR
    • 数量 1
    • 建议厂商 Microchip Technology Inc
    • 器件描述 DATACOM, LAN SWITCHING CIRCUIT
    • 参考价格 $5.95
    • 风险等级
    • ECAD模型
    • 数据手册
    • 查看更多信息
  • 器件型号:CY62167EV30LL-45BVXIT
    • 数量 1
    • 建议厂商 Cypress Semiconductor
    • 器件描述 Standard SRAM, 1MX16, 45ns, CMOS, PBGA48, 6 X 8 MM, 1 MM HEIGHT, ROHS COMPLIANT, VFBGA-48
    • 参考价格 $29.09
    • 风险等级
    • ECAD模型
    • 数据手册
    • 查看更多信息

相关资讯

  1. 1.
  2. 2.
  3. 3.
  4. 4.
  5. 5.
  6. 6.
  7. 7.
  8. 8.
  9. 9.
  10. 10.
  11. 11.
  12. 12.
  13. 13.
  14. 14.
  15. 15.
  16. 16.
  17. 17.
  18. 18.
  19. 19.
  20. 20.
查看全部20条内容