chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于極海APM32F103的USB鍵盤與虛擬串口例程

Geehy極海半導(dǎo)體 ? 來源:21ic論壇極海半導(dǎo)體專區(qū) ? 2025-08-16 09:20 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

《APM32芯得》系列內(nèi)容為用戶使用APM32系列產(chǎn)品的經(jīng)驗(yàn)總結(jié),均轉(zhuǎn)載自21ic論壇極海半導(dǎo)體專區(qū),全文未作任何修改,未經(jīng)原文作者授權(quán)禁止轉(zhuǎn)載。

最近在編寫DMA_ADC例程的過程中出現(xiàn)了一個(gè)中斷配置的問題,在ADC采集過程中,結(jié)合手冊(cè)進(jìn)行ADC連續(xù)轉(zhuǎn)換模式配置采集,手冊(cè)上給出需要進(jìn)行中斷配置的信息,但是真實(shí)情況不需要進(jìn)行中斷配置也可以進(jìn)行ADC連續(xù)轉(zhuǎn)換采集,因此,我沒過濾掉ADC采集中開啟中斷配置的信息,開啟了ADC中斷采集,因此這次以APM32F411官方例程中的DMA_ADC例程,復(fù)刻了此次出現(xiàn)的問題。

APM32F103具有USB全速接口,可以做USB從機(jī)的多種功能。USB協(xié)議中為了提供對(duì)多樣設(shè)備的支持,定義了許多外部設(shè)備子類,常見的包括:

人機(jī)交互類設(shè)備HID(Human Interface Device)

通信類設(shè)備CDC(Communicate Device Class)

大容量存儲(chǔ)設(shè)備MSC(Mass Storage Class)

視頻類設(shè)備UVC(USB Video Class)

音頻類設(shè)備UAC(USB Audio Class)

HID (Human Interface Device)是一種用于連接人機(jī)交互設(shè)備的USB設(shè)備類別。它定義了一組通用的協(xié)議和規(guī)范,用于支持鍵盤、鼠標(biāo)、游戲控制器等各種輸入設(shè)備的連接和交互。

CDC(Communication Device Class)是USB組織定義的一類專門給各種通信設(shè)備(電信通信設(shè)備和中速網(wǎng)絡(luò)通訊設(shè)備)使用的USB子類,常用于虛擬串口。

USB大容量存儲(chǔ)設(shè)備類(The USB mass storage device class)是一種計(jì)算機(jī)和移動(dòng)設(shè)備之間的傳輸協(xié)議,它允許一個(gè)通用串行總線(USB)設(shè)備來訪問主機(jī)的計(jì)算設(shè)備,使兩者之間進(jìn)行文件傳輸,常用于存儲(chǔ)器讀寫和模擬U盤。

SDK中提供的例程就有虛擬串口CDC、鼠標(biāo)HID、模擬U盤MSC的功能。

除了這些USB做單項(xiàng)功能的,USB還可以配置復(fù)合設(shè)備,能同時(shí)集成了多個(gè)不同類型的外設(shè),可以實(shí)現(xiàn)多個(gè)功能的同時(shí)使用

接下來就嘗試在極海SDK中增加HID KeyBoard+CDC 虛擬串口的復(fù)合設(shè)備配置,修改就基于極海APM32F10x_SDK_V1.8中已有的USB_CDC_VirtualCOMPort例程,就不用重新配置虛擬串口部分了。

實(shí)現(xiàn)要對(duì)USB的描述符進(jìn)行修改,能讓電腦識(shí)別出來是個(gè)什么設(shè)備。

1、USB設(shè)備描述符

重點(diǎn)是bDeviceClass改成0xEF,告訴電腦這是個(gè)復(fù)合設(shè)備。

const uint8_t g_usbDeviceDescriptor[USB_DEVICE_DESCRIPTOR_SIZE] =

