<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何在STM32上實現USB主機讀寫U盤文件

CHANBAEK ? 來源:木南創智 ? 作者:尹家軍 ? 2022-12-13 17:20 ? 次閱讀

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

1、應用概述

??在我們的產品上有這樣一個需求,希望通過大容量的U盤存取數據。我們來分析一下這個需求的具體內容。

??首先在硬件上我們需要有相應的USB端口,這一點在產品設計時就已經考慮并實現,所以硬件方面我們就不再過多的表述。

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

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

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

2、USB庫的移植

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

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

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

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

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

??中斷必須打開,中斷級別可以根據需要設置。中斷會監測USB的狀態,所以中斷不打開,USB庫無法工作。完成上述配置后就可以生成源碼了,然后在此基礎上進一步開發。

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

3、應用實現

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

??首先來看應用處理回調函數。這個函數是主機庫所要求的,用于處理與用戶應用相關的操作,這個函數的原型如下:

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

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

/* USB應用處理回調函數 */
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函數并處理我們的應用任務,如讀寫文件操作等。我們在這一函數中,先調用USBH_Process函數,然后根據當前的狀態來決定應處理的工作。在這里,我們希望在USB檢測到U盤準備好后對齊進行讀寫操作,所以我們實現如下:

/* USB通訊數據處理 */
void McUsbDataProcess(void)
{
  /* USB 主機過程:應在主循環中調用,運行主機協議棧 */
  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; 
?    }
  }
}

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

??上圖中,我們創建了一個名為STM32.txt的文本文件,我們進一步像文件中寫入一定的字符。我們寫入一句話,其結果如下:

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

4、小結

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

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • usb
    usb
    +關注

    關注

    59

    文章

    7521

    瀏覽量

    260079
  • U盤
    +關注

    關注

    7

    文章

    485

    瀏覽量

    62851
  • STM32
    +關注

    關注

    2247

    文章

    10691

    瀏覽量

    349906
收藏 人收藏

    評論

    相關推薦

    STM32105做USB HOST讀寫U,頻繁插拔后U不識別怎么處理?

    使用STM32F105做USB HOST讀寫U 正常流程下識別寫文件斷開
    發表于 03-28 07:53

    求助,基于stm32 U讀寫的疑問求解

    大家好: 我移植官方usb庫,實現U讀寫,目前單次的讀寫已經成功,但是頻繁寫入的時候遇到一
    發表于 04-10 06:41

    STM32F4 USB U實驗,能夠正常識別U,但是讀寫不正常是什么原因?

    STM32F4 USB U實驗,能夠正常識別U,加上文件
    發表于 04-17 07:55

    STM32F107VCT6使用USB HOST OTG掛載U連續讀寫文件錯誤是怎么回事?如何解決?

    最近研究STM32F107VCT6的USB HOST OTG驅動U,目前可以正確識別到U和掛
    發表于 04-29 08:28

    STM32F4CUBE USB讀寫U遇到的幾個疑問求解

    txt文件,但內容沒寫進去,f_write返回值是ok;U是好用的,插在電腦沒有問題 (3)在STM32F4CUBE1.9的庫中有FAT
    發表于 05-06 07:08

    STM32U讀寫不能枚舉成功的原因?

    帖子還沒寫呢,結果按個回車就自動發表了, 是這樣的,STM32F405RG這個芯片,用USB HOST 2.2.0庫讀寫U時,發現一款
    發表于 05-06 07:32

    嵌入式U讀寫模塊USB118

    讀寫數據呢?答案是肯定的。USB118系列嵌入式U讀寫模塊提供了通過串口或并口讀寫
    發表于 07-24 14:46

    單片機讀寫U例程源代碼

    一、 通過串口讀寫U文件的解決方案無論是單片機還是FPGA,只要控制器CPU具有RS232串口,就可以通過USB118AD模塊的串口
    發表于 04-14 15:59

    STM32CubeMX 105芯片USB Host讀寫U

    問題描述:本人的項目中要將一次不過100字節的少量數據存入U。最初用的是CH376芯片,后來發現STM32中有USB host資源的芯片比如105/107等都可以直接
    發表于 11-16 08:55

    STM32F4 USB模擬U寫入文件數據后如何判斷文件已經寫結束了?

    使用STM32USB模擬U,電腦向STM32模擬的U
    發表于 02-20 08:04

    基于STM32U的設計讀寫數據應該怎么編寫

    我是新手,現在想做一個基于STM32U的設計,用STM32控制數據讀寫。要求包括UCOS的移植,FAT
    發表于 04-16 05:38

    請問怎么才能實現一個USB從機也就是U的功能?

    USB是控制數據連接和讀寫的,文件系統是讓數據有序的,不知這么說對不對,但是怎么才能實現一個USB從機也就是
    發表于 04-19 05:27

    何在搭載了RT-Thread操作系統的平臺上使用USBHost讀寫U?

    本文描述了如何在搭載了 RT-Thread 操作系統的平臺上使用 USB Host 讀寫 U ,包括
    發表于 03-30 07:54

    STM32CubeMX通過FatFS讀寫U的方法

    ;(上述氣話,接下來上干貨)大致思路STM32讀寫U主要分為以下幾個方面:1、文件系統(抽象層,以統一方式對不同外設進行
    發表于 02-14 06:43

    如何使用u*** host實現U讀寫

    U是一個很常用的存儲設備,它是通過u***實現數據傳輸的,那么在stm32上面,我們要怎么接入U
    發表于 02-22 06:22
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>