12_STM32Cubeide开发_USB从设备串口驱动程序
生活随笔
收集整理的這篇文章主要介紹了
12_STM32Cubeide开发_USB从设备串口驱动程序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、USB相關介紹
通用串行總線(英語:Universal Serial Bus,縮寫:USB)是一種串口總線標準,也是一種輸入輸出接口的技術規范,被廣泛地應用于個人電腦和移動設備等信息通訊產品,并擴展至攝影器材、數字電視(機頂盒)、游戲機等其它相關領域。最新一代是USB4,傳輸速度為40Gbit/s。
stm32f103單片機內部自帶USB外設,但是最高只支持USB2.0,并且只可以作為從設備來使用。
從電路原理、所用元器件來看,USB可以直接連單片機,
但是,我們設計單片機的串口電路時候,通常在USB和單片機(使用串口功能)之間會添加一個串口轉換轉換芯片(比如CH340等),
USB接口可以衍化出很多高級功能,遠遠比串口通信功能強大得多。
二、cubeMX配置
1.時鐘配置
2.USB硬件參數配置
3.USB驅動程序配置
只會影響電腦上的設備屬性,不影響使用。
4.重新設置堆棧空間大小
三、驅動程序的修改
此時生成的初始化和中斷的代碼已經生成,用戶發送和接收數據只需要調用兩個函數就可以(也可以進行修改,實現自定義的通訊協議和功能)
類似于串口功能中的發送和接收一個字節數據的串口相關函數。
主要修改下圖中的兩個文件
1.接收和發送的相關協議修改配置
注:以下是在usbd_desc.c文件中修改
1)定義接收緩存區USB_RX_BUF和自定義接收標志USB_RX_STA
/* USER CODE BEGIN PV */ /* Private variables ---------------------------------------------------------*/ uint8_t USB_RX_BUF[USB_REC_LEN];//接收緩沖,最大USB_REC_LEN個字節. uint16_t USB_RX_STA=0;//接收狀態標記(接收到的有效字節數量) /* USER CODE END PV */2)將接收到的數據一一放進緩存區中
static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len) {/* USER CODE BEGIN 6 */if(*Len<USB_REC_LEN)//判斷收到數據量是否小于寄存器上限{uint16_t i;USB_RX_STA = *Len;//將數據量值放入標志位for(i=0;i<*Len;i++)//循環(循環次數=數據數量)USB_RX_BUF[i] = Buf[i];//將數據內容放入數據寄存器}USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]); //將接收數組buff清空USBD_CDC_ReceivePacket(&hUsbDeviceFS); //再次開啟虛擬串口接收return (USBD_OK);/* USER CODE END 6 */ }3)將需要發送的數據發送(先判斷空閑才能發送,調用的都是底層寄存器)
uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len) {uint8_t result = USBD_OK;/* USER CODE BEGIN 7 */uint32_t TimeStart = HAL_GetTick();USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDeviceFS.pClassData;//if (hcdc->TxState != 0) return USBD_BUSY;while(hcdc->TxState){if(HAL_GetTick()-TimeStart > 10)return USBD_BUSY;elsebreak;}USBD_CDC_SetTxBuffer(&hUsbDeviceFS, Buf, Len);result = USBD_CDC_TransmitPacket(&hUsbDeviceFS);TimeStart = HAL_GetTick();while(hcdc->TxState){if(HAL_GetTick()-TimeStart > 10)return USBD_BUSY;}/* USER CODE END 7 */return result; }4)自定義USB_printf()發送函數
/* USER CODE BEGIN PRIVATE_FUNCTIONS_IMPLEMENTATION */ #include <stdarg.h> void USB_printf(const char *format, ...)//USB模擬串口的打印函數 {va_list args;uint32_t length;va_start(args, format);length = vsnprintf((char *)UserTxBufferFS, APP_TX_DATA_SIZE, (char *)format, args);va_end(args);CDC_Transmit_FS(UserTxBufferFS, length); } /* USER CODE END PRIVATE_FUNCTIONS_IMPLEMENTATION */2.頭文件中相關修改
注:以下是在usbd_desc.h文件中修改
自定義函數聲明
四、main.c中應用程序的修改
1.頭文件的包含
/* USER CODE BEGIN Includes */ #include "../../USB_DEVICE/App/usbd_cdc_if.h" #include "../../icode/led/led.h" /* USER CODE END Includes */2.while()中循環
//USB模擬串口的查尋接收處理(其編程原理與USART1串口收發相同)if(USB_RX_STA!=0)//判斷是否有數據{USB_printf("USB_RX:");//向USB模擬串口發送字符串CDC_Transmit_FS(USB_RX_BUF,USB_RX_STA);//USB串口發送:將接收的數據發回給電腦端(參數1是數據內容,參數2是數據量)USB_printf("\r\n");//向USB模擬串口發送字符串(回車)USB_RX_STA=0;//數據標志位清0memset(USB_RX_BUF,0,sizeof(USB_RX_BUF));//USB串口數據寄存器清0}五、實驗現象
可以像之前的串口程序一樣使用,但是上位機的波特率似乎是任意值,都可以正常使用。
總結
以上是生活随笔為你收集整理的12_STM32Cubeide开发_USB从设备串口驱动程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【单片机】msp430几种不同开发平台的
- 下一篇: [BUAA OO Unit 2 HW8]