Rtthread学习笔记(十)RT-Thread Studio的开启SPI1总线,挂载外部flash(W25Q64)做从线设备,使用fatfs elm文件系统

一、步骤

1.打开RT-Thread Setting中软件模拟I2C

Rtthread学习笔记(十)RT-Thread Studio的开启SPI1总线,挂载外部flash(W25Q64)做从线设备,使用fatfs elm文件系统_第1张图片
在这里插入图片描述
W25Q64是华邦公司推出的大容量SPI FLASH产品,其容量为64Mb。W25Q64将8M字节的容量分为128个块,每个块大小为64K字节,每个块又分为16个扇区,每个扇区4K个字节。W25Q64的最小擦除单位为一个扇区,也就是每次必须擦除4K个字节。
Rtthread学习笔记(十)RT-Thread Studio的开启SPI1总线,挂载外部flash(W25Q64)做从线设备,使用fatfs elm文件系统_第2张图片

2.开启board.h/stm32F1xx_hal_config.h中关于SPI的宏定义

在这里插入图片描述
在这里插入图片描述

3.用stm32cube初始化spi相关内容(或直接复制RT文件夹下对应的bsp中代码)

复制cube中stm32f1xx_hal_msp.c中的void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)到board.c中,HAL库会自动初始化该函数,因为本来存在虚函数。

此部分代码也可从rtthread文件夹中对应的bsp目录中,直接打开stm32f1xx_hal_msp.c,进行复制对应部分的代码进行修改。
在这里插入图片描述

void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)
{

  GPIO_InitTypeDef GPIO_InitStruct;
  if(hspi->Instance==SPI1)
  {
  /* USER CODE BEGIN SPI1_MspInit 0 */

  /* USER CODE END SPI1_MspInit 0 */
    /* Peripheral clock enable */
    __HAL_RCC_SPI1_CLK_ENABLE();

    /**SPI3 GPIO Configuration
    PA5     ------> SPI1_SCK
    PA6     ------> SPI1_MISO
    PA7     ------> SPI1_MOSI
    */
    GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_7;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_6;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /* USER CODE BEGIN SPI1_MspInit 1 */

  /* USER CODE END SPI1_MspInit 1 */
  }

}

在这里插入图片描述
像rt_hw_spi_init(void)这种初始化SPI的函数,在drv_spi.c的最后面已经为我们自动写好了,会根据初始化的配置进行编译,所以不需要进行改动。
在这里插入图片描述

编译下载,到此处已经将SPI总线设备注册到系统中
Rtthread学习笔记(十)RT-Thread Studio的开启SPI1总线,挂载外部flash(W25Q64)做从线设备,使用fatfs elm文件系统_第3张图片

4.文件系统初始化

Rtthread学习笔记(十)RT-Thread Studio的开启SPI1总线,挂载外部flash(W25Q64)做从线设备,使用fatfs elm文件系统_第4张图片

SPI的总线设备已经注册完毕,接下来需要进行文件系统初始化,这里直接使用板载的SPI Flash W25Q64进行测试,新建app_spi.c。第1、2步在文件系统初始化中就已经被调用了,接下来完成创建块设备及之后的内容。

#include 
#include 
#include 
#include "drv_spi.h"


static int rt_hw_spi_flash_init(void)
{
    __HAL_RCC_GPIOB_CLK_ENABLE();
    rt_hw_spi_device_attach("spi1", "spi10", GPIOC, GPIO_PIN_0);// spi10 表示挂载在 spi3 总线上的 0 号设备,PC0是片选,这一步就可以将从设备挂在到总线中。

    if (RT_NULL == rt_sfud_flash_probe("W25Q64", "spi10"))  //注册块设备,这一步可以将外部flash抽象为系统的块设备
    {
        return -RT_ERROR;
    };

    return RT_EOK;
}
/* 导出到自动初始化 */
INIT_COMPONENT_EXPORT(rt_hw_spi_flash_init);

编译下载
在这里插入图片描述

5.挂载文件系统

总线设备、从设备都已近注册完毕,接下来就是在从设备上挂载文件系统,实现最终的使用。在app-spi.c文件中编写如下函数尽心挂载文件系统。

static int mnt_init(void)
{
	mkfs("elm","W25Q64");//挂在前需格式化
    if(dfs_mount("W25Q64","/","elm",0,0)==0) //挂载文件系统,参数:块设备名称、挂载目录、文件系统类型、读写标志、私有数据0
    {
        rt_kprintf("dfs mount success\r\n");
    }
    else
    {
        rt_kprintf("dfs mount failed\r\n");
    }
}
INIT_ENV_EXPORT(mnt_init);

Rtthread学习笔记(十)RT-Thread Studio的开启SPI1总线,挂载外部flash(W25Q64)做从线设备,使用fatfs elm文件系统_第5张图片
Rtthread学习笔记(十)RT-Thread Studio的开启SPI1总线,挂载外部flash(W25Q64)做从线设备,使用fatfs elm文件系统_第6张图片
Rtthread学习笔记(十)RT-Thread Studio的开启SPI1总线,挂载外部flash(W25Q64)做从线设备,使用fatfs elm文件系统_第7张图片
文件系统挂载成功,Fish操作指令成功,更多具体Fish指令及开发的函数接口参照RT官方的虚拟文件系统章节或者进入RT-Thread Settings右键应用手册。RTThread官方虚拟函数章节

你可能感兴趣的:(RT-Thread,stm32)