{

0x12, /*bLength:長度,設(shè)備描述符的長度為18字節(jié)*/

USBD_DESC_DEVICE, /*bDescriptorType*/

0x00,0x02, /*bcdUSB = 2.00 */

0xEF, /*bDeviceClass*/

0x02, /*bDeviceSubClass*/

0x01, /*bDeviceProtocol*/

0x40, /*bMaxPacketSize40---------------------------*/

0x83,0x05, /*idVendor (0x0583)*/

0x50,0x57, /*idProduct = 0x5750*/

0x00, /*bcdDevice rel. 2.00*/

0x02,

1, /*Index of string descriptor describing

manufacturer */

2, /*Index of string descriptor describing

product*/

3, /*Index of string descriptor describing the

device serial number */

0x01 /*bNumConfigurations*/

};

2、USB配置描述符

這里配置USB的配置描述符、接口描述符和端點(diǎn)描述符。

HID鍵盤使用兩個(gè)端點(diǎn),端點(diǎn)4(IN)和端點(diǎn)4(OUT)

VCP虛擬串口使用三個(gè)端點(diǎn),端點(diǎn)1(IN)、端點(diǎn)1(OUT)和端點(diǎn)2(IN)

const uint8_t g_usbConfigDescriptor[USB_CONFIG_DESCRIPTOR_SIZE] =

