加入星計劃,您可以享受以下權益:

  • 創(chuàng)作內容快速變現(xiàn)
  • 行業(yè)影響力擴散
  • 作品版權保護
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
    • 一、硬件介紹
    • 二、ENV配置
    • 三、STM32CubeMX配置
    • 四、掛載FLASH
    • 五、運行測試
    • 六、結束語
  • 推薦器件
  • 相關推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

RT-thread應用講解——norflash

07/08 14:34
3716
閱讀需 10 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

在實際應用中,因為單片機本身ROM的容量比較小,如果需要存儲比較大的文件(如圖片、運行數(shù)據(jù)、日志等)一般會選擇外接flash或者sd卡等外設。那這一講主要講解一下RT-thread如何掛載一個外置flash。

一、硬件介紹

我這里選用的flash芯片是W25Q32,內存32M。W25Q32是通過SPI通訊的,所以我們要在MCU上面選用一組SPI用于通訊。我用的MCU是stm32f429vet6,選用SPI1作為通訊。原理圖如下:

在這里插入圖片描述

二、ENV配置

對于ENV我就不多做介紹了,我前面發(fā)布的教程都介紹過了,RT-thread官網(wǎng)上也有很詳細的說明。

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,生成新工程即可。

注:如果生成工程時提示你是否需要下載新版本的固件庫,可以下載也可以繼續(xù)使用舊的,一般都是沒問題的。

在這里插入圖片描述

四、掛載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掛載的接口是否正確。

五、運行測試

正常運行的話應該是這樣的:

在這里插入圖片描述

提示:如果出現(xiàn)下面這種情況的話,說明上面的配置沒配好,或者硬件連接有問題

在這里插入圖片描述

1、查看flash設備是否掛載成功

可以通過以下指令查看:

list_device

如果掛載成功,會顯示flash的設備名稱(設備名稱是上面掛載的時候自定義的)。

提示:設備名稱太長的話會顯示不全,但是不影響使用。

在這里插入圖片描述

2、測試flash讀寫

測試數(shù)據(jù)讀寫可以使用sf命令。

提示:可以輸入“sf”,查看所有sf相關的命令及說明。

在這里插入圖片描述

1)初始化flash

sf probe spi10

提示:spi10是設備號,這里要根據(jù)自己實際使用的情況輸入。

2)讀取數(shù)據(jù)

sf read addr size

提示:使用該命令前要先確保probe成功,addr是要讀取flash的地址,size是要讀取的長度。

例如:sf read 0x1000 3
這個命令的意思是從0x1000地址開始讀取,讀取3個字節(jié)長度的數(shù)據(jù)。(輸入命令時地址可以用16進制,也可以用10進制)。

3)寫入數(shù)據(jù)

sf write addr data1 ... dataN

提示:使用該命令前要先確保probe成功,addr是要寫入flash的地址,data1到dataN是具體要寫入的數(shù)據(jù),每個數(shù)據(jù)通過空格隔開。

例如:sf write 0x1000 1 2 3

這個命令的意思是從0x1000地址開始寫入數(shù)據(jù),依次寫入三個數(shù)據(jù)(1 2 3)。

最后貼一個完整的流程:

先檢查flash是否掛載成功,然后測試數(shù)據(jù)讀寫,先從0x1000地址開始讀取3個數(shù)據(jù),數(shù)據(jù)是FF FF FF,然后從0x1000地址開始寫入3個數(shù)據(jù)(1、2、3),最后再讀取0x1000地址,驗證數(shù)據(jù)是否正確寫入。

在這里插入圖片描述

六、結束語

到此,flash的掛載就介紹完了,總的來說整個流程其實是很簡單。但是這一講只簡單的介紹了flash的掛載,更多的應用我后面會繼續(xù)講解。

如果這篇文章能夠幫到你,就給我點個贊吧,如果想了解更多RT-thread和單片機的內容,可以關注一下博主,后續(xù)我還會繼續(xù)分享更多的經(jīng)驗給大家。

這一講的源碼下載鏈接:https://pan.baidu.com/s/1N2D8dM31deKIqNqaIQfPiA
提取碼:7nsx

下一講基于flash講解文件系統(tǒng)的應用:RT-thread應用講解——文件系統(tǒng)

推薦器件

更多器件
器件型號 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊 ECAD模型 風險等級 參考價格 更多信息
ASEMPLV-100.000MHZ-LR-T 1 Abracon Corporation MEMS OSC XO 100.0000MHZ LVDS SMD
$4.89 查看

相關推薦

電子產(chǎn)業(yè)圖譜