Rtthread學習筆記(十)RT-Thread Studio的開啓SPI1總線,掛載外部flash(W25Q64)做從線設備,使用fatfs elm文件系統

一、步驟

1.打開RT-Thread Setting中軟件模擬I2C

在這裏插入圖片描述
在這裏插入圖片描述
W25Q64是華邦公司推出的大容量SPI FLASH產品,其容量爲64Mb。W25Q64將8M字節的容量分爲128個塊,每個塊大小爲64K字節,每個塊又分爲16個扇區,每個扇區4K個字節。W25Q64的最小擦除單位爲一個扇區,也就是每次必須擦除4K個字節。
在這裏插入圖片描述

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總線設備註冊到系統中
在這裏插入圖片描述

4.SPI從設備驅動編寫

SPI的總線設備已經註冊完畢,接下來需要進行SPI從設備驅動編寫,這裏直接使用板載的SPI Flash W25Q64進行測試,新建app_spi.c。

#include <rtthread.h>
#include <board.h>
#include <rtdevice.h>
#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);

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
文件系統掛載成功,Fish操作指令成功,更多具體Fish指令及開發的函數接口參照RT官方的虛擬文件系統章節或者進入RT-Thread Settings右鍵應用手冊。RTThread官方虛擬函數章節

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章