{

0x09, /* bLength: Configuration Descriptor size */

USBD_DESC_CONFIGURATION, /* bDescriptorType: Configuration */

USB_CONFIG_DESCRIPTOR_SIZE,

/* wTotalLength: Bytes returned */

0x00,

0x03, /* bNumInterfaces: 1 interface */

0x01, /* bConfigurationValue: Configuration value */

0x00, /* iConfiguration: Index of string descriptor describing

the configuration*/

0xC0, /* bmAttributes: Self powered */

0x32, /* MaxPower 100 mA: this current is used for detecting Vbus */

/*************************************功能1 HID鍵盤**************************************/

/*IAD描述符*/

0x08, //bLength:IAD描述符大小

0x0B, //bDescriptorType:IAD描述符類型

0x00, //bFirstInterface:功能1 HID鍵盤的第一個(gè)接口描述符是在總的配置描述符中的第幾個(gè)從0開始數(shù)

0x01, //bInferfaceCount:功能1 HID鍵盤有1個(gè)接口描述符

0x03, //bFunctionClass:同單HID功能時(shí),設(shè)備符中的bDeviceClass

0x00, //bFunctionSubClass:同單HID功能時(shí),設(shè)備符中的bDeviceSubClass

0x01, //bFunctionProtocol:同單HID功能時(shí),設(shè)備符中的bDeviceProtocol

0x00, //iFunction:字符串描述中關(guān)于此設(shè)備的索引(個(gè)人理解是一個(gè)字符串描述符中有比如0~5是功能1的字符串,

//6~10是功能2的字符串,如果是功能2的話,此值為6)

/************** Descriptor of Custom HID interface ****************/

/* 09 */

0x09, /* bLength: Interface Descriptor size */

USBD_DESC_INTERFACE,/* bDescriptorType: Interface descriptor type */

0x00, /* bInterfaceNumber: Number of Interface */

0x00, /* bAlternateSetting: Alternate setting */

0x02, /* bNumEndpoints */

0x03, /* bInterfaceClass: HID */

0x01, /* bInterfaceSubClass : 1=BOOT, 0=no boot */

0x01, /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */

0, /* iInterface: Index of string descriptor */

/******************** Descriptor of Custom HID HID ********************/

/* 18 */

0x09, /* bLength: HID Descriptor size */

0x21, /* bDescriptorType: HID */

0x10, /* bcdHID: HID Class Spec release number */

0x01,

0x00, /* bCountryCode: Hardware target country */

0x01, /* bNumDescriptors: Number of HID class descriptors to follow */

0x22, /* bDescriptorType */

KEYBOARD_SIZ_REPORT_DESC,

//KEYBOARD_SIZ_REPORT_DESC,/* wItemLength: Total length of Report descriptor */

0x00,

/******************** Descriptor of Custom HID endpoints ******************/

/* 27 */

0x07, /* bLength: Endpoint Descriptor size */

USBD_DESC_ENDPOINT, /* bDescriptorType: */

0x84, /* bEndpointAddress: Endpoint Address (IN) */

0x03, /* bmAttributes: Interrupt endpoint */

0x08, /* wMaxPacketSize: 8 Bytes max */

0x00,

0x20, /* bInterval: Polling Interval (32 ms) */

/* 34 */

0x07, /* bLength: Endpoint Descriptor size */

USBD_DESC_ENDPOINT, /* bDescriptorType: */

/* Endpoint descriptor type */

0x04, /* bEndpointAddress: */

/* Endpoint Address (OUT) */

0x03, /* bmAttributes: Interrupt endpoint */

0x01, /* wMaxPacketSize: 2 Bytes max */

0x00,

0x20, /* bInterval: Polling Interval (20 ms) */

/* 41 */

/********************************功能2 VCP虛擬串口*****************************/

/*IAD描述符*/

/* Interface Association Descriptor(IAD Descriptor) */

0x08, /* bLength */

0x0B, /* bDescriptorType*/

0x01, /* bFirstInterface*/

0x02, /* bInterfaceCount*/

0x02, /* bFunctionClass --CDC*/

0x02, /* bFunctionSubClass*/

0x01, /* bFunctionProtocoll*/

0x00, /* iFunction */

/**VCP虛擬串口**/

/*Interface Descriptor接口描述符*/

0x09, /* bLength: Interface Descriptor size */

USBD_DESC_INTERFACE, /* bDescriptorType: Interface */

/* Interface descriptor type */

0x01, /* bInterfaceNumber: Number of Interface */ //<接口 1>

0x00, /* bAlternateSetting: Alternate setting */

0x01, /* bNumEndpoints: One endpoints used 該接口非0端點(diǎn)數(shù)*/

0x02, /* bInterfaceClass: Communication Interface Class */

0x02, /* bInterfaceSubClass: Abstract Control Model */

0x01, /* bInterfaceProtocol: Common AT commands */

0x00, /* iInterface: */

/*Header Functional Descriptor類描述符*/

0x05, /* bLength: Endpoint Descriptor size */

0x24, /* bDescriptorType: CS_INTERFACE */

0x00, /* bDescriptorSubtype: Header Func Desc */

0x10, /* bcdCDC: spec release number */

0x01,

/*Call Management Functional Descriptor*/

0x05, /* bFunctionLength */

0x24, /* bDescriptorType: CS_INTERFACE */

0x01, /* bDescriptorSubtype: Call Management Func Desc */

0x00, /* bmCapabilities: D0+D1 */

0x01, /* bDataInterface: 1 */

/*ACM Functional Descriptor*/

0x04, /* bFunctionLength */

0x24, /* bDescriptorType: CS_INTERFACE */

0x02, /* bDescriptorSubtype: Abstract Control Management desc */

0x02, /* bmCapabilities */

/*Union Functional Descriptor*/

0x05, /* bFunctionLength */

0x24, /* bDescriptorType: CS_INTERFACE */

0x06, /* bDescriptorSubtype: Union func desc */

0x00, /* bMasterInterface: Communication class interface */

0x01, /* bSlaveInterface0: Data Class Interface */

/*Endpoint 2 Descriptor端點(diǎn)描述符*/

0x07, /* bLength: Endpoint Descriptor size */

USBD_DESC_ENDPOINT, /* bDescriptorType: Endpoint */

0x82, /* bEndpointAddress: (IN2) */

0x03, /* bmAttributes: Interrupt */

VIRTUAL_COM_PORT_INT_SIZE, /* wMaxPacketSize: */

0x00,

0xFF, /* bInterval: */

/*Data class interface descriptor類描述符*/

0x09, /* bLength: Endpoint Descriptor size */

USBD_DESC_INTERFACE, /* bDescriptorType: */

0x02, /* bInterfaceNumber: Number of Interface */

0x00, /* bAlternateSetting: Alternate setting */

0x02, /* bNumEndpoints: Two endpoints used */

0x0A, /* bInterfaceClass: CDC */

0x00, /* bInterfaceSubClass: */

0x00, /* bInterfaceProtocol: */

0x00, /* iInterface: */

/*Endpoint 3 Descriptor端點(diǎn)描述符*/

0x07, /* bLength: Endpoint Descriptor size */

USBD_DESC_ENDPOINT, /* bDescriptorType: Endpoint */

0x01, /* bEndpointAddress: (OUT1) */

0x02, /* bmAttributes: Bulk */

VIRTUAL_COM_PORT_DATA_SIZE, /* wMaxPacketSize: */

0x00,

0x00, /* bInterval: ignore for Bulk transfer */

/*Endpoint 1 Descriptor 端點(diǎn)描述符*/

0x07, /* bLength: Endpoint Descriptor size */

USBD_DESC_ENDPOINT, /* bDescriptorType: Endpoint */

0x81, /* bEndpointAddress: (IN1) */

0x02, /* bmAttributes: Bulk */

VIRTUAL_COM_PORT_DATA_SIZE, /* wMaxPacketSize: */

0x00,

0x00 /* bInterval */

};

