国产精品久久久久影院,成人午夜福利视频,国产精品久久久久高潮,国产精品 欧美 亚洲 制服,国产精品白浆无码流出

【GD32F303紅楓派開發(fā)板使用手冊】第二十講八 USB-虛擬串口實驗

發(fā)布者:SereneMeadow最新更新時間:2024-12-13 來源: elecfans關(guān)鍵字:GD32F303  USB  虛擬串口 手機看文章 掃描二維碼
隨時隨地手機看文章

28.USB-虛擬串口實驗

28.1實驗內(nèi)容

通過本實驗主要學(xué)習(xí)以下內(nèi)容:

  • CDC虛擬串口協(xié)議原理及使用

  • CDC虛擬串口通信操作

28.2實驗原理

USB的CDC類是USB通信設(shè)備類(Communication Device Class)的簡稱。CDC類是USB組織定義的一類專門給各種通信設(shè)備使用的USB子類。該設(shè)備類采用批量傳輸。

本例程中實現(xiàn)了CDC設(shè)備類的相關(guān)請求,包括SET_LINE_CODING、GET_LINE_CODING、SET_CONTROL_LINE_STATE等。后續(xù)將會在代碼解析章節(jié)進行介紹。

有關(guān)CDC協(xié)議可以通過以下USB官網(wǎng)下載或者通過紅楓派開發(fā)板配套資料獲取。

大家可以在學(xué)習(xí)的過程中結(jié)合歷程代碼和協(xié)議進行理解。

28.3硬件設(shè)計

USB虛擬鍵盤實驗章節(jié)已介紹。

28.4代碼解析

本例程主要實現(xiàn)USB虛擬串口的效果,在PC端可以通過串口調(diào)試助手或者設(shè)備管理器查到虛擬串口設(shè)備,并可實現(xiàn)通過該虛擬串口進行通信的現(xiàn)象。

本例程主函數(shù)如下,該函數(shù)架構(gòu)與虛擬鍵盤例程相似,當USBD設(shè)備初始化且枚舉完成后,USB設(shè)備首先通過cdc_acm_check_ready()函數(shù)check是否準備數(shù)據(jù)發(fā)送,如果不需要發(fā)送就調(diào)用cdc_acm_data_receive()函數(shù)接收上位機發(fā)送的數(shù)據(jù),如果需要發(fā)送就調(diào)用cdc_acm_data_send()將接收到的數(shù)據(jù)發(fā)送給主機,主機再回顯到串口調(diào)試助手的接收顯示界面中。

C
int main(void)
{
/* system clocks configuration */
rcu_config();

/* GPIO configuration */
gpio_config();

/* USB device configuration */
usbd_init(&usbd_cdc, &cdc_desc, &cdc_class);

/* NVIC configuration */
nvic_config();

/* enabled USB pull-up */
usbd_connect(&usbd_cdc);

while (USBD_CONFIGURED != usbd_cdc.cur_status) {
/* wait for standard USB enumeration is finished */
}

while (1) {
if (0U == cdc_acm_check_ready(&usbd_cdc)) {
cdc_acm_data_receive(&usbd_cdc);
} else {
cdc_acm_data_send(&usbd_cdc);
}
}
}

下面為大家介紹下虛擬串口設(shè)備所使用的設(shè)備及配置描述符。

設(shè)備描述符如下所示,其中bDevcieClass為0x02,表明當前設(shè)備為CDC設(shè)備類。

C
usb_desc_dev cdc_dev_desc =
{
.header =
{
.bLength = USB_DEV_DESC_LEN,
.bDescriptorType = USB_DESCTYPE_DEV,
},
.bcdUSB = 0x0200U,
.bDeviceClass = USB_CLASS_CDC,
.bDeviceSubClass = 0x00U,
.bDeviceProtocol = 0x00U,
.bMaxPacketSize0 = USBD_EP0_MAX_SIZE,
.idVendor = USBD_VID,
.idProduct = USBD_PID,
.bcdDevice = 0x0100U,
.iManufacturer = STR_IDX_MFC,
.iProduct = STR_IDX_PRODUCT,
.iSerialNumber = STR_IDX_SERIAL,
.bNumberConfigurations = USBD_CFG_MAX_NUM,
};

