RM新时代网站-首页

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

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

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

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

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

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

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

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

2.拷貝到一個(gè)工程中

以其中一個(gè)工程為模板,將另一個(gè)工程中需要的文件拷貝過來。這里以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及對(duì)應(yīng)的.h文件,usbd_msccdc.c文件是需要自己實(shí)現(xiàn)的USB復(fù)合設(shè)備的代碼。

3.修改程序

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

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

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

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

CDC使用的是0x81 0x01 和0x82三個(gè)端點(diǎn)

#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端點(diǎn)

#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 */
}

最后,編譯成功后下載程序測(cè)試??梢钥吹経SB虛擬出了一個(gè)串口和1個(gè)U盤,這里的U盤是一張32G的TF卡。測(cè)試一下串口收發(fā)和U盤讀寫,都正常。

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






審核編輯:劉清

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

    關(guān)注

    0

    文章

    29

    瀏覽量

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

    關(guān)注

    0

    文章

    57

    瀏覽量

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

    關(guān)注

    2

    文章

    80

    瀏覽量

    12145
  • stm32cubemx
    +關(guān)注

    關(guān)注

    5

    文章

    283

    瀏覽量

    14791

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

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

    如何讓Openharmony設(shè)備HDC接口(OTG接口)作為一個(gè)復(fù)合設(shè)備,實(shí)現(xiàn)HDC(HDC:鴻蒙設(shè)備連接器) +
    的頭像 發(fā)表于 06-13 15:03 ?1604次閱讀
    如何在Openharmony中<b class='flag-5'>實(shí)現(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ā)送不正常的原因?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    STM32 HAL庫(kù)是如何去實(shí)現(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ā)送不正常是怎么回事?

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

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

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

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

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

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

    項(xiàng)需求,在STM32F072中需實(shí)現(xiàn)5個(gè)CDC設(shè)備,折騰了很久分享出來,希望能幫助別人少踩一些坑.USB2.0全速,該款單片機(jī)支持8個(gè)輸出和8?jìng)€(gè)輸入端點(diǎn),過程中參考了些大佬的貼子STM
    發(fā)表于 12-28 19:43 ?31次下載
    STM32 <b class='flag-5'>USB</b>如何配置多個(gè)<b class='flag-5'>CDC</b><b class='flag-5'>設(shè)備</b>—5個(gè)<b class='flag-5'>CDC</b><b class='flag-5'>設(shè)備</b>
    RM新时代网站-首页