3、USB HID報(bào)告描述符

const uint8_t s_hidKeyboardReportDescriptor[HID_REPORT_DESCRIPTOR_SIZE] =

{

/*short Item D7~D4:bTag;D3~D2:bType;D1~D0:bSize

**bTag ---主條目 1000:輸入(Input) 1001:輸出(Output) 1011:特性(Feature) 1010:集合(Collection) 1100:關(guān)集合(End Collection)

** 全局條目 0000:用途頁(Usage Page) 0001:邏輯最小值(Logical Minimum) 0010:邏輯最大值(Logical Maximum) 0011:物理最小值(Physical Minimum)

** 0100:物理最大值(Physical Maximum) 0101:單元指數(shù)(Unit Exponet) 0110:單元(Unit) 0111:數(shù)據(jù)域大小(Report Size)

** 1000:報(bào)告ID(Report ID) 1001:數(shù)據(jù)域數(shù)量(Report Count) 1010:壓棧(Push) 1011:出棧(Pop) 1100~1111:保留(Reserved)

** 局部條目 0000:用途(Usage) 0001:用途最小值(Usage Minimum) 0010:用途最大值(Usage Maximum) 0011:標(biāo)識(shí)符索引(Designator Index)

** 0100:標(biāo)識(shí)符最小值(Designator Minimum) 0101:標(biāo)識(shí)符最大值(Designator Maximum) 0111:字符串索引(String Index) 1000:字符串最小值(String Minimum)

** 1001:字符串最大值(String Maximum) 1010:分隔符(Delimiter) 其他:保留(Reserved)

**bType---00:主條目(main) 01:全局條目(globle) 10:局部條目(local) 11:保留(reserved)

**bSize---00:0字節(jié) 01:1字節(jié) 10:2字節(jié) 11:4字節(jié)*/

//0x05:0000 01 01 這是個(gè)全局條目,用途頁選擇為普通桌面頁

0x05, 0x01, // USAGE_PAGE (Generic Desktop)

//0x09:0000 10 01 這是個(gè)全局條目,用途選擇為鍵盤

0x09, 0x06, // USAGE (Keyboard)

//0xa1:1010 00 01 這是個(gè)主條目,選擇為應(yīng)用集合,

0xa1, 0x01, // COLLECTION (Application)

//0x05:0000 01 11 這是個(gè)全局條目,用途頁選擇為鍵盤/按鍵

0x05, 0x07, // USAGE_PAGE (Keyboard/Keypad)

//0x19:0001 10 01 這是個(gè)局部條目,用途的最小值為0xe0,對(duì)應(yīng)鍵盤上的左ctrl鍵

0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl)

//0x29:0010 10 01 這是個(gè)局部條目,用途的最大值為0xe7,對(duì)應(yīng)鍵盤上的有GUI(WIN)鍵

0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)

//0x15:0001 01 01 這是個(gè)全局條目,說明數(shù)據(jù)的邏輯值最小值為0

