日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

USB应用开发笔记之一:STM32上实现USB主机读写U盘

發(fā)布時間:2024/7/23 编程问答 71 豆豆
生活随笔 收集整理的這篇文章主要介紹了 USB应用开发笔记之一:STM32上实现USB主机读写U盘 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

??在項目應(yīng)用中,經(jīng)常會有對外交換數(shù)據(jù)的需求。USB接口讀寫U盤無疑是一種頗為方便的選擇。在這一篇中,我們就來討論如何在STM32上實現(xiàn)USB主機讀寫U盤文件的方法。

1、應(yīng)用概述

??在我們的產(chǎn)品上有這樣一個需求,希望通過大容量的U盤存取數(shù)據(jù)。我們來分析一下這個需求的具體內(nèi)容。

??首先在硬件上我們需要有相應(yīng)的USB端口,這一點在產(chǎn)品設(shè)計時就已經(jīng)考慮并實現(xiàn),所以硬件方面我們就不再過多的表述。

??其次我們需要為這個USB的硬件接口編寫驅(qū)動,就是實現(xiàn)USB端口的底層操作,如IO配置、終端處理等,這是移植的主要工作。

??再者我們需要移植面向大容量存儲的USB Host庫,這也是我們需要做的工作之一。其實USB主機庫本身并不需要我們做什么,但我們要清楚它需要我們提供些什么。

??最后我們還要實現(xiàn)一個應(yīng)用層操作,它將用于實現(xiàn)我們的讀寫數(shù)據(jù)的最終目標(biāo)。在開發(fā)過程中這其實是重點工作,但在這篇文章中他不是重點。我們主要是要實現(xiàn)USB主機庫面向大容量存儲設(shè)備的移植問題。

2、USB庫的移植

??在這個產(chǎn)品中使用的是STM32F407作為控制單元,所以我們使用STM32的USB主機庫來實現(xiàn)。接下來就看一看STM32的USB主機庫移植問題。我們使用STM32CubeMX來實現(xiàn)USB的相關(guān)配置。

??第一步,我們來配置USB的連接端口,我們連接中找到USB_OTG_FS,在右側(cè)的選項中選擇Host_Only,如下圖所示:

??然后在Middleware中找到USB_HOST,并在右側(cè)“Class for FS IP”中選擇“Mass Storage Host Class”配置為大容量存儲設(shè)備。如下圖所示:

??接著在Middleware中找到FATFS,并在右側(cè)選中“USB Disk”。下方的參數(shù)中,將CODE_PAGE設(shè)置為簡體中文。具體如下圖所示:

??最后需要在終端中將USB的全局中斷選中,并設(shè)定中斷級別,具體如下圖所示:

??中斷必須打開,中斷級別可以根據(jù)需要設(shè)置。中斷會監(jiān)測USB的狀態(tài),所以中斷不打開,USB庫無法工作。完成上述配置后就可以生成源碼了,然后在此基礎(chǔ)上進(jìn)一步開發(fā)。

??對于STM32的USB主機庫的移植有兩個文件是必須要寫的,就是usbh_conf.c和usbh_conf.h文件。這兩個文件文件實現(xiàn)USB的基礎(chǔ)配置,以及庫需要調(diào)用的基礎(chǔ)函數(shù)。在我們使用STM32CubeMX來配置和建立項目時,usbh_conf.c和usbh_conf.h文件也一并生成好了,不需要我們再去單獨編寫這些平臺相關(guān)的函數(shù)。

3、應(yīng)用實現(xiàn)

??因為使用STM32CubeMX來配置和建立項目的緣故,使得USB主機庫的移植非常簡單,但我們還需要編寫應(yīng)用層的代碼。應(yīng)用層代碼主要實現(xiàn)兩個方面的內(nèi)容:一是編寫主機庫需要回調(diào)的獲取USB狀態(tài)的函數(shù);二是輪詢處理主機庫中的USBH_Process函數(shù)以及我們需要處理的工作。

??首先來看應(yīng)用處理回調(diào)函數(shù)。這個函數(shù)是主機庫所要求的,用于處理與用戶應(yīng)用相關(guān)的操作,這個函數(shù)的原型如下:

??void (*pUsrFunc)(USBH_HandleTypeDef *phost, uint8_t id)

??如果我們的操作比較簡單,我們可以在這個函數(shù)中直接完成,在測試時比驕傲方便,在復(fù)雜一點的應(yīng)用中不建議這么做。在這里我們實現(xiàn)這個函數(shù)如下:

/* USB應(yīng)用處理回調(diào)函數(shù) */ static void USBH_UserProcess (USBH_HandleTypeDef *phost, uint8_t id) {switch(id){case HOST_USER_SELECT_CONFIGURATION: ? break; ? case HOST_USER_DISCONNECTION: ? Appli_state = APPLICATION_DISCONNECT; ? break; ? case HOST_USER_CLASS_ACTIVE: ? Appli_state = APPLICATION_READY; ? break; ? case HOST_USER_CONNECTION: ? Appli_state = APPLICATION_START; ? break; ? default: ? break;} }

??我們還需要輪詢USBH_Process函數(shù)并處理我們的應(yīng)用任務(wù),如讀寫文件操作等。我們在這一函數(shù)中,先調(diào)用USBH_Process函數(shù),然后根據(jù)當(dāng)前的狀態(tài)來決定應(yīng)處理的工作。在這里,我們希望在USB檢測到U盤準(zhǔn)備好后對齊進(jìn)行讀寫操作,所以我們實現(xiàn)如下:

/* USB通訊數(shù)據(jù)處理 */ void McUsbDataProcess(void) {/* USB 主機過程:應(yīng)在主循環(huán)中調(diào)用,運行主機協(xié)議棧 */USBH_Process(&hUsbHostFS);switch(Appli_state){case APPLICATION_START: ? { ? break; ? }case APPLICATION_READY: ? { ? MSC_Application(); ? Appli_state = APPLICATION_IDLE; ? break; ? }case APPLICATION_DISCONNECT: ? { ? break; ? }case APPLICATION_IDLE: ? { ? break; ? }default: ? { ? break; ? }} }

??我們實現(xiàn)USB主機庫的移植,我們嘗試往U盤寫一個名為STM32.txt的文件,經(jīng)測試是成功的,具體如下圖:

??上圖中,我們創(chuàng)建了一個名為STM32.txt的文本文件,我們進(jìn)一步像文件中寫入一定的字符。我們寫入一句話,其結(jié)果如下:

??至此,我們可以確定我們的USB主機庫移植及大容量存儲設(shè)備的操作應(yīng)該是正確的。

4、小結(jié)

??在usbh_conf.c和usbh_conf.h文件的實現(xiàn)中已經(jīng)將硬件接口對象HCD_HandleTypeDef已經(jīng)連接到了USB主機對象USBH_HandleTypeDef上,所以在應(yīng)用層面就需要操作USBH_HandleTypeDef對象了。

??在移植測試過程中,我們發(fā)現(xiàn)了一個現(xiàn)象。如果在USB HOST庫完成軟硬件初始化之前就插入U盤,則系統(tǒng)不能完成初始化。等到初始化完成之后插入U盤則操作正常。

歡迎關(guān)注:

總結(jié)

以上是生活随笔為你收集整理的USB应用开发笔记之一:STM32上实现USB主机读写U盘的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。