U盤是一個很常用的存儲設備,它是通過usb實現(xiàn)數(shù)據(jù)傳輸的,那么在stm32上面,我們要怎么接入U盤,并實現(xiàn)文件讀寫呢?這一講基于RT-thread操作系統(tǒng),我來介紹一下如何使用usb host實現(xiàn)U盤的讀寫。
RT-thread也有關于U盤的使用,可以先看一下,我這邊主要講一下重點。
STM32上使用USB Host讀寫U盤:https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/application-note/driver/usb/an0046-rtthread-driver-usbh
特別說明:本教程的配置如下:
配置 | 說明 |
---|---|
MCU | STM32F429VET6 |
RT-thread源碼版本 | v4.0.3 |
U盤 | 閃迪文件格式FAT |
一、STM32CubeMX配置
使用STM32CubeMX配置底層接口(路徑一般在工程目錄下boardCubeMX_Config文件夾里面)
不懂的同學可以看下我之前的博客。
RT-Thread零基礎快速入門第1講——新建工程
打開USB_OTG_FS,配置模式為Host_Only,使能中斷,其他按默認即可。
二、ENV配置
1、使能USB Host
如果你不知道env怎么使用,可以在下面這個鏈接查看。
env使用方法:https://www.rt-thread.org/document/site/programming-manual/env/env/#bsp-menuconfig
用env打開工程,進入menuconfig配置頁面,打開USB Host,配置掛載目錄。
提示:除了U盤,如果沒有掛載其他存儲設備,這里直接掛載到根目錄即可,如果有其他設備已經掛載到根目錄了,這里就要選擇其他目錄。
2、使能文件系統(tǒng)
USB Host讀寫U盤的功能需要依賴RT-Thread的虛擬文件系統(tǒng),所以這里要打開文件系統(tǒng),不然會報錯。
3、重新生成工程
在env輸入下面的命令,重新生成新的工程。
提示:會使用env的話應該都知道這個操作。
scons --target=mdk5
三、運行測試
啟動設備,插入U盤,正常識別到U盤的話會提示找到一個設備并顯示該設備的內存大小(如下圖所示)。輸入ls命令,可以查看U盤里面的文件(文件的操作命令跟linux系統(tǒng)是一樣的)。
正常到這里其實就已經完成了U盤的掛載和讀寫了。如果還不放心,可以按照官網給的測試用例再跑一遍。
測試用例如下:
#include <dfs_posix.h>
#define TEST_FN "/test_usbh.c"
static char test_data[120], buffer[120];
void readwrite(const char* filename)
{
int fd;
int index, length;
fd = open(TEST_FN, O_WRONLY | O_CREAT | O_TRUNC, 0);
if (fd < 0)
{
rt_kprintf("open file for write failedn");
return;
}
for (index = 0; index < sizeof(test_data); index ++)
{
test_data[index] = index + 27;
}
length = write(fd, test_data, sizeof(test_data));
if (length != sizeof(test_data))
{
rt_kprintf("write data failedn");
close(fd);
return;
}
close(fd);
fd = open(TEST_FN, O_RDONLY, 0);
if (fd < 0)
{
rt_kprintf("check: open file for read failedn");
return;
}
length = read(fd, buffer, sizeof(buffer));
if (length != sizeof(buffer))
{
rt_kprintf("check: read file failedn");
close(fd);
return;
}
for (index = 0; index < sizeof(test_data); index ++)
{
if (test_data[index] != buffer[index])
{
rt_kprintf("check: check data failed at %dn", index);
close(fd);
return;
}
}
rt_kprintf("usb host read/write udisk successfulrn");
close(fd);
}
MSH_CMD_EXPORT(readwrite, usb host read write test);
上面這段測試代碼運行結果如下:
這段代碼的作用是新建一個test_usbh.c文件,并寫入一些數(shù)據(jù),運行完之后可以拔出u盤,然后在電腦上查看test_usbh.c文件的內容來驗證讀寫的數(shù)據(jù)是否正常。
test_usbh.c文件的內容如下:
四、常見問題解答
1、ENV配置里面沒有USB Host怎么辦?
原因:RT-thread的源碼不是4.0.2以上版本的
解決辦法:使用新版的源碼,或者在舊版的基礎上移植USB Host的代碼,USB Host的代碼結構很清晰,把驅動代碼和框架代碼這兩部分移植過來即可。
2、USB Host的配置都對了,但是U盤識別不出來。
如果USB Host的配置和硬件電路都確認沒問題的話,有可能是掛載的問題,比如掛載的目錄已經有其他設備掛載了,或者設備最大掛載數(shù)量不夠,RT-thread掛載設備是有限制掛載數(shù)量的,可以在ENV配置里面修改,如果你掛載的設備數(shù)量大于最大掛載數(shù),大于那部分設備就掛載不上了。
3、能識別到U盤的內存,但是讀不到U盤里面的文件。
跟U盤的文件系統(tǒng)格式有關系,我試了幾個U盤,F(xiàn)AT或FAT32格式都是可以的,NTFS格式有些可以,有些不行,這個就有點奇怪了,原因還不確定。
五、結束語
好了,關于U盤讀寫的介紹就到這里,如果還有什么問題,歡迎在評論區(qū)留言。如果這篇文章能夠幫到你,就給我點個贊吧,如果想了解更多RT-thread和單片機的內容,可以關注一下博主,后續(xù)我還會繼續(xù)分享更多的經驗給大家。
教程相關源碼:https://pan.baidu.com/s/1N2D8dM31deKIqNqaIQfPiA
提取碼:7nsx
RT-thread相關教程匯總:https://blog.csdn.net/ShenZhen_zixian/article/details/120563891