日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

12_STM32Cubeide开发_USB从设备串口驱动程序

發布時間:2024/3/13 编程问答 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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.重新設置堆棧空間大小

三、驅動程序的修改


此時生成的初始化和中斷的代碼已經生成,用戶發送和接收數據只需要調用兩個函數就可以(也可以進行修改,實現自定義的通訊協議和功能)

in8_t CDC_Receive_FS(uint8_t* pbuf, uint32_t *Len); uin8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len);

類似于串口功能中的發送和接收一個字節數據的串口相關函數。

主要修改下圖中的兩個文件

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文件中修改

/* USER CODE BEGIN INCLUDE */ #define USB_REC_LEN 200//定義USB串口最大接收字節數 extern uint8_t USB_RX_BUF[USB_REC_LEN];//接收緩沖,最大USB_REC_LEN個字節.末字節為換行符 extern uint16_t USB_RX_STA;//接收狀態標記(接收到的有效字節數量) /* USER CODE END INCLUDE */

自定義函數聲明

/* USER CODE BEGIN EXPORTED_FUNCTIONS */ void USB_printf(const char *format, ...);//USB模擬串口的打印函數 /* USER CODE END EXPORTED_FUNCTIONS */

四、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从设备串口驱动程序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。