配置描述符如下所示,由配置描述符可知,該USB虛擬串口設(shè)備包含兩個接口:CMD命令接口和data數(shù)據(jù)接口。CMD命令接口包含一個IN端點,用于傳輸命令,該端點采用中斷傳輸方式,輪詢間隔為10ms,最大包長為8字節(jié)。data數(shù)據(jù)接口包含一個OUT端點和一個IN端點,這兩個端點均采用批量傳輸方式,最大包長為64字節(jié)。另外,該配置描述符中包含了一些類特殊接口描述符,具體請讀者參閱CDC類標準協(xié)議。

C
usb_cdc_desc_config_set cdc_config_desc =
{
.config =
{
.header =
{
.bLength = sizeof(usb_desc_config),
.bDescriptorType = USB_DESCTYPE_CONFIG,
},
.wTotalLength = USB_CDC_ACM_CONFIG_DESC_SIZE,
.bNumInterfaces = 0x02U,
.bConfigurationValue = 0x01U,
.iConfiguration = 0x00U,
.bmAttributes = 0x80U,
.bMaxPower = 0x32U
},

.cmd_itf =
{
.header =
{
.bLength = sizeof(usb_desc_itf),
.bDescriptorType = USB_DESCTYPE_ITF
},
.bInterfaceNumber = 0x00U,
.bAlternateSetting = 0x00U,
.bNumEndpoints = 0x01U,
.bInterfaceClass = USB_CLASS_CDC,
.bInterfaceSubClass = USB_CDC_SUBCLASS_ACM,
.bInterfaceProtocol = USB_CDC_PROTOCOL_AT,
.iInterface = 0x00U
},

.cdc_header =
{
.header =
{
.bLength = sizeof(usb_desc_header_func),
.bDescriptorType = USB_DESCTYPE_CS_INTERFACE
},
.bDescriptorSubtype = 0x00U,
.bcdCDC = 0x0110U
},

.cdc_call_managment =
{
.header =
{
.bLength = sizeof(usb_desc_call_managment_func),
.bDescriptorType = USB_DESCTYPE_CS_INTERFACE
},
.bDescriptorSubtype = 0x01U,
.bmCapabilities = 0x00U,
.bDataInterface = 0x01U
},

.cdc_acm =
{
.header =
{
.bLength = sizeof(usb_desc_acm_func),
.bDescriptorType = USB_DESCTYPE_CS_INTERFACE
},
.bDescriptorSubtype = 0x02U,
.bmCapabilities = 0x02U,
},

.cdc_union =
{
.header =
{
.bLength = sizeof(usb_desc_union_func),
.bDescriptorType = USB_DESCTYPE_CS_INTERFACE
},
.bDescriptorSubtype = 0x06U,
.bMasterInterface = 0x00U,
.bSlaveInterface0 = 0x01U,
},

.cdc_cmd_endpoint =
{
.header =
{
.bLength = sizeof(usb_desc_ep),
.bDescriptorType = USB_DESCTYPE_EP,
},
.bEndpointAddress = CDC_CMD_EP,
.bmAttributes = USB_EP_ATTR_INT,
.wMaxPacketSize = CDC_ACM_CMD_PACKET_SIZE,
.bInterval = 0x0AU
},

.cdc_data_interface =
{
.header =
{
.bLength = sizeof(usb_desc_itf),
.bDescriptorType = USB_DESCTYPE_ITF,
},
.bInterfaceNumber = 0x01U,
.bAlternateSetting = 0x00U,
.bNumEndpoints = 0x02U,
.bInterfaceClass = USB_CLASS_DATA,
.bInterfaceSubClass = 0x00U,
.bInterfaceProtocol = USB_CDC_PROTOCOL_NONE,
.iInterface = 0x00U
},

.cdc_out_endpoint =
{
.header =
{
.bLength = sizeof(usb_desc_ep),
.bDescriptorType = USB_DESCTYPE_EP,
},
.bEndpointAddress = CDC_OUT_EP,
.bmAttributes = USB_EP_ATTR_BULK,
.wMaxPacketSize = CDC_ACM_DATA_PACKET_SIZE,
.bInterval = 0x00U
},

.cdc_in_endpoint =
{
.header =
{
.bLength = sizeof(usb_desc_ep),
.bDescriptorType = USB_DESCTYPE_EP
},
.bEndpointAddress = CDC_IN_EP,
.bmAttributes = USB_EP_ATTR_BULK,
.wMaxPacketSize = CDC_ACM_DATA_PACKET_SIZE,
.bInterval = 0x00U
}
};

