一.說明
使用CubeMX 5.0.1和Keil 5.26配合開發,HAL庫,開發板是STM32F103C8T6最小系統。
二.CubeMX配置
新建工程這些基礎配置就不仔細介紹了,直接進入正題。
-
USB_DEVICE設置爲虛擬串口,其他功能可以不配置;
-
開啓USB設備,下面的參數可以不用配置(GPIO上拉已經由電路配置好了,這裏軟件無法配置)。
-
USB時鐘配置爲48MHz。
三. Keil配置
- 由CubeMX生成好工程後,基本不需要改動。如果外部調用USB發送數據,只要引用usbd_cdc_if.h文件,調用**uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)**函數即可,返回的參數有以下三種,可以暫時不管。
typedef enum {
USBD_OK = 0,
USBD_BUSY,
USBD_FAIL,
}USBD_StatusTypeDef;
- usbd_cdc_if文件中的**static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)**即USB通訊中斷調用函數。這裏和串口的方式不同,串口每次中斷都是讀一個uint8_t,USB是讀取一段數據。
Buf就是讀取來的數據,*Len代表其長度。通過分析Buf數據,執行對應指令,這裏只是把Buf原樣發送回去。後面代碼就是重新向Buf讀入數據。
static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{
/* USER CODE BEGIN 6 */
if (Buf[*Len-2] == 0x0D && Buf[*Len-1] == 0x0A){
CDC_Transmit_FS(Buf, *Len);
}
USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
USBD_CDC_ReceivePacket(&hUsbDeviceFS);
return (USBD_OK);
/* USER CODE END 6 */
}