之前的文章中介紹過STM32的USB應(yīng)用,包括虛擬串口(CDC)和大容量存儲(chǔ)設(shè)備(MSC)。今天來介紹USB實(shí)現(xiàn)CDC和MSC復(fù)合設(shè)備的方法。
硬件:STM32F407VET6
軟件:STM32CubeMx v6.5+F4庫v1.27.1
編譯環(huán)境:MDK 5.30
1.準(zhǔn)備兩個(gè)工程
首先用STM32CubeMX分別生成CDC和MSC兩個(gè)工程,測(cè)試正常。具體可參考之前的文章。
STM32實(shí)現(xiàn)USB轉(zhuǎn)串口功能(含源碼)
STM32&SD卡實(shí)現(xiàn)USB虛擬U盤(含源碼)
2.拷貝到一個(gè)工程中?
以其中一個(gè)工程為模板,將另一個(gè)工程中需要的文件拷貝過來。這里以MSC的工程為模板,將CDC工程中的下列文件/文件夾拷貝過來,并添加到工程中。


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

復(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,直接在編譯器里添加就行:

b)然后編寫usbd_msccdc.c和對(duì)應(yīng)的.h文件。該文件主要是USB復(fù)合設(shè)備的描述符等,這里不詳細(xì)介紹。文件內(nèi)容見文章末尾鏈接。? ? ? ???
c)其次修改USB CDC和MSC的端點(diǎn),在usbd_cdc.h和usbd_msc.h文件中:
CDC使用的是0x81? 0x01 和0x82三個(gè)端點(diǎn)
#ifndef?CDC_IN_EP#define?CDC_IN_EP???????????????????????????????????0x81U??/*?EP1?for?data?IN?*/#endif /* CDC_IN_EP */#ifndef?CDC_OUT_EP#define?CDC_OUT_EP??????????????????????????????????0x01U??/*?EP1?for?data?OUT?*/#endif /* CDC_OUT_EP */#ifndef?CDC_CMD_EP#define CDC_CMD_EP 0x82U /* EP2 for CDC commands */
MSC使用的是0x83和0x03端點(diǎn)
#ifndef?MSC_EPIN_ADDR#define MSC_EPIN_ADDR 0x83U#ifndef?MSC_EPOUT_ADDR#define MSC_EPOUT_ADDR 0x03U

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

????????g)?最后修改usb_device.c文件:void MX_USB_DEVICE_Init(void){??/*?USER?CODE?BEGIN?USB_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è)試。可以看到USB虛擬出了一個(gè)串口和1個(gè)U盤,這里的U盤是一張32G的TF卡。測(cè)試一下串口收發(fā)和U盤讀寫,都正常。


鏈接:https://pan.baidu.com/s/1ZsH1C65ywMlmuznY7IrxRw?pwd=r4zr
提取碼:r4zr
STM32CubeMX之SDIO+FatFS讀寫SD卡
SDIO讀寫SD卡速度有多快?
Keil調(diào)試時(shí)設(shè)置斷點(diǎn)的高級(jí)用法
SPI方式讀寫SD卡速度有多快?
【干貨】STM32通過ADC模擬看門狗實(shí)現(xiàn)掉電保存
? ?歡迎關(guān)注公眾號(hào)"嵌入式技術(shù)開發(fā)",大家可以后臺(tái)給我留言溝通交流。如果覺得該公眾號(hào)對(duì)你有所幫助,也歡迎推薦分享給其他人。