為了實現(xiàn)CDC設(shè)備類,設(shè)備需要支持一些設(shè)備類專用請求,這些類專用請求的處理在cdc_acm_req_handler()函數(shù)中,該函數(shù)的定義如下所示,其中SET_LINE_CODING命令用于響應(yīng)主機向設(shè)備發(fā)送設(shè)備配置,包括波特率、停止位、字符位數(shù)等,收到的數(shù)據(jù)保存在noti_bu內(nèi)。GET_LINE_CODING命令用于主機請求設(shè)備當前的波特率、停止位、奇偶校驗位和字符位數(shù),但在本例程中,主機并未請求該命令,所以設(shè)備所設(shè)置的串口數(shù)據(jù)并沒有作用,主機可以選擇任意波特率與設(shè)備進行通信。其他的命令在本例程中并未進行處理,讀者可以參考標準CDC類協(xié)議。

C
static uint8_t cdc_acm_req_handler (usb_dev *udev, usb_req *req)
{
uint8_t status = REQ_NOTSUPP, noti_buf[10] = {0U};
usb_cdc_handler *cdc = (usb_cdc_handler *)udev->class_data[CDC_COM_INTERFACE];

acm_notification *notif = (void *)noti_buf;

switch (req->bRequest) {
case SEND_ENCAPSULATED_COMMAND:
break;

case GET_ENCAPSULATED_RESPONSE:
break;

case SET_COMM_FEATURE:
break;

case GET_COMM_FEATURE:
break;

case CLEAR_COMM_FEATURE:
break;

case SET_LINE_CODING:
/* set the value of the current command to be processed */
udev->class_core->req_cmd = req->bRequest;

usb_transc_config(&udev->transc_out[0U], (uint8_t *)&cdc->line_coding, req->wLength, 0U);

status = REQ_SUPP;
break;

case GET_LINE_CODING:
usb_transc_config(&udev->transc_in[0U], (uint8_t *)&cdc->line_coding, 7U, 0U);

status = REQ_SUPP;
break;

case SET_CONTROL_LINE_STATE:
notif->bmRequestType = 0xA1U;
notif->bNotification = USB_CDC_NOTIFY_SERIAL_STATE;
notif->wIndex = 0U;
notif->wValue = 0U;
notif->wLength = 2U;
noti_buf[8] = (uint8_t)req->wValue & 3U;
noti_buf[9] = 0U;

status = REQ_SUPP;
break;

case SEND_BREAK:
break;

default:
break;
}

return status;
}

下面為大家介紹USBD虛擬串口設(shè)備數(shù)據(jù)的收發(fā)。

數(shù)據(jù)接收通過cdc_acm_data_receive()函數(shù)實現(xiàn),該函數(shù)的程序如下所示。在該函數(shù)中,首先將packet_receive標志位設(shè)置為0,表明接下來將進行接收數(shù)據(jù),當接收完成時,在cdc_acm_data_out()函數(shù)中,將packet_receive標志位置1,表明數(shù)據(jù)接收完成。usbd_ep_recev()用于配置接收操作,利用CDC_OUT_EP端點,將接收到的數(shù)據(jù)放置在cdc->data用戶緩沖區(qū)中。

C
void cdc_acm_data_receive(usb_dev *udev)
{
usb_cdc_handler *cdc = (usb_cdc_handler *)udev->class_data[CDC_COM_INTERFACE];

cdc->packet_receive = 0U;
cdc->pre_packet_send = 0U;

usbd_ep_recev(udev, CDC_OUT_EP, (uint8_t*)(cdc->data), USB_CDC_RX_LEN);
}
static void cdc_acm_data_out (usb_dev *udev, uint8_t ep_num)
{
usb_cdc_handler *cdc = (usb_cdc_handler *)udev->class_data[CDC_COM_INTERFACE];

cdc->packet_receive = 1U;

cdc->receive_length = udev->transc_out[ep_num].xfer_count;
}