0x15, 0x00, // LOGICAL_MINIMUM (0)

//0x25:0010 01 01 這是個(gè)全局條目,說明數(shù)據(jù)的邏輯值最大值為1

0x25, 0x01, // LOGICAL_MAXIMUM (1)

//0x95:1001 01 01 這是個(gè)全局條目,數(shù)據(jù)域的數(shù)量為8個(gè)

0x95, 0x08, // REPORT_COUNT (8)

//0x75:0111 01 01 這是個(gè)全局條目,每個(gè)數(shù)據(jù)域的長度為1位

0x75, 0x01, // REPORT_SIZE (1)

//0x81:1000 00 01 這是個(gè)主條目,有8*1bit數(shù)據(jù)域作為輸入,屬性為:Data,Var,Abs

0x81, 0x02, // INPUT (Data,Var,Abs)

//0x95:1001 01 01 這是個(gè)全局條目,數(shù)據(jù)域的數(shù)量為1個(gè)

0x95, 0x01, // REPORT_COUNT (1)

//0x75:0111 01 01 這是個(gè)全局條目,每個(gè)數(shù)據(jù)域的長度為8位

0x75, 0x08, // REPORT_SIZE (8)

//0x81:1000 00 01 這是個(gè)主條目,有1*8bit數(shù)據(jù)域作為輸入,屬性為:Cnst,Var,Abs

0x81, 0x03, // INPUT (Cnst,Var,Abs)

//0x95:1001 01 01 這是個(gè)全局條目,數(shù)據(jù)域的數(shù)量為6個(gè)

0x95, 0x06, // REPORT_COUNT (6)

//0x75:0111 01 01 這是個(gè)全局條目,每個(gè)數(shù)據(jù)域的長度為8位

0x75, 0x08, // REPORT_SIZE (8)

//0x25:0010 01 01 這是個(gè)全局條目,邏輯最大值為255

0x25, 0xFF, // LOGICAL_MAXIMUM (255)

//0x19:0001 10 01 這是個(gè)局部條目,用途的最小值為0

0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated))

//0x29:0010 10 01 這是個(gè)局部條目,用途的最大值為0x65

0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application)

//0x81:1000 00 01 這是個(gè)主條目,有6*8bit的數(shù)據(jù)域作為輸入,屬相為屬性為:Data,Var,Abs

0x81, 0x00, // INPUT (Data,Ary,Abs)

//0x25:0010 01 01 這是個(gè)全局條目,邏輯的最大值為1

0x25, 0x01, // LOGICAL_MAXIMUM (1)

//0x95:1001 01 01 這是個(gè)全局條目,數(shù)據(jù)域的數(shù)量為2

0x95, 0x02, // REPORT_COUNT (2)

//0x75:0111 01 01 這是個(gè)全局條目,每個(gè)數(shù)據(jù)域的長度為1位

0x75, 0x01, // REPORT_SIZE (1)

//0x05:0000 01 01 這是個(gè)全局條目,用途頁選擇為LED

0x05, 0x08, // USAGE_PAGE (LEDs)

//0x19:0001 10 01 這是個(gè)局部條目,用途的最小值為0x01,對(duì)應(yīng)鍵盤上的Num Lock

0x19, 0x01, // USAGE_MINIMUM (Num Lock)

//0x29:0010 10 01 這是個(gè)局部條目,用途的最大值為0x02,對(duì)應(yīng)鍵盤上的Caps Lock

0x29, 0x02, // USAGE_MAXIMUM (Caps Lock)

//0x91:1001 00 01 這是個(gè)主條目,有2*1bit的數(shù)據(jù)域作為輸出,屬性為:Data,Var,Abs

0x91, 0x02, // OUTPUT (Data,Var,Abs)

//0x95:1001 01 01 這是個(gè)全局條目,數(shù)據(jù)域的數(shù)量為1個(gè)

0x95, 0x01, // REPORT_COUNT (1)

//0x75:0111 01 01 這是個(gè)全局條目,每個(gè)數(shù)據(jù)域的長度為6bit,正好與前面的2bit組成1字節(jié)

