吴忠躺衫网络科技有限公司

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

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

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

介紹USB實現(xiàn)CDC和MSC復(fù)合設(shè)備的方法

嵌入式技術(shù)開發(fā) ? 來源:嵌入式技術(shù)開發(fā) ? 2023-04-14 16:55 ? 次閱讀

之前的文章中介紹過STM32USB應(yīng)用,包括虛擬串口(CDC)和大容量存儲設(shè)備(MSC)。今天來介紹USB實現(xiàn)CDC和MSC復(fù)合設(shè)備的方法。

1.準(zhǔn)備兩個工程

首先用STM32CubeMX分別生成CDC和MSC兩個工程,測試正常。

2.拷貝到一個工程中

以其中一個工程為模板,將另一個工程中需要的文件拷貝過來。這里以MSC的工程為模板,將CDC工程中的下列文件/文件夾拷貝過來,并添加到工程中。

3c200aac-daa0-11ed-bfe3-dac502259ad0.png3c436254-daa0-11ed-bfe3-dac502259ad0.png

添加完成后的工程目錄如下:

3c55befe-daa0-11ed-bfe3-dac502259ad0.png

復(fù)制過來的只有usbd_cdc_if.c和usbd_cdc.c及對應(yīng)的.h文件,usbd_msccdc.c文件是需要自己實現(xiàn)的USB復(fù)合設(shè)備的代碼。

3.修改程序

a)首先,原有的工程已經(jīng)有USB復(fù)合設(shè)備的框架了,要使用的話需要添加一個宏定義:USE_USBD_COMPOSITE,直接在編譯器里添加就行:

3c7f18d0-daa0-11ed-bfe3-dac502259ad0.png

b)然后編寫usbd_msccdc.c和對應(yīng)的.h文件。該文件主要是USB復(fù)合設(shè)備的描述符等,這里不詳細(xì)介紹。

c)其次修改USB CDC和MSC的端點,在usbd_cdc.h和usbd_msc.h文件中:

CDC使用的是0x81 0x01 和0x82三個端點

#ifndefCDC_IN_EP
#defineCDC_IN_EP0x81U/*EP1fordataIN*/
#endif /* CDC_IN_EP */


#ifndefCDC_OUT_EP
#defineCDC_OUT_EP0x01U/*EP1fordataOUT*/
#endif /* CDC_OUT_EP */


#ifndefCDC_CMD_EP
#define CDC_CMD_EP                                  0x82U  /* EP2 for CDC commands */

MSC使用的是0x83和0x03端點

#ifndefMSC_EPIN_ADDR
#define MSC_EPIN_ADDR                0x83U


#ifndefMSC_EPOUT_ADDR
#define MSC_EPOUT_ADDR               0x03U
d)然后把usbd_conf.h文件中USBD_MAX_NUM_INTERFACES的值1修改為3

e)修改usbd_conf.c文件,如下:

3c96ecee-daa0-11ed-bfe3-dac502259ad0.png

f)修改usbd_msc.c和usbd_cdc.c文件如下:

3cc864ea-daa0-11ed-bfe3-dac502259ad0.png3cd80756-daa0-11ed-bfe3-dac502259ad0.png???????

g)最后修改usb_device.c文件:

void MX_USB_DEVICE_Init(void)
{
/*USERCODEBEGINUSB_DEVICE_Init_PreTreatment*/
  /* USER CODE END USB_DEVICE_Init_PreTreatment */


  /* Init Device Library, add supported class and start the library. */
 if (USBD_Init(&hUsbDeviceFS, &usbCmpsitFS_Desc, DEVICE_FS) != USBD_OK)
  {
    Error_Handler();
  }
  /* if (USBD_RegisterClass(&hUsbDeviceFS, &USBD_MSC) != USBD_OK)
  {
    Error_Handler();
  } */


  if(USBD_RegisterClassComposite(&hUsbDeviceFS, &USBD_CDC,CLASS_TYPE_CDC,0) != USBD_OK)
  {
    Error_Handler();
  }


  if(USBD_CDC_RegisterInterface(&hUsbDeviceFS, &USBD_Interface_fops_FS) != USBD_OK)
  {
    Error_Handler();
  }
  if(USBD_RegisterClassComposite(&hUsbDeviceFS, &USBD_MSC,CLASS_TYPE_MSC,0) != USBD_OK)
  {
    Error_Handler();
  }
  if (USBD_MSC_RegisterStorage(&hUsbDeviceFS, &USBD_Storage_Interface_fops_FS) != USBD_OK)
  {
    Error_Handler();
  }
  if (USBD_Start(&hUsbDeviceFS) != USBD_OK)
  {
    Error_Handler();
  }


  /* USER CODE BEGIN USB_DEVICE_Init_PostTreatment */


  /* USER CODE END USB_DEVICE_Init_PostTreatment */
}