數(shù)據(jù)發(fā)送通過cdc_acm_data_send()函數(shù)實現(xiàn),該函數(shù)的程序如下所示。在該函數(shù)中,首先將packet_sent標志位設(shè)置為0,表明接下來將進行發(fā)送數(shù)據(jù),當數(shù)據(jù)發(fā)送完成時,在cdc_acm_data_in()函數(shù)中,將packet_sent標志位設(shè)置為1,表明數(shù)據(jù)發(fā)送完成。usbd_ep_send()用于配置發(fā)送操作,利用CDC_IN_EP端點,將以cdc->data地址為起始data_len長度的數(shù)據(jù)發(fā)送給主機。

C
void cdc_acm_data_send (usb_dev *udev)
{
usb_cdc_handler *cdc = (usb_cdc_handler *)udev->class_data[CDC_COM_INTERFACE];
uint32_t data_len = cdc->receive_length;

if ((0U != data_len) && (1U == cdc->packet_sent)) {
cdc->packet_sent = 0U;
usbd_ep_send(udev, CDC_IN_EP, (uint8_t*)(cdc->data), (uint16_t)data_len);
cdc->receive_length = 0U;
}
}
static void cdc_acm_data_in (usb_dev *udev, uint8_t ep_num)
{
usb_transc *transc = &udev->transc_in[ep_num];
usb_cdc_handler *cdc = (usb_cdc_handler *)udev->class_data[CDC_COM_INTERFACE];

if (transc->xfer_count == transc->max_len) {
usbd_ep_send(udev, EP_ID(ep_num), NULL, 0U);
} else {
cdc->packet_sent = 1U;
cdc->pre_packet_send = 1U;
}
}

28.5實驗結(jié)果

將本例程燒錄到紅楓派開發(fā)板中,并通過TypeC數(shù)據(jù)線連接USB通信接口和PC,在WIN7上虛擬串口需要安裝驅(qū)動,在WIN8 WIN10以及后續(xù)版本的系統(tǒng)上不需要安裝驅(qū)動。

下面介紹WIN7系統(tǒng)的驅(qū)動安裝過程。

在WIN7系統(tǒng)上,將Tyep C數(shù)據(jù)線連接到PC后,將會在設(shè)備管理器中發(fā)現(xiàn)一個未知設(shè)備,通過以下連接可以下載官方提供的虛擬串口驅(qū)動:https://www.gd32mcu.com/download/down/document_id/44/path_type/1

wKgaomaEu1mAXrSFAAA70EeD8L4398.png

下載驅(qū)動并進行安裝,之后將會在設(shè)備管理器中發(fā)現(xiàn)虛擬串口設(shè)備已經(jīng)識別。

wKgaomaEu2aAG9zMAAAg_sC1I0w295.png

之后即可通過串口調(diào)試助手與MCU進行CDC通信,在串口調(diào)試助手中打開對應(yīng)虛擬串口的端口,然后輸入任意字符,進行發(fā)送,將會在接收窗口中看到MCU返回的接收數(shù)據(jù),具體現(xiàn)象如下所示。

wKgaomaEu3iAEMjYAACIVzxZxww116.png

關(guān)鍵字:GD32F303  USB  虛擬串口 引用地址:【GD32F303紅楓派開發(fā)板使用手冊】第二十講八 USB-虛擬串口實驗

上一篇:【GD32H757Z海棠派開發(fā)板使用手冊】第十五講 TFT-8080電阻屏屏觸摸實驗
下一篇:【GD32F303紅楓派開發(fā)板使用手冊】第二十一講 I2C-EEPROM讀寫實驗

推薦閱讀最新更新時間:2025-06-29 20:37

