STM32 SD卡實現USB虛擬U盤

2021-10-18 19:29:43 字數 2876 閱讀 7082

之前的文章中介紹過stm32讀寫sd卡和fatfs檔案系統相關的知識。今天將在這基礎上介紹stm32通過usb口虛擬u盤的知識。即插入usb介面後,電腦將sd卡識別為u盤,可以直接讀寫sd卡內的檔案。

硬體環境:stm32f407zgt6

軟體環境:stm32cubemx v5.5.0

hal庫版本:stm32cubef4 firmware package v1.24.0 

1.stm32cubemx配置

首先sd卡為sdio介面,時鐘等基礎配置、sdio介面配置和fatfs檔案系統的配置參考之前的文章《stm32cubemx之sdio+fatfs讀寫sd卡》。之後需要配置usb介面,f407有兩個usb介面,這裡使用usb_otg_fs介面,模式選擇為裝置模式device_only,其它配置預設即可。

在中介軟體選單下選擇usb_device,選擇大容量儲存裝置(mass storage class),其它引數預設即可。

生成**之前,系統堆疊配置大一些:

2.程式編寫

需要使用者實現的只有usb虛擬u盤相關的函式,都在usbd_storage_if.c檔案中。需要實現以下幾個函式,其中中文注釋的四個為必須實現的,其它的可選。

usbd_storagetypedef usbd_storage_inte***ce_fops_fs =;
獲取容量函式:

int8_t storage_getcapacity_fs(uint8_t lun, uint32_t *block_num, uint16_t *block_size)
判斷u盤狀態函式:

int8_t storage_isready_fs(uint8_t lun)return (usbd_ok);/* user code end 4 */}
u盤讀資料函式:

int8_t storage_read_fs(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)return (usbd_ok);/* user code end 6 */}
u盤寫資料函式:​​​​​​​

int8_t storage_write_fs(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)return (usbd_ok);/* user code end 7 */}
完成之後,在主函式中初始化後新增相關測試程式,在sd卡新建乙個檔案,並寫入資料。​​​​​​​

retsd = f_mount(&sdfatfs, (tchar const*)sdpath, 0);//掛載retsd = f_open(&sdfile,(const char*)"測試.txt",fa_create_always|fa_write);retsd = f_write(&sdfile,filebuf,17,&bw);retsd = f_close(&sdfile);
執行程式後,將usb線插入電腦,電腦識別出乙個u盤,開啟後可看到u盤內的檔案及內容與所以寫程式一致,說明程式正確。

通過電腦在u盤中新建乙個檔案,123.txt,任意寫入一些內容。同時將剛才的寫檔案的程式改為讀檔案,並重新執行程式。       ​​​​​​​

retsd = f_open(&sdfile,(const char*)"123.txt",fa_open_existing|fa_read);//開啟檔案if(retsd==fr_ok)retsd = f_close(&sdfile);
可以看到程式讀取的資料與電腦上新建並寫入的內容一致,說明程式正確。

3.總結

usb虛擬u盤的介面有很多應用,比如,可以通過usb介面直接sd卡內的匯出檔案。也可以利用該功能實現iap功能,將bin檔案拷貝到sd卡,boot程式讀取sd卡進行程式公升級。應用時需要注意usb介面操作sd卡和程式操作sd卡不能同時進行,以免發生衝突。

STM32 SPI方式讀寫SD卡

前段時間在51上模擬spi實現了對sd卡的讀取,效果還算不錯,最近將其移植到stm32上,不過使用硬體spi和使用軟體spi還是有差別的。如下 void user spiinit void spi初始化以後就可以寫spi讀寫函式了,以下兩個函式參照了網上的資料,出處找不到了,但是這兩個函式幫了我大忙...

STM32掛載SD卡記錄日誌

stm32掛載sd卡記錄日誌 程式主要是在前一篇的基礎上進行。使用cube配置stm32掛載tf卡,請看 記錄日誌主要是將執行中的資料轉換為字串,然後再寫入到sd卡。需要解決兩個問題 程式中各種格式的資料變數轉換為字串 sd卡檔案關閉後再次開啟繼續接著寫。解決第乙個問題是使用函式sprintf 函式...

STM32初始化SD卡流程

1,初始化sdio外設,關閉sdio時鐘。2,上電,開啟時鐘,注意此時時鐘應不能超過400khz,且此時是只有一位資料線,要到初始化完成後再調時鐘與資料線寬度。3,延時最低74個時鐘週期。使時鐘與sd卡穩定,否則會出錯。4,傳送cmd0,需要返回0x01,進入idle狀態 5,為了區別sd卡是2.0...