RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何在STM32上實(shí)現(xiàn)USB主機(jī)讀寫(xiě)U盤(pán)文件

CHANBAEK ? 來(lái)源:木南創(chuàng)智 ? 作者:尹家軍 ? 2022-12-13 17:20 ? 次閱讀

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

1、應(yīng)用概述

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

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

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

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

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

2、USB庫(kù)的移植

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

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

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

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

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

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

??對(duì)于STM32的USB主機(jī)庫(kù)的移植有兩個(gè)文件是必須要寫(xiě)的,就是usbh_conf.c和usbh_conf.h文件。這兩個(gè)文件文件實(shí)現(xiàn)USB的基礎(chǔ)配置,以及庫(kù)需要調(diào)用的基礎(chǔ)函數(shù)。在我們使用STM32CubeMX來(lái)配置和建立項(xiàng)目時(shí),usbh_conf.c和usbh_conf.h文件也一并生成好了,不需要我們?cè)偃为?dú)編寫(xiě)這些平臺(tái)相關(guān)的函數(shù)。

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

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

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

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

??如果我們的操作比較簡(jiǎn)單,我們可以在這個(gè)函數(shù)中直接完成,在測(cè)試時(shí)比驕傲方便,在復(fù)雜一點(diǎn)的應(yīng)用中不建議這么做。在這里我們實(shí)現(xiàn)這個(gè)函數(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ù),如讀寫(xiě)文件操作等。我們?cè)谶@一函數(shù)中,先調(diào)用USBH_Process函數(shù),然后根據(jù)當(dāng)前的狀態(tài)來(lái)決定應(yīng)處理的工作。在這里,我們希望在USB檢測(cè)到U盤(pán)準(zhǔn)備好后對(duì)齊進(jìn)行讀寫(xiě)操作,所以我們實(shí)現(xiàn)如下:

