劉海艷等
【摘 要】本文介紹了一種基于STM32的可定制的USB鍵盤控制接口電路,與傳統(tǒng)鍵盤方案進行了比較,介紹了電源部分、USB接口部分的設計,針對矩陣鍵盤多按鍵的特殊需求,對基本按鍵提出了改進思路及軟件識別方法,在嵌入式系操作系統(tǒng)如WINCE、LINUX上有較高的通用性和靈活性。
【關(guān)鍵詞】STM32;USB接口;矩陣鍵盤;多按鍵
0 引言
隨著科技的不斷進度與發(fā)展,嵌入式系統(tǒng)無疑是當前最熱門最有發(fā)展前途的IT應用領域之一,像常見到的手機、PDA、機頂盒、高清電視(HDTV)、路由器、汽車電子、智能家電、醫(yī)療儀器、航天航空設備等都是典型的嵌入式系統(tǒng)。
嵌入式系統(tǒng)中人機交互技術(shù)最為重要,WINCE和LINUX系統(tǒng)比較流行,然而這兩種系統(tǒng)的驅(qū)動開發(fā)門檻較高,尤其對于特殊的矩陣鍵盤而言,實現(xiàn)基于USB接口的控制電路具有一定的難度。本文設計了一種基于STM32的可定制的USB鍵盤控制電路,比一般的專用的USB鍵盤接口芯片更加簡單方便,利用軟件的可以進行靈活的修改,大大的提高矩陣鍵盤的通用性。
1 方案比較
傳統(tǒng)方案:標準的PC104鍵盤大多采用專用的USB鍵盤芯片(如MC178-04B),其價格便宜而被廣泛運用,但是其接口比較固定,不利于開發(fā)者自己定制,例如按鍵連發(fā)、多鍵識別(A,E同時按下)等特定的功能需求,傳統(tǒng)方案的缺陷就慢慢的凸顯出來了。
本文設計的方案:運用帶USB接口功能的MCU(STM32F103ZET芯片)制作USB HID設備,根據(jù)矩陣鍵盤設計鍵碼掃描程序,可以完美的解決類似于上面的需求,同時STM32的芯片的性價比高、開發(fā)簡單,適合一般的嵌入式開發(fā)工程師。
2 系統(tǒng)的硬件設計(圖1)
系統(tǒng)總共分為5部分:系統(tǒng)供電部分,JTAG調(diào)試接口,矩陣鍵盤模塊,USB從設備接口,STM32F103ZET芯片內(nèi)部包含AD模塊,為了能夠使系統(tǒng)能夠正常運行,盡管AD模塊未使用,設計時應給予相應正常供電,使引腳VREF+、VDDA接VCC,引腳VREF-、VSSA接GND,否則系統(tǒng)不能正常運行。
2.1 電源部分
系統(tǒng)供電部分采用LT1117三端可調(diào)線性穩(wěn)壓芯片,輸出電流可達800mA,采用SOT-223封裝以減小空間,輸入端和輸出端分別接入100nF和10uF電容進行濾波降低電壓紋波,最終使電壓穩(wěn)定到3.3V。
2.2 USB 模塊接口電路設計(圖2)
根據(jù)USB1.1官方協(xié)議可知,USB為主從設備區(qū)分是有硬件電路實現(xiàn)的,USB HID設備屬于從設備,USB上拉電壓接在D+線上,所以本設計USB實現(xiàn)全速通訊。當開關(guān)開啟時,嵌入式系統(tǒng)就能自動開始枚舉該USB設備。
2.3 矩陣鍵盤接口設計
傳統(tǒng)的矩陣的鍵盤識別方法為掃描法和線反轉(zhuǎn)法,只能識別單個按鍵,硬件電路設計如圖3所示:
由上圖可知當雙按鍵按下時產(chǎn)生了線與邏輯沖突,對該設計進行改進,采用行線為開漏輸出,列線上有10K的上拉電阻,當雙按鍵按下時1和0線與產(chǎn)生0,這樣有效的識別了雙按鍵,如圖4所示:
3 軟件設計要點
3.1 USB鍵盤配置
USB通信協(xié)議中涉及了大量的描述符等相關(guān)信息其中包括設備描述符,配置描述符,接口描述符,HID描述符等,在STM32的庫文件中給出了相關(guān)的框架hw_config.c usb_desc.c usb_istr.c usb_prop.c usb_pwr.c嵌入式開發(fā)者進行相關(guān)的框架填寫便可進行正確的USB通信,USB鍵盤相關(guān)配置如下:
//開啟相關(guān)時鐘
/* Select USBCLK source */
RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5);
/* Enable USB clock */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USB, ENABLE);
//開啟相關(guān)USB通信中斷
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel =
USB_LP_CAN_RX0_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//USB發(fā)送緩存
u8 Key_Buffer[8] = {0,0,0,0,0,0,0,0};
Key_Buffer[0] = cmd;
Key_Buffer[2] = Keys;
/*copy mouse position info in ENDP1 Tx Packet Memory Area*/
UserToPMABufferCopy(Key_Buffer, GetEPTxAddr(ENDP1),8);
SetEPTxValid(ENDP1)。
3.2 多按鍵鍵盤識別
由于需要多按鍵識別處理,使用全鍵盤掃描另外再添加了橫向多按鍵處理,縱向多按鍵處理,處理步驟如下所示:
(1)行循環(huán)輸出senCode[RSIZE] =
{0X00FE,0X00FD,0X00FB,0X00F7,0X00EF,0X00DF,0X00BF,0X007F};
(2)列循環(huán)讀入getColDate();
(3)全掃描完畢后分別對獲取的列數(shù)據(jù)進行解析:
如果數(shù)據(jù)為下列之一
{0XFE00,0XFD00,0XFB00,0XF700,0XEF00,0XDF00,0XBF00,0X7F00};
則說明為單按鍵按下直接發(fā)送相關(guān)字符;
否則,dat & 0XFF00 != 0XFF00 則說明為雙按鍵按下,分別對數(shù)據(jù)的每一位進行處理判斷在哪一位為0說明在那一列當中有按鍵按下,同時與行輸出相結(jié)合從而有效的識別出了相關(guān)多按鍵按下;
(4)從按鍵映射表中找到相關(guān)的字符鍵碼,利用USB_SendChar()接口函數(shù)與主機設備進行通信。
4 結(jié)論
本文提出的基于USB接口的矩陣鍵盤控制接口電路,與傳統(tǒng)鍵盤方案進行了比較,其可定制的特點具有更大的靈活性。針對矩陣鍵盤多按鍵的特殊需求,對基本按鍵提出了改進的方法,對應多按鍵的識別上,提出了合理的解決步驟。在嵌入式系操作系統(tǒng)如WINCE、LINUX上有較高的通用性和靈活性,對于有外接4X4、8X8等矩陣鍵盤,手機鍵盤等,具有一定的實用價值。
【參考文獻】
[1]李小琦,汪紅.基于嵌入式Linux的USB鍵盤驅(qū)動設計[J].科技資訊,2009(19):97-98.
[2]李麗宏, 郝志剛. 嵌入式Linux的USB驅(qū)動設計[J]. 電子設計工程.2011(11): 170173.
[3]張淼,趙冒童.基于STM32F103RBT6芯片的USB鍵盤設計與實現(xiàn)[J]..福建電腦.2014.
[4]12:122-125[Z].
[責任編輯:鄧麗麗]