重慶綦江網(wǎng)站制作公司哪家專業(yè)最全的搜索引擎
STM32 USB組合設(shè)備 MSC CDC實(shí)現(xiàn)
教程
教程請(qǐng)看大佬niu_88
手把手教你使用USB的CDC+MSC復(fù)合設(shè)備(基于stm32f407)
大佬的教程很好,很詳細(xì),我調(diào)出來了,代碼請(qǐng)見我綁定的資源
注意事項(xiàng)
值得注意的是:
1、
cubemx固件庫存儲(chǔ)位置是
C:\Users\你的用戶名\STM32Cube\Repository\STM32Cube_FW_F4_V…(你的固件版本號(hào))
找
STM32Cube_FW_F4_V1.28.1\Middlewares\ST\STM32_USB_Device_Library\Class
即可找到CompositeBuilder的例子文件
2、
注意一下,usbd_composite_builder.h中
一些宏定義
USBD_CMPSIT_ACTIVATE_MSC
USBD_CMPSIT_ACTIVATE_CDC
在#include的下面
應(yīng)該移到上面去,否則編譯時(shí)找不到
3、
usbd_composite_builder.h修改配置描述符數(shù)組長度,宏定義USBD_CMPST_MAX_CONFDESC_SZ改成106這里
文件里本來是300,它之后會(huì)存入uint8的數(shù)組里,300會(huì)變成44,所以要修改
4、
復(fù)合設(shè)備編譯宏USE_USBD_COMPOSITE
可在編譯器預(yù)處理宏定義里添加
5、
我這版本比較新,使用USE_USBD_COMPOSITE后
usbd_cdc.h中
#ifdef USE_USBD_COMPOSITE
uint8_t USBD_CDC_SetTxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff,uint32_t length, uint8_t ClassId);
uint8_t USBD_CDC_TransmitPacket(USBD_HandleTypeDef *pdev, uint8_t ClassId);
#else
uint8_t USBD_CDC_SetTxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff,uint32_t length);
uint8_t USBD_CDC_TransmitPacket(USBD_HandleTypeDef *pdev);
#endif /* USE_USBD_COMPOSITE */
這兩個(gè)函數(shù)會(huì)使用組合設(shè)備版本,多了個(gè)classId的參數(shù)。參考大佬的代碼,使用時(shí)可以如下修改。
比如
/*** @brief CDC_Transmit_FS* Data to send over USB IN endpoint are sent over CDC interface* through this function.* @note*** @param Buf: Buffer of data to be sent* @param Len: Number of data to be sent (in bytes)* @retval USBD_OK if all operations are OK else USBD_FAIL or USBD_BUSY*/
uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)
{uint8_t result = USBD_OK;/* USER CODE BEGIN 7 */USBD_HandleTypeDef *pdev = &hUsbDeviceFS;/* Get the class index relative to this endpoint */uint8_t idx = USBD_CoreFindEP(pdev, CDC_IN_EP);//獲取classIDMy_usb_fs_cdc_transmited = false;USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDeviceFS.pClassData;if (hcdc->TxState != 0){return USBD_BUSY;}USBD_CDC_SetTxBuffer(&hUsbDeviceFS, Buf, Len, idx);result = USBD_CDC_TransmitPacket(&hUsbDeviceFS, idx);/* USER CODE END 7 */return result;
}
關(guān)于我的資源
最后成功截圖
我的開發(fā)環(huán)境:vscode eide插件 工具鏈arm-gcc
使用的芯片是stm32f405rgt6,大容量設(shè)備是SD卡,調(diào)試用的串口是串口6