智能卡7816协议
?版權(quán)聲明:原創(chuàng)文章轉(zhuǎn)載請(qǐng)注明出處。?? ?https://blog.csdn.net/wwt18811707971/article/details/77732183
1.硬件接口
1.1端跨解釋:
連接接口?? ?解釋
VCC?? ?電源輸入(A類:5V, B類:3V)
RST?? ?復(fù)位信號(hào)輸入
CLK?? ?時(shí)鐘信號(hào)輸入
GND?? ?地,基準(zhǔn)電壓
VPP?? ?編程電壓輸入,由卡選用
I/O?? ?串行數(shù)據(jù)的輸入、輸出
1.2IC卡的操作信息交互流程:
當(dāng)卡的觸點(diǎn)物理的連接到接口設(shè)備的觸點(diǎn)時(shí),電路才能運(yùn)行。
(1) 接口設(shè)備能夠控制IC卡各IO引腳使其激活。
(2) 接口設(shè)備給卡發(fā)送復(fù)位信號(hào)使卡復(fù)位啟動(dòng)。
(3) 卡要向接口設(shè)備發(fā)送復(fù)位應(yīng)答信號(hào),將通信中必要的相關(guān)信息告知接口設(shè)備。
(4) 接口設(shè)備對(duì)卡進(jìn)行一次熱復(fù)位,卡進(jìn)行復(fù)位應(yīng)答。
(5) 接口設(shè)備發(fā)起一個(gè)PPS交互指令,選擇要與卡通信的協(xié)議和相關(guān)參數(shù)。
(6) 根據(jù)選擇的協(xié)議(T=0或T=1)進(jìn)行數(shù)據(jù)的通信。
1.3卡激活
為了與一個(gè)已經(jīng)物理的連接的卡發(fā)起交互,接口設(shè)備需要通過(guò)下面的操作激活卡。
(1)RST置成 L
(2)VCC上電
(3)接口設(shè)備上I/O置成接收模式
(4)在A類操作條件下,VPP應(yīng)該置為停止?fàn)顟B(tài);在B類操作條件下,不接VPP
(5)CLK將要被給一個(gè)時(shí)鐘信號(hào)。
1.4冷復(fù)位
激活結(jié)束后(RST在L狀態(tài),VCC上電,接口設(shè)備I/O在接收模式,CLK有一個(gè)適合的并且穩(wěn)定的時(shí)鐘信號(hào)),卡已經(jīng)準(zhǔn)備好冷復(fù)位。在冷啟動(dòng)之前,卡的內(nèi)部狀態(tài)沒(méi)有定義。接口設(shè)備將發(fā)出一個(gè)冷復(fù)位信號(hào),并從IC卡得到一個(gè)復(fù)位應(yīng)答,過(guò)程如下:
(1)從Ta時(shí)刻起,接口設(shè)備施加CLK。
(2)在Ta后不超過(guò)200個(gè)時(shí)鐘周期內(nèi),IC卡必須將其I/O線置為接收方式。由于接口設(shè)備也必須在這段期限內(nèi)置其I/O線驅(qū)動(dòng)器為接收方式,所以I/O線在Ta后最遲不超過(guò)200個(gè)時(shí)鐘周期的時(shí)間內(nèi)置為高電平。為此,接口設(shè)備的I/O觸點(diǎn)應(yīng)經(jīng)過(guò)一個(gè)上拉電阻接到V CC。
(3)接口設(shè)備應(yīng)從Ta開(kāi)始保持RST端為低電平狀態(tài)至少400個(gè)時(shí)鐘周期,并在T b 將其置為高電平;
(4)IC卡上I/O的復(fù)位應(yīng)答將在T b時(shí)刻后的400至40,000個(gè)時(shí)鐘周期內(nèi)開(kāi)始;
(5)如果IC卡在RST被拉高后的40000個(gè)時(shí)鐘周期內(nèi)沒(méi)有應(yīng)答,則RST將被拉低并且卡將被去激活。
注:1.假定卡的內(nèi)部狀態(tài)在冷復(fù)位前不定,這樣卡的設(shè)計(jì)必須避免不適當(dāng)?shù)牟僮?/p>
2.卡的復(fù)位可以由接口設(shè)備在任意時(shí)間隨意啟動(dòng)
1.5熱復(fù)位
IC卡對(duì)終端的復(fù)位應(yīng)答有著規(guī)定的規(guī)格和內(nèi)容,如果終端收到的復(fù)位應(yīng)答不符合規(guī)定要求時(shí),終端將啟動(dòng)一個(gè)熱復(fù)位并從IC卡獲得復(fù)位信號(hào)。過(guò)程如下:
(1)在VCC和CLK信號(hào)保持穩(wěn)定后,接口設(shè)備通過(guò)拉低RST發(fā)起熱復(fù)位,RST低電平至少要持續(xù)400個(gè)時(shí)鐘周期;
(2)在Tc之后的最多200周期內(nèi),IC卡和接口設(shè)備都必須置I/O為接收方式,即I/O線在Tc后最遲不超過(guò)200個(gè)時(shí)鐘周期內(nèi)置為高電平;
(3)接口設(shè)備在RST保持低電平大于400個(gè)時(shí)鐘周期后,將其拉高;
(4)IC卡上I/O的復(fù)位應(yīng)答將在T后的400至40,000個(gè)時(shí)鐘周期內(nèi)開(kāi)始;
(5)如果IC卡在RST被拉高后的40000個(gè)時(shí)鐘周期內(nèi)沒(méi)有應(yīng)答,RST將被拉低并且卡將被去激活;
1.6時(shí)鐘停止
對(duì)于支持時(shí)鐘停止的卡,當(dāng)接口設(shè)備認(rèn)為沒(méi)有來(lái)自卡的傳輸并當(dāng)I/O已經(jīng)保持在H至少1860時(shí)鐘周期(延時(shí)tg),在VCC上電并且RST在H時(shí),接口設(shè)備可以對(duì)于CLK(Te)進(jìn)行時(shí)鐘停止。
當(dāng)時(shí)鐘停止時(shí)(在Te~Tf),根據(jù)已被確定好的時(shí)鐘指示器X ,CLK將要繼續(xù)保持在在H或是在L。時(shí)鐘指示器X的值應(yīng)在復(fù)位應(yīng)答序列TA(i)當(dāng)中設(shè)置。
在Tf,接口設(shè)備重啟時(shí)鐘,在至少700時(shí)鐘延時(shí)后(th),在I/O的信息交換可以繼續(xù)。
1.7去激活
當(dāng)信息交換被完成或者被終止(例如卡沒(méi)有應(yīng)答,或檢測(cè)到卡的移動(dòng)),接口設(shè)備將按照下面的序列停用IC卡:
(1)將RST 置L
(2)將CLK置L(除非時(shí)鐘停止在L狀態(tài))
(3)將VPP去激活
(4)將I/O置L
(5)將VCC去激活
1.8參數(shù)選擇
接口設(shè)備可以發(fā)送協(xié)議和參數(shù)選擇指令(PPS),選擇要和IC卡進(jìn)行通信的協(xié)議和相關(guān)的參數(shù)。
(1) PPS協(xié)議
——>IFD發(fā)送一個(gè)PPS請(qǐng)求給ICC
——>如果ICC收到一個(gè)錯(cuò)誤的請(qǐng)求,則不響應(yīng)。
——>如果ICC受到一個(gè)正確的請(qǐng)求,則返回一個(gè)PPS響應(yīng),否則將超過(guò)初始等待時(shí)間
——>如果ICC超出初始等待時(shí)間,則IFD復(fù)位或者拒絕ICC
——>如果IFD收到一個(gè)錯(cuò)誤的應(yīng)答,則復(fù)位或者拒絕ICC
——>如果PPS交換失敗,則IFD復(fù)位或者拒絕ICC
(2) PPS請(qǐng)求的結(jié)構(gòu)和內(nèi)容
PPS 請(qǐng)求和響應(yīng)分別包括一個(gè)初始字節(jié) PPSS 后隨格式字節(jié) PPS0 三個(gè)可選參數(shù)字節(jié) PPS1 PPS2 和 PPS3 以及一個(gè)檢測(cè)字節(jié) PCK。
PPS 識(shí)別 PPS 請(qǐng)求或響應(yīng)并等于 FF。
PPS0 通過(guò)位 b5 b6 b7 分別指明可選字節(jié) PPS1 PPS2 PPS3 的存在 位 b4 到b1 傳輸參數(shù) T 的值以提出協(xié)議 位 b8 留作未來(lái)使用并設(shè)定為 0。
PPS1 允許 IFD 對(duì)卡提出 F 和 D 的值 。
PPS請(qǐng)求和應(yīng)答的結(jié)構(gòu)如下:
如果IFD不發(fā)送PPS1,它應(yīng)該繼續(xù)使用Fd和Dd。ICC通過(guò)響應(yīng)PPS1確認(rèn)這兩個(gè)值(此時(shí)使用的Fn和Dn),或者不響應(yīng)PPS1而繼續(xù)使用默認(rèn)值Fd和Dd。 PPS2和PPS3保留將來(lái)使用。 PCK的值應(yīng)使從PPSS至PCK(包括PCK)的所有字節(jié)的異或操作結(jié)果為0。
2.通訊協(xié)議說(shuō)明
2.1字符傳輸:
Smart Card的字符傳輸采用的是異步半雙工模式,這種異步的模式很像個(gè)人電腦上的RS232通信。傳輸一個(gè)字符時(shí),除了8Bits的數(shù)據(jù)外,還加了以下幾個(gè)Bits:
起始位:用于字符幀的同步
校驗(yàn)位: 用于校驗(yàn)檢測(cè)
在字符傳輸之前,I/O應(yīng)該處于高電平。智能卡與CPU之間按照異步方式傳送字節(jié),其具有統(tǒng)一的字符傳輸格式,一個(gè)字由連續(xù)的10個(gè)ETU完成發(fā)送,期間傳送1個(gè)起始位,8個(gè)數(shù)據(jù)位和1個(gè)奇偶檢驗(yàn)位。其數(shù)據(jù)幀傳輸格式:10bit。
7816-3定義的通訊協(xié)議,基本上可以說(shuō)是RS232的翻版并在此基礎(chǔ)上進(jìn)行的改進(jìn),7816中只有一個(gè)IO同時(shí)兼具數(shù)據(jù)收發(fā)的功能,這點(diǎn)和RS232用RxD和TxD進(jìn)行數(shù)據(jù)收發(fā)是不同的。在RS232中我們有9600波特率、起始位、奇偶校驗(yàn)位、停止位這些概念,而在7816-3中都完整地保留了下來(lái),只不過(guò)7816-3中引入了etu,沒(méi)有使用bps,但是基本原理是一致的。etu的定義可以更加精確地描述每個(gè)數(shù)據(jù)位在傳輸過(guò)程中收發(fā)雙方的職責(zé)和角色轉(zhuǎn)換。
根據(jù)定義在智能卡上電復(fù)位的時(shí)候 1 etu = 372 / f ,其中f = 讀寫(xiě)設(shè)備通過(guò)CLK管腳提供給智能卡的時(shí)鐘頻率,通常在1–5 MHz之間。
etu的單位是時(shí)間單位秒(毫秒、微秒),等同于傳輸每個(gè)數(shù)據(jù)位所需的時(shí)間。對(duì)其取倒數(shù)得出來(lái)的就是每秒傳輸?shù)臄?shù)據(jù)位,也就是bps。我們?nèi) = 3.579545 MHz,用3579545除以372結(jié)果等于9622.4約為9600 bps。
2.2復(fù)位應(yīng)答——ATR
智能卡始終處于被動(dòng)的狀態(tài),所以終端設(shè)備在和智能卡進(jìn)行數(shù)據(jù)交互的時(shí)候,需要首先給智能卡發(fā)指令,智能卡才會(huì)對(duì)應(yīng)地給出應(yīng)答。而智能卡告訴終端的第一句話就是ATR,亦即“復(fù)位應(yīng)答”。
ATR內(nèi)容:
各字符解釋:
字符?? ?說(shuō)明
TS?? ?初始化字符
TO?? ?格式化字符
TAi, TBi, TCi, TDi (i=0/1)?? ?接口字符
T1, T2, T3 … TK?? ?歷史字符(指明了一些通用的信息,如卡的制造商,卡中被嵌入的芯片,卡的文件狀態(tài)等)
TCK?? ?校驗(yàn)字符
TS:初始字符,定義隨后字符的邏輯電平和位序。
T0:兩部分組成
高四位(b5-b8)稱之為Y1,用來(lái)指示后繼字符TA1至TD1是否存在,b5-b8位被置為邏輯“1“狀態(tài)者,相應(yīng)地表明TA1至TD1的存在。
低四位組(b1-b4)稱之為K,則表明歷史字節(jié)存在的數(shù)量
2.3T=0 協(xié)議
T=0是按照單個(gè)字符的方式實(shí)現(xiàn)智能卡和終端數(shù)據(jù)傳輸。
卡片和終端之間的數(shù)據(jù)傳輸是通過(guò)命令響應(yīng)的方式進(jìn)行的,卡片只能被動(dòng)地接收命令,并且給出響應(yīng)。所有的命令都是以命令頭開(kāi)始,而該命令被完整地執(zhí)行后(無(wú)論結(jié)果對(duì)錯(cuò)),必須以包含狀態(tài)字(SW1 SW2)的響應(yīng)結(jié)束。卡片和終端之間如何具體進(jìn)行數(shù)據(jù)傳輸?shù)?#xff0c;就依靠不同的通訊協(xié)議來(lái)實(shí)現(xiàn),其中主要有T=0、T=1、T=CL。其中T=0和T=1適用于接觸式卡片(7816),而T=CL適用于非接觸式卡片(14443)。
數(shù)據(jù)傳輸時(shí),終端向卡片發(fā)送命令,包含5個(gè)字節(jié)(分別是CLA + INS + P1 + P2 + P3,其中INS表示指令,說(shuō)明該命令的作用)的命令頭,也就是說(shuō)卡片必須要收到來(lái)自終端的5個(gè)字節(jié)的命令頭,才能決定下一步該干什么,然后根據(jù)做出的決定給終端一個(gè)反饋意見(jiàn)。同樣終端在發(fā)送完5個(gè)字節(jié)的命令頭后,也需要等待來(lái)自卡片的反饋后,再?zèng)Q定下一步該干什么。
反饋信息一共有三種:(1)空操作的過(guò)程字節(jié)NULL(0x60);(2)響應(yīng)字節(jié)ACK;(3)狀態(tài)字的第一個(gè)字節(jié)SW1。
NULL字節(jié)相當(dāng)于網(wǎng)絡(luò)通信中的“心跳包”,就是告訴終端不要進(jìn)行超時(shí)處理,繼續(xù)等待,而且NULL字節(jié)不見(jiàn)得是在卡片接收5個(gè)字節(jié)的命令頭后反饋,通常在卡片需要進(jìn)行大量數(shù)據(jù)更新或者復(fù)雜的加解密運(yùn)算時(shí),來(lái)不及返回狀態(tài)字(SW)時(shí)先發(fā)一個(gè)0x60。
ACK是用來(lái)決定后續(xù)的數(shù)據(jù)傳輸?shù)?#xff0c;不僅能決定傳輸?shù)姆较?#xff0c;還能決定后續(xù)傳輸字節(jié)的多少。如果ACK = INS,則傳輸剩余的全部字節(jié),如果ACK = INS ^ FF,則傳輸后續(xù)的一個(gè)字節(jié)。
SW1只能是“0x9X”以及“0x6X”(不能是空操作字節(jié)“0x60”),如果卡片返回的是SW1,那么接下來(lái)必須緊跟著另一個(gè)狀態(tài)字節(jié)SW2,標(biāo)志著卡片對(duì)于該命令處理的結(jié)束,如果不斷電,卡片在發(fā)送完SW2之后會(huì)等待下一個(gè)命令的到來(lái)。另外,因?yàn)镾W1只能是“0x6X”和“0x9X”,所以INS一定不能取值0x6X和0x9X。
ACK里面為什么會(huì)有僅傳輸后續(xù)一個(gè)字節(jié)的情形,而不是一次傳完后續(xù)的所有字節(jié)?主要是因?yàn)槿绻悄芸ㄐ酒瑳](méi)有那么多可以用于臨時(shí)緩存命令數(shù)據(jù)的RAM空間的話,就需要接收一個(gè)字節(jié)先處理一個(gè)字節(jié),直到剩余的字節(jié)能被一次性地處理了,再反饋一個(gè)INS作為過(guò)程字節(jié),把剩余的字節(jié)全部收進(jìn)來(lái)。
2.4T=1協(xié)議
T=1,最小的數(shù)據(jù)傳輸單元是“數(shù)據(jù)塊”,這個(gè)數(shù)據(jù)塊由若干個(gè)字節(jié)組成,其中有些字節(jié)是必須的,有些字節(jié)是可選的。每個(gè)數(shù)據(jù)塊最多可以包含多少個(gè)字節(jié)(也就是數(shù)據(jù)塊的大小)可以通過(guò)三種途徑確定:
(1)ATR中對(duì)應(yīng)協(xié)議T=1的專有接口字節(jié)指出;
(2)使用默認(rèn)的值;
(3)在數(shù)據(jù)傳輸過(guò)程中協(xié)商。
一個(gè)數(shù)據(jù)塊其實(shí)就是一個(gè)“數(shù)據(jù)包”,其中包頭的3個(gè)字節(jié)(NAD 1字節(jié) + PCB 1字節(jié) + LEN 1字節(jié))和包尾1個(gè)或者2個(gè)字節(jié)(如果采用LRC校驗(yàn)就是 1字節(jié),采用CRC校驗(yàn)就是 2字節(jié))是必須的,中間的信息數(shù)據(jù)域INF則是可選的。其中NAD代表節(jié)點(diǎn)地址,基本不用,可以設(shè)置為“00”;PCB代表協(xié)議控制字節(jié),用來(lái)指明數(shù)據(jù)塊的類型(分為:傳遞信息域數(shù)據(jù)的I-塊,應(yīng)答響應(yīng)的R-塊,負(fù)責(zé)通訊參數(shù)協(xié)商的S-塊)、序列號(hào)、是否存在后續(xù)的鏈接塊、是否有校驗(yàn)錯(cuò)誤、額外超時(shí)等待請(qǐng)求、信息數(shù)據(jù)域大小的協(xié)商等。
T=0、1的區(qū)別:協(xié)議最明顯的不同是T=1協(xié)議按照OSI的參考模型進(jìn)行了分層,分別是:物理層、數(shù)據(jù)鏈路層和應(yīng)用層。物理層主要是數(shù)據(jù)字符的傳輸,數(shù)據(jù)鏈路層主要是數(shù)據(jù)塊的傳輸,而應(yīng)用層主要是APDU的交互傳輸。APDU的交互與數(shù)據(jù)字符的傳輸,這些和T=0協(xié)議里面描述的大體相同,關(guān)鍵的就是數(shù)據(jù)鏈路層定義的數(shù)據(jù)塊傳輸。因?yàn)檫@個(gè)數(shù)據(jù)鏈路層的定義,使得T=1協(xié)議基本具備了可以實(shí)現(xiàn)復(fù)雜網(wǎng)絡(luò)數(shù)據(jù)傳輸?shù)娜刻卣?#xff0c;相比而言T=0協(xié)議簡(jiǎn)直就等同于“裸傳”了。
2.5APDU報(bào)文結(jié)構(gòu)
APDU(ApplicationProtocolDataUnit–應(yīng)用協(xié)議數(shù)據(jù)單元)。協(xié)議數(shù)據(jù)單元PDU(ProtocolDataUnit)是指對(duì)等層次之間傳遞的數(shù)據(jù)單位。協(xié)議數(shù)據(jù)單元(ProtocolDataUnit)物理層的PDU是數(shù)據(jù)位(bit),數(shù)據(jù)鏈路層的PDU是數(shù)據(jù)幀(frame),網(wǎng)絡(luò)層的PDU是數(shù)據(jù)包(packet),傳輸層的PDU是數(shù)據(jù)段(segment),其他更高層次的PDU是數(shù)據(jù)(data)。
智能卡數(shù)據(jù)的操作,包括選擇、讀取、寫(xiě)入/更新都是通過(guò)特定的文件操作APDU命令來(lái)完成的。
命令A(yù)PDU由一個(gè)四個(gè)字節(jié)長(zhǎng)的命令頭和可變長(zhǎng)度的命令體構(gòu)成。
命令A(yù)PDU傳輸?shù)臄?shù)據(jù)長(zhǎng)度由Lc表示(命令數(shù)據(jù)域的長(zhǎng)度)。
命令響應(yīng)APDU數(shù)據(jù)域的最大長(zhǎng)度由期望數(shù)據(jù)長(zhǎng)度(Le)表示。當(dāng) Le 值為零時(shí),應(yīng)答數(shù)據(jù)域最大長(zhǎng)度為256。如果命令報(bào)文中需要,則Le總是‘00’。
命令各字段含義:
字段?? ?含義
CLA?? ?命令報(bào)文的類別字節(jié)
P1?? ?參數(shù) 1
P2?? ?參數(shù) 2
Lc?? ?Data的長(zhǎng)度(含4字節(jié)mac)
Data?? ?在命令的數(shù)據(jù)字段中發(fā)送的字節(jié)串
Le?? ?在向命令響應(yīng)的數(shù)據(jù)字段中期望的字節(jié)最大數(shù)
四種命令:
類別?? ?組成
Case1?? ?CLA INS P1 P2
Case2?? ?CLA INS P1 P2 Le
Case3?? ?CLA INS P1 P2 Lc Data
Case4?? ?CLA INS P1 P2 Lc Data Le
Case1:
4字節(jié)命令頭,這種情況時(shí),命令中沒(méi)有數(shù)據(jù)送到卡( Lc)中,也沒(méi)有數(shù)據(jù)從卡中返回( Le)。
不含安全報(bào)文的命令: CLA | INS | P1 | P2
含安全報(bào)文的命令: CLA | INS | P1 | P2 | Lc | MAC
注: Lc = MAC 的長(zhǎng)度, 4 字節(jié)。
Case2:
5字節(jié)命令頭,這種情況時(shí),命令中沒(méi)有數(shù)據(jù)送到卡( Lc)中,有數(shù)據(jù)從卡中返回( Le)。
不含安全報(bào)文的命令: CLA | INS | P1 | P2 | Le
含安全報(bào)文的命令: CLA | INS | P1 | P2 | Lc | MAC | Le
注: Lc = MAC 的長(zhǎng)度, 4 字節(jié)。
Case3:
5字節(jié)命令頭,這種情況時(shí),命令中有數(shù)據(jù)送到卡( Lc)中,沒(méi)有數(shù)據(jù)從卡中返回( Le)。
不含安全報(bào)文的命令: CLA | INS | P1 | P2 | Lc | Data
含安全報(bào)文的命令: CLA | INS | P1 | P2 | Lc | Data+MAC
注: Lc = 數(shù)據(jù)的長(zhǎng)度 + MAC 的長(zhǎng)度( 4 字節(jié))。
Case4:
5字節(jié)命令頭,這種情況時(shí),命令中既有數(shù)據(jù)送到卡( Lc)中,也有數(shù)據(jù)從卡中返回( Le)。
不含安全報(bào)文的命令: CLA | INS | P1 | P2 | Lc | Data | Le
含安全報(bào)文的命令: CLA | INS | P1 | P2 | Lc | Data+MAC | Le
注: Lc = 數(shù)據(jù)的長(zhǎng)度 + MAC 的長(zhǎng)度( 4 字節(jié))。
響應(yīng)APDU包括一個(gè)可變長(zhǎng)度的報(bào)文體和一個(gè)長(zhǎng)度為2個(gè)字節(jié)的報(bào)文尾。
字段解釋:
字段?? ?解釋
Data?? ?在響應(yīng)的數(shù)據(jù)字段中收到的字節(jié)串
SW1?? ?狀態(tài)字 1
SW2?? ?狀態(tài)字 2
參考:
1.深入理解7816(1)—- 關(guān)于F/D和etu
2.深入理解7816(2)—關(guān)于ATR
3.深入理解7816(3)—–關(guān)于T=0
4.深入理解7816(4)—關(guān)于T=1
5.ISO 7816協(xié)議及智能卡驅(qū)動(dòng)介紹
6.IC卡標(biāo)準(zhǔn) 中文版 第三冊(cè)
7.智能卡 7816協(xié)議
8.智能卡 APTU命令
9.IC卡復(fù)位應(yīng)答ATR的數(shù)據(jù)元和它們的意義
10.ISO7816 傳輸協(xié)議 T0 T1
11.APDU
12.IC卡通信協(xié)議詳解(7816-3)
---------------------?
作者:wwt18811707971?
來(lái)源:CSDN?
原文:https://blog.csdn.net/wwt18811707971/article/details/77732183?
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請(qǐng)附上博文鏈接!
總結(jié)
- 上一篇: 单片机IO口模拟SPI四种模式的程序
- 下一篇: ST-Link VCP Ctrl驱动安装