之前的文章中介紹過STM32的USB應(yīng)用,包括虛擬串口(CDC)和大容量存儲設(shè)備(MSC)。今天來介紹USB實(shí)現(xiàn)CDC和MSC復(fù)合設(shè)備的方法。
1.準(zhǔn)備兩個(gè)工程
首先用STM32CubeMX分別生成CDC和MSC兩個(gè)工程,測試正常。
2.拷貝到一個(gè)工程中
以其中一個(gè)工程為模板,將另一個(gè)工程中需要的文件拷貝過來。這里以MSC的工程為模板,將CDC工程中的下列文件/文件夾拷貝過來,并添加到工程中。
添加完成后的工程目錄如下:
復(fù)制過來的只有usbd_cdc_if.c和usbd_cdc.c及對應(yīng)的.h文件,usbd_msccdc.c文件是需要自己實(shí)現(xiàn)的USB復(fù)合設(shè)備的代碼。
3.修改程序
a)首先,原有的工程已經(jīng)有USB復(fù)合設(shè)備的框架了,要使用的話需要添加一個(gè)宏定義:USE_USBD_COMPOSITE,直接在編譯器里添加就行:
b)然后編寫usbd_msccdc.c和對應(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 0x03Ud)然后把usbd_conf.h文件中USBD_MAX_NUM_INTERFACES的值1修改為3
e)修改usbd_conf.c文件,如下:
![3c96ecee-daa0-11ed-bfe3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/9A/77/wKgaomTni_eAJOFdAAYOa2PS1dc332.png)
f)修改usbd_msc.c和usbd_cdc.c文件如下:
???????
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虛擬出了一個(gè)串口和1個(gè)U盤,這里的U盤是一張32G的TF卡。測試一下串口收發(fā)和U盤讀寫,都正常。
審核編輯:劉清
-
msc
+關(guān)注
關(guān)注
0文章
29瀏覽量
20154 -
CDC
+關(guān)注
關(guān)注
0文章
57瀏覽量
17858 -
TF卡
+關(guān)注
關(guān)注
2文章
81瀏覽量
12251 -
stm32cubemx
+關(guān)注
關(guān)注
5文章
284瀏覽量
15014
原文標(biāo)題:基于STM32CubeMx的USB CDC+MSC復(fù)合設(shè)備
文章出處:【微信號:嵌入式技術(shù)開發(fā),微信公眾號:嵌入式技術(shù)開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
如何在Openharmony中實(shí)現(xiàn)USB復(fù)合設(shè)備
![如何在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>](https://file1.elecfans.com/web2/M00/ED/4A/wKgZomZqmeWAO_hXAABmpyJoyE0024.png)
USB復(fù)合設(shè)備MSC+CDC,CDC_Transmit_FS函數(shù)發(fā)送不正常的原因?
stm32F446 USB復(fù)合CDC及MSC,為什么只能識別一個(gè)出來?
ESP32S2使用單根USB線創(chuàng)建MSC+CDC與上位機(jī)通信,CDC異常的原因?
USB復(fù)合設(shè)備MSC+CDC,MSC異常影響CDC收發(fā)怎么解決?
靈動(dòng)微課堂(第109講) | MM32 USB功能學(xué)習(xí)筆記 —— USB復(fù)合設(shè)備
STM32 HAL庫實(shí)現(xiàn)USB組合設(shè)備CDC+MSC 精選資料分享
怎樣去編寫STM32 USB復(fù)合設(shè)備
STM32 USB復(fù)合設(shè)備編寫的目的是什么
STM32 HAL庫是如何去實(shí)現(xiàn)USB組合設(shè)備CDC+MSC的
無法將工作中的USB復(fù)合設(shè)備應(yīng)用程序從LPC54114移植到LPC11U68怎么解決?
USB復(fù)合設(shè)備MSC+CDC,CDC_Transmit_FS函數(shù)發(fā)送不正常是怎么回事?
USB復(fù)合設(shè)備的概念及CDC MSC的講解
usb的復(fù)合設(shè)備怎么實(shí)現(xiàn)cdc和鍵盤功能?
STM32 USB如何配置多個(gè)CDC設(shè)備—5個(gè)CDC設(shè)備
![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>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論