/* USB通訊數(shù)據(jù)處理 */
void McUsbDataProcess(void)
{
  /* USB 主機(jī)過(guò)程:應(yīng)在主循環(huán)中調(diào)用,運(yùn)行主機(jī)協(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; 
?    }
  }
}

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

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

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

4、小結(jié)

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

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • usb
    usb
    +關(guān)注

    關(guān)注

    60

    文章

    7936

    瀏覽量

    264473
  • U盤(pán)
    +關(guān)注

    關(guān)注

    7

    文章

    489

    瀏覽量

    63243
  • STM32
    +關(guān)注

    關(guān)注

    2270

    文章

    10895

    瀏覽量

    355728
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    STM32105做USB HOST讀寫(xiě)U盤(pán),頻繁插拔后U盤(pán)不識(shí)別怎么處理?

    使用STM32F105做USB HOST讀寫(xiě)U盤(pán) 正常流程下識(shí)別寫(xiě)文件斷開(kāi)
    發(fā)表于 03-28 07:53

    求助,基于stm32 U盤(pán)讀寫(xiě)的疑問(wèn)求解

    大家好: 我移植官方usb庫(kù),實(shí)現(xiàn)U盤(pán)讀寫(xiě),目前單次的讀寫(xiě)已經(jīng)成功,但是頻繁寫(xiě)入的時(shí)候遇到一
    發(fā)表于 04-10 06:41

    STM32F107VCT6使用USB HOST OTG掛載U盤(pán)連續(xù)讀寫(xiě)文件錯(cuò)誤是怎么回事?如何解決?

    最近研究STM32F107VCT6的USB HOST OTG驅(qū)動(dòng)U盤(pán),目前可以正確識(shí)別到U盤(pán)和掛
    發(fā)表于 04-29 08:28

    STM32F4CUBE USB讀寫(xiě)U盤(pán)遇到的幾個(gè)疑問(wèn)求解

    txt文件,但內(nèi)容沒(méi)寫(xiě)進(jìn)去,f_write返回值是ok;U盤(pán)是好用的,插在電腦沒(méi)有問(wèn)題 (3)在STM32F4CUBE1.9的庫(kù)中有FAT
    發(fā)表于 05-06 07:08

    嵌入式U盤(pán)讀寫(xiě)模塊USB118

    讀寫(xiě)數(shù)據(jù)呢?答案是肯定的。USB118系列嵌入式U盤(pán)讀寫(xiě)模塊提供了通過(guò)串口或并口讀寫(xiě)
    發(fā)表于 07-24 14:46

    STM32F4 USB模擬U盤(pán)寫(xiě)入文件數(shù)據(jù)后如何判斷文件已經(jīng)寫(xiě)結(jié)束了?

    使用STM32USB模擬U盤(pán),電腦向STM32模擬的U盤(pán)
    發(fā)表于 02-20 08:04

    何在搭載了RT-Thread操作系統(tǒng)的平臺(tái)上使用USBHost讀寫(xiě)U盤(pán)?

    本文描述了如何在搭載了 RT-Thread 操作系統(tǒng)的平臺(tái)上使用 USB Host 讀寫(xiě) U 盤(pán),包括
    發(fā)表于 03-30 07:54

    如何使用u*** host實(shí)現(xiàn)U盤(pán)讀寫(xiě)

    U盤(pán)是一個(gè)很常用的存儲(chǔ)設(shè)備,它是通過(guò)u***實(shí)現(xiàn)數(shù)據(jù)傳輸?shù)?,那么?b class='flag-5'>stm32上面,我們要怎么接入U
    發(fā)表于 02-22 06:22

    基于單片機(jī)的嵌入式USB主機(jī)系統(tǒng)的實(shí)現(xiàn)

    在無(wú)操作系統(tǒng)的單片機(jī)系統(tǒng)中實(shí)現(xiàn)USB主機(jī)系統(tǒng)功能,對(duì)U盤(pán)進(jìn)行文件
    發(fā)表于 09-16 09:21 ?30次下載

    U盤(pán)伴侶 EasyUDisk讀寫(xiě)U盤(pán)模塊

    在嵌入式的電子產(chǎn)品中實(shí)現(xiàn)U盤(pán)文件讀寫(xiě),在軟件設(shè)計(jì)上成了許多廠家技術(shù)攻關(guān)的難題,U
    發(fā)表于 11-04 12:01 ?74次下載

    STM32CubeMX通過(guò)FatFS讀寫(xiě)U盤(pán)

    ;(上述氣話,接下來(lái)上干貨)大致思路STM32讀寫(xiě)U盤(pán)主要分為以下幾個(gè)方面:1、文件系統(tǒng)(抽象層,以統(tǒng)一方式對(duì)不同外設(shè)進(jìn)行
    發(fā)表于 12-09 10:21 ?21次下載
    <b class='flag-5'>STM32</b>CubeMX通過(guò)FatFS<b class='flag-5'>讀寫(xiě)</b><b class='flag-5'>U</b><b class='flag-5'>盤(pán)</b>

    RT-thread應(yīng)用講解——U盤(pán)usb host)

    U盤(pán)是一個(gè)很常用的存儲(chǔ)設(shè)備,它是通過(guò)usb實(shí)現(xiàn)數(shù)據(jù)傳輸?shù)?,那么?b class='flag-5'>stm32上面,我們要怎么接入U
    發(fā)表于 12-28 19:41 ?22次下載
    RT-thread應(yīng)用講解——<b class='flag-5'>U</b><b class='flag-5'>盤(pán)</b>(<b class='flag-5'>usb</b> host)

    STM32&SD卡實(shí)現(xiàn)USB虛擬U盤(pán)

    下載源碼請(qǐng)關(guān)注公眾號(hào)之前的文章中介紹過(guò)STM32讀寫(xiě)SD卡和FatFS文件系統(tǒng)相關(guān)的知識(shí)。今天將在這基礎(chǔ)介紹STM32通過(guò)
    發(fā)表于 12-28 19:54 ?43次下載
    <b class='flag-5'>STM32</b>&SD卡<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>USB</b>虛擬<b class='flag-5'>U</b><b class='flag-5'>盤(pán)</b>

    STM32CubeMX | STM32基于HAL實(shí)現(xiàn)USB模擬U盤(pán)

    STM32CubeMX | STM32基于HAL實(shí)現(xiàn)USB模擬U盤(pán)目錄
    發(fā)表于 12-28 20:04 ?40次下載
    <b class='flag-5'>STM32</b>CubeMX | <b class='flag-5'>STM32</b>基于HAL<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>USB</b>模擬<b class='flag-5'>U</b><b class='flag-5'>盤(pán)</b>

    如何擴(kuò)展USB接口進(jìn)行對(duì)U盤(pán)讀寫(xiě)

    電子發(fā)燒友網(wǎng)站提供《如何擴(kuò)展USB接口進(jìn)行對(duì)U盤(pán)讀寫(xiě).doc》資料免費(fèi)下載
    發(fā)表于 10-25 10:15 ?5次下載
    如何擴(kuò)展<b class='flag-5'>USB</b>接口進(jìn)行對(duì)<b class='flag-5'>U</b><b class='flag-5'>盤(pán)</b>的<b class='flag-5'>讀寫(xiě)</b>
    RM新时代网站-首页