0x75, 0x06, // REPORT_SIZE (6)

//0x91:1001 00 01 這是個(gè)主條目,有1*6bit數(shù)據(jù)域最為輸出,屬性為:Cnst,Var,Abs

0x91, 0x03, // OUTPUT (Cnst,Var,Abs)

0xc0 // END_COLLECTION

};

4、修改端點(diǎn)緩存地址

在 usb_config.h中,調(diào)整每個(gè)USB端點(diǎn)分配的地址。

#define ENDP0_RXADDR (0x40)

#define ENDP0_TXADDR (0x80)

#define ENDP1_TXADDR (0xC0)

#define ENDP1_RXADDR (0x0F0)

#define ENDP2_TXADDR (0x110)

#define ENDP4_RXADDR (0x150)

#define ENDP4_TXADDR (0x190)

這時(shí)候就完成基本的配置,可以讓電腦識(shí)別到鍵盤和虛擬串口的設(shè)備,但不能正常使用。

接下來就是代碼初始化部分的修改。

基于本來虛擬串口的初始化增加HID配置

void CDC_Init(void)

{

USBD_InitParam_T usbParam;

USBD_InitParamStructInit(&usbParam);

usbParam.classReqHandler = USBD_ClassHandler;

usbParam.stdReqExceptionHandler = KeyBoard_ReportDescriptor;//增加HID配置

usbParam.resetHandler = VCP_Reset;

usbParam.inEpHandler = USBD_VCP_InEpCallback;

usbParam.outEpHandler = USBD_VCP_OutEpCallback;

usbParam.pDeviceDesc = (USBD_Descriptor_T *)&g_deviceDescriptor;

usbParam.pConfigurationDesc = (USBD_Descriptor_T *)&g_configDescriptor;

usbParam.pStringDesc = (USBD_Descriptor_T *)g_stringDescriptor;

usbParam.pStdReqCallback = &stdReqCallback;

USBD_Init(&usbParam);

}

void KeyBoard_ReportDescriptor(USBD_DevReqData_T *reqData)

{

uint8_t len;

if((reqData->byte.bRequest == USBD_GET_DESCRIPTOR) &&

(reqData->byte.bmRequestType.bit.recipient == USBD_RECIPIENT_INTERFACE) &&

(reqData->byte.bmRequestType.bit.type == USBD_REQ_TYPE_STANDARD))

{

if(reqData->byte.wValue[1] == 0x21)

{

len = USB_MIN(reqData->byte.wLength[0], 9);

USBD_CtrlInData((uint8_t *)&g_configDescriptor.pDesc[0x12], len);

}

else if(reqData->byte.wValue[1] == 0x22)

{

len = USB_MIN(reqData->byte.wLength[0], g_ReportDescriptor.size);

USBD_CtrlInData((uint8_t *)g_ReportDescriptor.pDesc, len);

}

}

else

{

USBD_SetEPTxRxStatus(USBD_EP_0, USBD_EP_STATUS_STALL, USBD_EP_STATUS_STALL);

}

}

到此配置部分基本完成,接下來到main中增加段測(cè)試代碼,驗(yàn)證USB配置是否正確。

配置虛擬串口一直打印dataBuf[5]= {0xaa,0xbb,0xcc,0xdd,0xff};

HID鍵盤根據(jù)鍵值表輸出數(shù)字1

void Delay(uint32_t i)

{

while(i--);

}

unsigned char dataBuf[5]= {0xaa,0xbb,0xcc,0xdd,0xff};

uint8_t Keyboad_Buf[8]={0,0,0x1E,0,0,0,0,0};

int main(void)

{

CDC_Init();

while(1)

{

USBD_TxData(USBD_EP_1, dataBuf, 5);

USBD_TxData(USBD_EP_4, Keyboad_Buf, 8);

Delay(0xFFFFFF);

}

}

cefa0432-765b-11f0-a18e-92fbcf53809c.png

燒錄代碼到開發(fā)板,接上USB線到電腦,可以看到Bushound能看到配置的復(fù)合設(shè)備。

