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