最后,編譯成功后下載程序測試。可以看到USB虛擬出了一個串口和1個U盤,這里的U盤是一張32G的TF卡。測試一下串口收發(fā)和U盤讀寫,都正常。

3cf68dd4-daa0-11ed-bfe3-dac502259ad0.png3d180fa4-daa0-11ed-bfe3-dac502259ad0.png






審核編輯:劉清

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

    關(guān)注

    0

    文章

    29

    瀏覽量

    20153
  • CDC
    CDC
    +關(guān)注

    關(guān)注

    0

    文章

    57

    瀏覽量

    17854
  • TF卡
    +關(guān)注

    關(guān)注

    2

    文章

    81

    瀏覽量

    12246
  • stm32cubemx
    +關(guān)注

    關(guān)注

    5

    文章

    284

    瀏覽量

    15002

原文標(biāo)題:基于STM32CubeMx的USB CDC+MSC復(fù)合設(shè)備

文章出處:【微信號:嵌入式技術(shù)開發(fā),微信公眾號:嵌入式技術(shù)開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    如何在Openharmony中實現(xiàn)USB復(fù)合設(shè)備

    如何讓Openharmony設(shè)備HDC接口(OTG接口)作為一個復(fù)合設(shè)備實現(xiàn)HDC(HDC:鴻蒙設(shè)備連接器) +
    的頭像 發(fā)表于 06-13 15:03 ?1845次閱讀
    如何在Openharmony中<b class='flag-5'>實現(xiàn)</b><b class='flag-5'>USB</b><b class='flag-5'>復(fù)合</b><b class='flag-5'>設(shè)備</b>

    USB復(fù)合設(shè)備MSC+CDC,CDC_Transmit_FS函數(shù)發(fā)送不正常的原因?

    單獨測試CDCMSC功能均正常,實現(xiàn)MSC+CDC復(fù)合設(shè)備后,均可正常識別到,但
    發(fā)表于 03-13 07:40

    stm32F446 USB復(fù)合CDCMSC,為什么只能識別一個出來?

    我現(xiàn)在做USB復(fù)合設(shè)備,參照網(wǎng)上了代碼完成了復(fù)合設(shè)備代碼的修改。但是現(xiàn)在遇到一個問題,就是CDC
    發(fā)表于 04-02 06:08

    ESP32S2使用單根USB線創(chuàng)建MSC+CDC與上位機通信,CDC異常的原因?

    芯片型號:ESP32S2 SDK版本:ESP-IDF 4.4.6 現(xiàn)在的環(huán)境是使用單根USB線創(chuàng)建MSC+CDC與上位機通信。當(dāng)CDCMSC同時運行,且
    發(fā)表于 06-06 07:29

    USB復(fù)合設(shè)備MSC+CDCMSC異常影響CDC收發(fā)怎么解決?

    MSC讀寫物理存儲設(shè)備的時候,如果返回一次錯誤(錯誤碼:-1),不知道為什么會觸發(fā)一個枚舉中斷(USB_OTG_GINTSTS_ENUMDNE0),會調(diào)用到reset_callback,也會把
    發(fā)表于 07-23 06:23

    靈動微課堂(第109講) | MM32 USB功能學(xué)習(xí)筆記 —— USB復(fù)合設(shè)備

    ,在前面我們介紹了MM32 實現(xiàn)HID、WINUSB、CDCMSC功能,MM32系列MCU的USB功能有4個端點,所以我們可以自由組合上述
    發(fā)表于 03-04 17:23

    STM32 HAL庫實現(xiàn)USB組合設(shè)備CDC+MSC 精選資料分享

    STM32 HAL庫實現(xiàn)USB組合設(shè)備CDC+MSC目錄STM32 HAL庫實現(xiàn)USB組合
    發(fā)表于 08-05 07:54

    怎樣去編寫STM32 USB復(fù)合設(shè)備

    本實驗是基于野火霸道開發(fā)板STM32F103ZET6目的完成一個CDC + MSC復(fù)合USB設(shè)備可以方便在
    發(fā)表于 08-20 07:28

    STM32 USB復(fù)合設(shè)備編寫的目的是什么

    STM32 USB復(fù)合設(shè)備編寫目的完成一個CDC + MSC復(fù)合
    發(fā)表于 08-20 07:10

    STM32 HAL庫是如何去實現(xiàn)USB組合設(shè)備CDC+MSC

    STM32 HAL庫是如何去實現(xiàn)USB組合設(shè)備CDC+MSC的?其基本步驟有哪些?
    發(fā)表于 10-27 06:05

    無法將工作中的USB復(fù)合設(shè)備應(yīng)用程序從LPC54114移植到LPC11U68怎么解決?

    我無法將工作中的 USB 復(fù)合設(shè)備應(yīng)用程序從 LPC54114 移植到 LPC11U68。問題背景:在此應(yīng)用程序中,設(shè)備被枚舉為僅 CDC
    發(fā)表于 04-14 06:34

    USB復(fù)合設(shè)備MSC+CDC,CDC_Transmit_FS函數(shù)發(fā)送不正常是怎么回事?

    單獨測試CDCMSC功能均正常,實現(xiàn)MSC+CDC復(fù)合設(shè)備后,均可正常識別到,但
    發(fā)表于 08-08 07:32

    USB復(fù)合設(shè)備的概念及CDC MSC的講解

    購買Hub的費用,而對于開發(fā)者則希望可以既不占用多接口,又可以實現(xiàn)多功能,來贏得消費者的關(guān)注。USB復(fù)合設(shè)備就在這樣的市場需求下應(yīng)運而生。
    發(fā)表于 09-07 06:11

    usb復(fù)合設(shè)備怎么實現(xiàn)cdc和鍵盤功能?

    請問一個usb實現(xiàn)cdc串口和hid鍵盤,用ch554怎么做,不用hub
    發(fā)表于 09-21 07:20

    STM32 USB如何配置多個CDC設(shè)備—5個CDC設(shè)備

    項需求,在STM32F072中需實現(xiàn)5個CDC設(shè)備,折騰了很久分享出來,希望能幫助別人少踩一些坑.USB2.0全速,該款單片機支持8個輸出和8個輸入端點,過程中參考了些大佬的貼子STM
    發(fā)表于 12-28 19:43 ?31次下載
    STM32 <b class='flag-5'>USB</b>如何配置多個<b class='flag-5'>CDC</b><b class='flag-5'>設(shè)備</b>—5個<b class='flag-5'>CDC</b><b class='flag-5'>設(shè)備</b>
    网上有百家乐玩吗| 一路发娱乐| 百家乐官网赌场博彩赌场网| 百家乐信息| 在线扎金花| 免费百家乐规则| 尊爵| 百家乐视频官网| 尊龙备用网址| 永利百家乐游戏| 伟博| 百家乐注码技巧| 立博足球投注网| 百家乐出租平台| 定日县| 赌博百家乐规则| 财神百家乐官网娱乐城| 百家乐双层筹码盘| 观塘区| 百家乐暗红色桌布| 百家乐官网怎么对冲打| 百家乐网络游戏信誉怎么样| 百家乐官网群博爱彩| 骰子百家乐的玩法技巧和规则| 百家乐官网破解策略| 老虎机作弊器| 大众百家乐官网娱乐城| 拉斯维加斯娱乐| 百家乐赌场娱乐城大全| 优博国际| 百家乐棋牌交友中心| 百家乐官网翻天qvod粤语| 威尼斯人娱乐城信誉最好| 首席百家乐官网的玩法技巧和规则| 宝博娱乐城开户| 博九娱乐城| 大玩家百家乐的玩法技巧和规则| 百家乐官网赌场大全| 澳门博彩网站| 在线百家乐博彩网| 现金百家乐官网破解|