《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);
}
}
燒錄代碼到開發(fā)板,接上USB線到電腦,可以看到Bushound能看到配置的復(fù)合設(shè)備。
使用串口助手能看到虛擬串口能正確打印我們的數(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
-
usb
+關(guān)注
關(guān)注
60文章
8319瀏覽量
278969 -
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)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
新品發(fā)布丨極海半導(dǎo)體推出工業(yè)級(jí)標(biāo)準(zhǔn)型APM32S103系列MCU
APMEMIC/APM32F103系列
關(guān)于APM32F1與Sxx32F1的兼容性問題
國產(chǎn)品牌完美替代STM32F103系列產(chǎn)品簡(jiǎn)介
STM32F103 USB虛擬串口驅(qū)動(dòng)例程該怎樣去移植呢
APM32F103微控制器與Sxx32F103芯片有哪些不同點(diǎn)呢
基于APM32F103開發(fā)板無法點(diǎn)亮燈是何原因
艾派克APM32F103系列MCU,助力產(chǎn)品性能優(yōu)勢(shì)更大化!
stm32f103&gd32的usb虛擬串口,打印類printer組合設(shè)備

國產(chǎn)M3替代STM32F103XX

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

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

評(píng)論