STM32CUBEMX F103 HAL庫開發(fā)之 USB虛擬串口
stm32 USB VPC虛擬串口簡介 很多stm32的開發(fā)版都帶有一個usb接口,可以用cubeMx將其配置成一個虛擬串口,使用USB線就可以打印調(diào)試信息,省去了用TTL轉(zhuǎn)USB的步驟,而且USB虛擬串口的速度和穩(wěn)定性比TTL轉(zhuǎn)USB要好,在開發(fā)中,這個工具可以幫助我們節(jié)省一個串口,同時獲得更穩(wěn)定的傳輸。 STM32F103C8T6_Black_Pill-1最小系統(tǒng)開發(fā)板 這個開發(fā)板性價比可謂是高到天際了,淘寶上遍地都是,它的led燈是接在PB12上的 ,我推薦這個板子作為實驗用,它還有一個專門的網(wǎng)站,STM32F103C8T6-Black-Pill 它也是stm32duino項目的官方支持的板子,最近也在搗鼓STM32du
[單片機]
單片機-stm32-使用cdc類實現(xiàn)vcp(虛擬串口
本文所述內(nèi)容基于STM32 HAL庫完成 安裝stm32CubeMx(ver4.26.0) 新建工程,選擇stm32f412zg tx 配置RCC- HSE- crystal/Ceramic Resonnator 配置USB_OTG_FS- device only(disable Activate_VBUS) 配置MiddleWares- USB_DEVICE- communication device class(virtual Port com) 配置clock,input frequency設(shè)置為8Mhz 其他參數(shù)全部默認,生成代碼 其中USBD_CDC_RegisterInterfac
[單片機]
單片機-stm32-使用cdc類實現(xiàn)vcp(<font color='red'>虛擬串口</font>)
Proteus-PIC-虛擬串口----串口調(diào)試仿真
1、準備工作 首先,需要準備齊全的軟件:① Prote us ;②MPLAB;③串口調(diào)試助手;④虛擬串口Virtual Serial Port Driver 2、繪制簡單電路圖 用不同的LED燈做指示燈 注:PIC和COMP1M電路連接:用串口調(diào)試助手作為輸入/輸出顯示,相關(guān)連線為對應(yīng)連接,即RX-RXD;TX-TXD(虛擬終端SCMR用于觀察單片機接受到的數(shù)據(jù)值,可去掉),也可以通過LED指示燈查看程序是否按照設(shè)定正常執(zhí)行。 3、編寫相應(yīng)的程序 應(yīng)用MPLAB編寫對應(yīng)的程序: //******************************************************* //
[單片機]
Proteus-PIC-<font color='red'>虛擬串口</font>----串口調(diào)試仿真
USB之STM32基礎(chǔ)
本篇筆記主要介紹 STM32 相關(guān)的知識點,畢竟之后的 CDC 教程是用 STM32 開發(fā)的。 為了寫這一篇,魚鷹把 STM32 中文參考手冊 USB 相關(guān)的從頭到尾看了一遍,雖然以前就已經(jīng)看過了,但這次看,收獲又是不同。 不過限于篇幅,魚鷹不會面面俱到,只介紹和 CDC 相關(guān)的一些東西。 要完成 USB 模擬串口(CDC)的實驗,STM32 手冊是必須細細閱讀的,不然代碼里面很多操作你是無法看懂的。 其實理解了前面的一些東西,你會發(fā)現(xiàn) STM32 中的 USB 知識和前面的大同小異,畢竟開發(fā)芯片的廠家也是按照 USB 標準來實現(xiàn)的,不會差到哪里去。 硬件基礎(chǔ) 首先,STM32F103 使用 PA11(USBDM,D-)和 PA1
[單片機]
基于USB總線的嵌入式CCD圖像數(shù)據(jù)采集系統(tǒng)的設(shè)計
CCD圖像數(shù)據(jù)的采集與普通視頻信號的采集相比,其最大的特點是數(shù)據(jù)傳輸速率高,傳輸通道多。目前,通用的CCD圖像數(shù)據(jù)采集方法是在計算機中插入高速數(shù)據(jù)采集卡,采集卡與CCD相機間通過點對點物理層接口(如RS-422、RS-485)進行數(shù)據(jù)傳輸,高速數(shù)據(jù)采集卡接收到數(shù)據(jù)并通過PCI總線將數(shù)據(jù)寫入計算機內(nèi)存,然后利用采集卡的存儲功能將數(shù)據(jù)通過IDE接口寫入計算機硬盤。這種方法雖然簡單可靠,但對多通道、高速圖像數(shù)據(jù)的采集在數(shù)據(jù)傳輸和存儲方面有一定的局限,容易引起數(shù)據(jù)幀的丟失,并且隨著傳輸通道的增多,引起傳輸導(dǎo)線數(shù)量增加,系統(tǒng)功耗及噪聲也隨之增大。通用串行總線USB能很好地解決這些問題,具有連接方便、無需外接電源、即插即用、支持熱插拔、高帶寬
[單片機]
基于<font color='red'>USB</font>總線的嵌入式CCD圖像數(shù)據(jù)采集系統(tǒng)的設(shè)計
安森美推出高能效 USB 供電方案
更高頻率的 AC-DC 控制器和驅(qū)動器改善產(chǎn)業(yè)設(shè)計,同時確保整個負載范圍內(nèi)最佳能效 2022年5月13日—領(lǐng)先于智能電源和智能感知技術(shù)的 安森美(onsemi) ,推出用于 USB 供電 (PD) 設(shè)計的三件一套新產(chǎn)品。新的控制器和驅(qū)動器提供創(chuàng)新的功能,能顯著減少高能效 AC-DC 電源的物料單(BOM)含量,尤其是在100 W 以上的負載范圍。 安森美電源轉(zhuǎn)換方案 分部高級總監(jiān) Shane Chilton 說:“USB PD 是個重要且不斷增長的應(yīng)用,但要滿足其能效和尺寸要求對設(shè)計人員是嚴峻的挑戰(zhàn)。設(shè)計人員采用我們這套新產(chǎn)品,可以從現(xiàn)有 BOM 中刪除多達 15 個器件,降低設(shè)計成本,同時確保滿足USB PD應(yīng)用的
[模擬電子]
安森美推出高能效 <font color='red'>USB</font> 供電方案
用HD-USB12協(xié)議分析儀分析和圖解USB枚舉過程
花了2300大銀敗了個HD-USB12協(xié)議分析儀(肉痛…)。不過還蠻好用,以后做USB固件開發(fā)就方便多了。 廢話少說,首先圖解一下USB枚舉過程。 一、總線復(fù)位及向默認地址0發(fā)送GET_DESCRIPTOR指令包,請求設(shè)備描述。 1)Index :表示USB插入總線復(fù)位 2)Index :表示主機向默認地址發(fā)送GET_DESCRIPTOR指令包,詳細信息也抓出來了,如(圖二)所示: 3)Index :表示設(shè)備向主機發(fā)送設(shè)備描述數(shù)據(jù)Index 4)Index :表示主機完成GET_DESCRIPTOR指令后,給設(shè)備發(fā)送一個空應(yīng)答; 二、再次復(fù)位總線及向
[測試測量]
用HD-<font color='red'>USB</font>12協(xié)議分析儀分析和圖解<font color='red'>USB</font>枚舉過程
STM32 USB DFU設(shè)備固件升級 工程講解
說到STM32 USB的UDF,其實就是我們常說的IAP( In Application Programming )在應(yīng)用編程。IAP有很多方法,我之前就用過串口IAP,網(wǎng)絡(luò)IAP。而這里我們使用的是USB IAP,就是通過USB更新代碼。所以這里有必要線了解IAP。 IAP是In Application Programming的首字母縮寫,IAP是用戶自己的程序在運行過程中對User Flash的部分區(qū)域進行燒寫,目的是為了在產(chǎn)品發(fā)布后可以方便地通過預(yù)留的通信口對產(chǎn)品中的 固件 程序進行更新升級。 通常在用戶需要實現(xiàn)IAP功能時,即用戶程序運行中作自身的更新操作,需要在設(shè)計固件程序時編寫兩個項目代碼,第一個項目程序不執(zhí)行
[單片機]
小廣播
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved