在實際應(yīng)用中,因為單片機本身ROM的容量比較小,如果需要存儲比較大的文件(如圖片、運行數(shù)據(jù)、日志等)一般會選擇外接flash或者sd卡等外設(shè)。那這一講主要講解一下RT-thread如何掛載一個外置flash。
一、硬件介紹
我這里選用的flash芯片是W25Q32,內(nèi)存32M。W25Q32是通過SPI通訊的,所以我們要在MCU上面選用一組SPI用于通訊。我用的MCU是stm32f429vet6,選用SPI1作為通訊。原理圖如下:
二、ENV配置
對于ENV我就不多做介紹了,我前面發(fā)布的教程都介紹過了,RT-thread官網(wǎng)上也有很詳細(xì)的說明。
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的示例,可以直接使用,打開使能即可。
提示:如果默認(rèn)使用的接口和你要使用的不一致,需要自己修改,(你是使用的bsp不一樣,這個默認(rèn)的接口很可能也不一樣,比如stm32f407的bsp和stm32f429的bsp就不同)。
修改的地方也是在Kconfig文件,一般是在工程根目錄下board文件夾里面。
修改完之后重新進(jìn)入menuconfig頁面就能看到變化。
3、重新生成工程
在env輸入下面的命令,重新生成新的工程。
提示:會使用env的話應(yīng)該都知道這個操作。
scons --target=mdk5
三、STM32CubeMX配置
上面只是使能了RT-thread中間層的配置,還需要打開底層HAL庫的硬件接口才行。
1、使用STM32CubeMX配置SPI引腳
STM32CubeMX的使用我前面就有講,具體就不多介紹了,不懂的同學(xué)可以翻一下我之前的博客。
RT-Thread零基礎(chǔ)快速入門第1講——新建工程
打開自己工程里面的STM32CubeMX。
提示:一般的路徑是“根目錄boardCubeMX_Config”。
如:E:stm32f429-norflashboardCubeMX_Config
使能對應(yīng)的SPI,然后看下引腳是否和你的電路一致,如果不對的話可以在右邊的芯片圖上找到你要配置的引腳,修改成對應(yīng)的SPI接口即可。
提示:STM32CubeMX只需要修改SCK、MISO和MOSI三個引腳即可,CS引腳不需要在這里配置。
2、生成新的工程
點擊右上角的GENERATE CODE,生成新工程即可。
注:如果生成工程時提示你是否需要下載新版本的固件庫,可以下載也可以繼續(xù)使用舊的,一般都是沒問題的。
四、掛載FLASH
RT-thread在使用SPI的時候需要先把外設(shè)掛載到SPI總線上(不管你接的是什么外設(shè),只要是SPI接口都需要先掛載)。然后還要掛載FLASH,這個和SPI的掛載是不同的。
如果你上面ENV配置使能了FLASH,那這個掛載部分的示例代碼會被加到你的工程里面。
示例代碼的文件名是spi_flash_init.c,但要注意的是有些bsp可能沒有這個文件,也有一些是沒有這個文件的需要自己寫。
提示:這個文件一般在boardports文件里面。如:E:stm32f429-norflashboardports
不管有沒有這個文件,反正只要把掛載部分的代碼加到你的工程里面,然后調(diào)用就行了,示例代碼如下:
#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,設(shè)備命名為norflash0(這個命名可以自定義)
{
return -RT_ERROR;
};
return RT_EOK;
}
INIT_COMPONENT_EXPORT(rt_hw_spi_flash_init);
#endif
注意:即使你的工程里面有spi_flash_init.c這個文件,也要檢查spi掛載的接口是否正確。
五、運行測試
正常運行的話應(yīng)該是這樣的:
提示:如果出現(xiàn)下面這種情況的話,說明上面的配置沒配好,或者硬件連接有問題
1、查看flash設(shè)備是否掛載成功
可以通過以下指令查看:
list_device
如果掛載成功,會顯示flash的設(shè)備名稱(設(shè)備名稱是上面掛載的時候自定義的)。
提示:設(shè)備名稱太長的話會顯示不全,但是不影響使用。
2、測試flash讀寫
測試數(shù)據(jù)讀寫可以使用sf命令。
提示:可以輸入“sf”,查看所有sf相關(guān)的命令及說明。
1)初始化flash
sf probe spi10
提示:spi10是設(shè)備號,這里要根據(jù)自己實際使用的情況輸入。
2)讀取數(shù)據(jù)
sf read addr size
提示:使用該命令前要先確保probe成功,addr是要讀取flash的地址,size是要讀取的長度。
例如:sf read 0x1000 3
這個命令的意思是從0x1000地址開始讀取,讀取3個字節(jié)長度的數(shù)據(jù)。(輸入命令時地址可以用16進(jìn)制,也可以用10進(jìn)制)。
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ù)是否正確寫入。
六、結(jié)束語
到此,flash的掛載就介紹完了,總的來說整個流程其實是很簡單。但是這一講只簡單的介紹了flash的掛載,更多的應(yīng)用我后面會繼續(xù)講解。
如果這篇文章能夠幫到你,就給我點個贊吧,如果想了解更多RT-thread和單片機的內(nèi)容,可以關(guān)注一下博主,后續(xù)我還會繼續(xù)分享更多的經(jīng)驗給大家。
這一講的源碼下載鏈接:https://pan.baidu.com/s/1N2D8dM31deKIqNqaIQfPiA
提取碼:7nsx
下一講基于flash講解文件系統(tǒng)的應(yīng)用:RT-thread應(yīng)用講解——文件系統(tǒng)