cf12170c-765b-11f0-a18e-92fbcf53809c.png

使用串口助手能看到虛擬串口能正確打印我們的數(shù)據(jù),鍵盤也正常在發(fā)送數(shù)字1,證明代碼配置沒問題,兩個(gè)功能使用一個(gè)USB接口實(shí)現(xiàn)了。SDK的虛擬串口也有做接收回傳的功能,可以直接使用。

到此鍵盤+虛擬串口的例程就簡(jiǎn)單修改完成了。

注:文章作者在原帖中提供了例程文件,有需要請(qǐng)至原文21ic論壇下載

原文地址:https://bbs.21ic.com/icview-3321226-1-1.html

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • usb
    usb
    +關(guān)注

    關(guān)注

    60

    文章

    8319

    瀏覽量

    278969
  • adc
    adc
    +關(guān)注

    關(guān)注

    100

    文章

    6812

    瀏覽量

    551986
  • 鍵盤
    +關(guān)注

    關(guān)注

    4

    文章

    868

    瀏覽量

    41340
  • 虛擬串口
    +關(guān)注

    關(guān)注

    3

    文章

    64

    瀏覽量

    14418

原文標(biāo)題:APM32芯得 EP.62 | 基于APM32F103的USB鍵盤與虛擬串口復(fù)合設(shè)備配置詳解

文章出處:【微信號(hào):geehysemi,微信公眾號(hào):Geehy極海半導(dǎo)體】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    新品發(fā)布丨半導(dǎo)體推出工業(yè)級(jí)標(biāo)準(zhǔn)型APM32S103系列MCU

    半導(dǎo)體最新宣布推出,基于32位Arm Cortex-M3內(nèi)核的 工業(yè)級(jí)標(biāo)準(zhǔn)型 APM32S103系列MCU 。該系列新品作為APM32F103系列迭代產(chǎn)品,增加產(chǎn)線資源,完善供應(yīng)鏈
    的頭像 發(fā)表于 12-16 18:24 ?2733次閱讀

    APMEMIC/APM32F103系列

    我公司是APEXMIC正規(guī)代理商,主要負(fù)責(zé)推廣APEXMIC的32位MCU,APM32F103系列,可以無縫兼容 STM32F103C8T6,103CBT6, 103RBT6, 103
    發(fā)表于 11-14 17:14

    關(guān)于APM32F1與Sxx32F1的兼容性問題

    APM32F103市基于Cortex M3 內(nèi)核的微控制器,它與Sxx32F103兼容,同時(shí)優(yōu)化了性能參數(shù),增加了新的功能,可以完全取代Sxx32F103中容量芯片,同時(shí)增加功能,提升性能。 l管腳
    發(fā)表于 01-07 16:29

    國產(chǎn)品牌完美替代STM32F103系列產(chǎn)品簡(jiǎn)介

    品牌:上海航芯內(nèi)核:M33,兼容M4指令料號(hào):ACM32F303CBT8替代型號(hào):意法STM32F103以及兼容F103的所有國產(chǎn)型號(hào)(如
    發(fā)表于 01-25 11:57

    STM32F103 USB虛擬串口驅(qū)動(dòng)例程該怎樣去移植呢

    STM32F103 USB虛擬串口驅(qū)動(dòng)例程該怎樣去移植呢?有哪些移植步驟?
    發(fā)表于 11-09 07:02

    APM32F103微控制器與Sxx32F103芯片有哪些不同點(diǎn)呢

    APM32F103是什么?APM32F103微控制器與Sxx32F103芯片有哪些不同點(diǎn)呢?
    發(fā)表于 02-23 06:02

    基于APM32F103開發(fā)板無法點(diǎn)亮燈是何原因

    APM32F103VBMIN開發(fā)板,采用基于芯片新建工程,STLINK下載,點(diǎn)燈都不能點(diǎn)亮用keil直接用官方例程,不帶rtthread的例程
    發(fā)表于 08-24 14:17

    艾派克APM32F103系列MCU,助力產(chǎn)品性能優(yōu)勢(shì)更大化!

    艾派克APM32F103系列32位通用MCU,自去年12月發(fā)布以來,已通過客戶多次測(cè)試使用,獲得了良好的市場(chǎng)反饋。目前,該系列芯片已成功應(yīng)用于消費(fèi)類電子、工業(yè)控制、智能儀表以及物聯(lián)網(wǎng)產(chǎn)品等領(lǐng)域?,F(xiàn)在,小編就來為大家更詳細(xì)的介紹下,艾派克APM32F103的性能優(yōu)勢(shì)吧!
    發(fā)表于 04-26 08:49 ?1.2w次閱讀

    stm32f103&gd32的usb虛擬串口,打印類printer組合設(shè)備

    stm32f103&gd32的usb虛擬串口+打印類printer組合設(shè)備@TOCstm32f103&gd32的
    發(fā)表于 12-02 16:06 ?59次下載
    stm32<b class='flag-5'>f103</b>&gd32的<b class='flag-5'>usb</b><b class='flag-5'>虛擬</b><b class='flag-5'>串口</b>,打印類printer組合設(shè)備

    國產(chǎn)M3替代STM32F103XX

    硬件+軟件兼容:(1)中科芯cks32f103XX官網(wǎng)沒有資料(國企的通?。?,很草蕩,只有代理商那邊有開發(fā)板和資料(2)GD32F103兆易,資料全,用量多,價(jià)格在國產(chǎn)中算高,ST的80%(3)APM32F103珠海愛派克(后改
    發(fā)表于 12-02 18:21 ?11次下載
    國產(chǎn)M3替代STM32<b class='flag-5'>F103</b>XX

    APM32F103RCT7通過AEC-Q100車規(guī)認(rèn)證

    APM32F103RCT7 MCU芯片經(jīng)過廣電計(jì)量等第三方權(quán)威機(jī)構(gòu)檢測(cè),順利通過AEC-Q100車規(guī)認(rèn)證。
    發(fā)表于 02-07 10:38 ?2949次閱讀
    <b class='flag-5'>極</b><b class='flag-5'>海</b><b class='flag-5'>APM32F103</b>RCT7通過AEC-Q100車規(guī)認(rèn)證

    APM32F103編程手冊(cè)

    APM32F103編程手冊(cè)
    發(fā)表于 11-09 21:03 ?18次下載
    <b class='flag-5'>APM32F103</b>編程手冊(cè)

    APM32F103VCT6S_USB_MAC電腦無法識(shí)別USB設(shè)備

    APM32F103VCT6S_USB_MAC電腦無法識(shí)別USB設(shè)備
    發(fā)表于 11-09 21:04 ?0次下載
    <b class='flag-5'>APM32F103VCT6S_USB</b>_MAC電腦無法識(shí)別<b class='flag-5'>USB</b>設(shè)備

    喜報(bào)頻傳!APM32工業(yè)級(jí)/車規(guī)級(jí)MCU產(chǎn)品接連榮獲三項(xiàng)大獎(jiǎng)

    半導(dǎo)體喜報(bào)頻傳接連榮獲三項(xiàng)大獎(jiǎng)。半導(dǎo)體“工業(yè)級(jí)高安全MCU APM32F415”、 “工業(yè)級(jí)主流型MCU
    發(fā)表于 11-21 15:17 ?907次閱讀

    半導(dǎo)體推出工業(yè)級(jí)標(biāo)準(zhǔn)型APM32S103系列MCU

    APM32S103增強(qiáng)芯片標(biāo)準(zhǔn)性能,可在硬件管腳和軟件上覆蓋APM32F103系列產(chǎn)品,運(yùn)算主頻可達(dá)到96MHz,工作電壓范圍2.0V~3.6V,工作溫度范圍可覆蓋-40℃~+105℃,滿足商用級(jí)、工業(yè)級(jí)環(huán)境溫度的標(biāo)準(zhǔn)要求。
    的頭像 發(fā)表于 12-13 15:43 ?1714次閱讀