按鍵pos機鍵盤,阿波羅 STM32F767 開發(fā)板資料連載第六十五章 USB 鼠標(biāo)鍵盤實驗

 新聞資訊2  |   2023-07-04 09:19  |  投稿人:pos機之家

網(wǎng)上有很多關(guān)于按鍵pos機鍵盤,阿波羅 STM32F767 開發(fā)板資料連載第六十五章 USB 鼠標(biāo)鍵盤實驗的知識,也有很多人為大家解答關(guān)于按鍵pos機鍵盤的問題,今天pos機之家(www.shineka.com)為大家整理了關(guān)于這方面的知識,讓我們一起來看下吧!

本文目錄一覽:

1、按鍵pos機鍵盤

按鍵pos機鍵盤

1)實驗平臺:alientek 阿波羅 STM32F767 開發(fā)板2)摘自《STM32F7 開發(fā)指南(HAL 庫版)》關(guān)注官方微信號公眾號,獲取更多資料:正點原子

第六十五章 USB 鼠標(biāo)鍵盤(Host)實驗

上一章我們向大家介紹了如何利用 STM32F767 的 USB HOST 接口來驅(qū)動 U 盤,本章,我

們將利用 STM32F767 的 USB HOST 來驅(qū)動 USB 鼠標(biāo)/鍵盤。本章分為如下幾個部分:

65.1 USB 鼠標(biāo)鍵盤簡介

65.2 硬件設(shè)計

65.3 軟件設(shè)計

65.4 下載驗證

65.1 USB 鼠標(biāo)鍵盤簡介

傳統(tǒng)的鼠標(biāo)和鍵盤是采用 PS/2 接口和電腦通信的,但是現(xiàn)在 PS/2 接口在電腦上逐漸消失,

所以現(xiàn)在越來越多的鼠標(biāo)鍵盤采用的是 USB 接口,而不是 PS/2 接口的了。

USB 鼠標(biāo)鍵盤屬于 USB HID 設(shè)備。USB HID 即:Human Interface Device(人機交互設(shè)備)

的縮寫,鍵盤、鼠標(biāo)與游戲桿等都屬于此類設(shè)備。不過 HID 設(shè)備并不一定要有人機接口,只要

符合 HID 類別規(guī)范的設(shè)備都是 HID 設(shè)備。關(guān)于 USB HID 的知識,我們這里就不詳細介紹了,

請大家自行百度學(xué)習(xí)。

本章,我們同上一章一樣,我們直接移植官方的 USB HID 例程,官方例程路徑:光盤\uf0e08,

STM32 參考資料\uf0e0STM32 USB 學(xué)習(xí)資料\uf0e0STM32_USB-Host-Device_Lib_V2.2.0\uf0e0Project\uf0e0

USB_Host_Examples\uf0e0HID,該例程支持 USB 鼠標(biāo)和鍵盤等 USB HID 設(shè)備,本章我們將移植這

個例程到阿波羅 STM32 開發(fā)板上。

65.2 硬件設(shè)計

本節(jié)實驗功能簡介:開機的時候先顯示一些提示信息,然后初始化 USB HOST,并不斷輪

詢。當(dāng)檢測到 USB 鼠標(biāo)/鍵盤的插入后,顯示設(shè)備類型,并顯示設(shè)備輸入數(shù)據(jù),

如果是 USB 鼠標(biāo):將顯示鼠標(biāo)移動的坐標(biāo)(X,Y 坐標(biāo)),滾輪滾動數(shù)值(Z 坐標(biāo))以及

按鍵(左中右)。

如果是 USB 鍵盤:將顯示鍵盤輸入的數(shù)字/字母等內(nèi)容(不是所有按鍵都支持,部分按鍵

沒有做解碼支持,比如 F1~F12)。

最后,還是用 DS0 提示程序正在運行。

所要用到的硬件資源如下:

1) 指示燈 DS0

2) 串口

3) LCD 模塊

4) USB HOST 接口

這幾個部分,在之前的實例中都已經(jīng)介紹過了,我們在此就不多說了。這里再次提醒大家,

P10 的連接,要通過跳線帽連接 PA11 和 D-以及 PA12 和 D+。

65.3 軟件設(shè)計

本章,我們在第二十章實驗 (實驗 15 LTDC LCD(RGB 屏)實驗)的基礎(chǔ)上修改,先打

開實驗 15 的工程,在 HARDWARE 文件夾所在文件夾下新建一個 USB 的文件夾,對照官方

HID 例子,將相關(guān)文件拷貝到 USB 文件夾下。

然后,我們在工程里面添加 USB HID 相關(guān)代碼,最終得到如圖 65.3.1 所示的工程:

圖 62.3.1 USB 鼠標(biāo)鍵盤工程截圖

注意:為了支持 STM32F7,USB OTG 庫部分代碼要做修改,詳見 61.3 節(jié)的介紹(USB

HOST 實驗只需要修改 usb_core.c 這一個文件就可以支持 STM32F7 了)。

可以看到,USB 部分代碼,同上一章的在結(jié)構(gòu)上是一模一樣的,只是.c 文件稍微有些變化。

同樣,我們移植需要修改的代碼,就是 USB_APP 里面的這兩個.c 文件了。

其中 usb_bsp.c 的代碼,和之前的章節(jié)一模一樣,可以用上一章的代碼直接替換即可正常使

用。

usbh_usr.c 里面的代碼,則有所變化,重點代碼如下:

//下面兩個函數(shù),為 ALIENTEK 添加,以防止 USB 死機//USB 枚舉狀態(tài)死機檢測,防止 USB 枚舉失敗導(dǎo)致的死機//phost:USB_HOST 結(jié)構(gòu)體指針//返回值:0,沒有死機// 1,死機了,外部必須重新啟動 USB 連接.u8 USBH_Check_EnumeDead(USBH_HOST *phost){static u16 errcnt=0;//這個狀態(tài),如果持續(xù)存在,則說明 USB 死機了.if(phost->gState==HOST_CTRL_XFER&&(phost->EnumState==ENUM_IDLE||phost->EnumState==ENUM_GET_FULL_DEV_DESC)){errcnt++;if(errcnt>2000)//死機了{ errcnt=0;RCC->AHB2RSTR|=1<<7; //USB OTG FS 復(fù)位delay_ms(5);RCC->AHB2RSTR&=~(1<<7); //復(fù)位結(jié)束 return 1;} }else errcnt=0;return 0;} //USB HID 通信死機檢測,防止 USB 通信死機(暫時僅針對:DTERR,即 Data toggle error)//pcore:USB_OTG_Core_dev_HANDLE 結(jié)構(gòu)體指針//phidm:HID_Machine_TypeDef 結(jié)構(gòu)體指針//返回值:0,沒有死機// 1,死機了,外部必須重新啟動 USB 連接.u8 USBH_Check_HIDCommDead(USB_OTG_CORE_HANDLE *pcore,HID_Machine_TypeDef *phidm){if(pcore->host.HC_Status[phidm->hc_num_in]==HC_DATATGLERR)//DTERR 錯誤{ return 1;}return 0;}//USB 鍵盤鼠標(biāo)數(shù)據(jù)處理//鼠標(biāo)初始化void USR_MOUSE_Init(void){USBH_Msg_Show(2); //USB 鼠標(biāo)USB_FIRST_PLUGIN_FLAG=1;//標(biāo)記第一次插入}//鍵盤初始化void USR_KEYBRD_Init(void){ USBH_Msg_Show(1); //USB 鍵盤USB_FIRST_PLUGIN_FLAG=1;//標(biāo)記第一次插入}//臨時數(shù)組,用于存放鼠標(biāo)坐標(biāo)/鍵盤輸入內(nèi)容(4.3 屏,最大可以輸入 2016 字節(jié))__align(4) u8 tbuf[2017]; //USB 鼠標(biāo)數(shù)據(jù)處理//data:USB 鼠標(biāo)數(shù)據(jù)結(jié)構(gòu)體指針void USR_MOUSE_ProcessData(HID_MOUSE_Data_TypeDef *data){ static signed short x,y,z; if(USB_FIRST_PLUGIN_FLAG)//第一次插入,將數(shù)據(jù)清零{USB_FIRST_PLUGIN_FLAG=0;x=y=z=0;}x+=(signed char)data->x;if(x>9999)x=9999;if(x<-9999)x=-9999;y+=(signed char)data->y;if(y>9999)y=9999;if(y<-9999)y=-9999;z+=(signed char)data->z;if(z>9999)z=9999;if(z<-9999)z=-9999;POINT_COLOR=BLUE;sprintf((char*)tbuf,"BUTTON:");if(data->button&0X01)strcat((char*)tbuf,"LEFT");if((data->button&0X03)==0X02)strcat((char*)tbuf,"RIGHT");else if((data->button&0X03)==0X03)strcat((char*)tbuf,"+RIGHT");if((data->button&0X07)==0X04)strcat((char*)tbuf,"MID");else if((data->button&0X07)>0X04)strcat((char*)tbuf,"+MID"); LCD_Fill(30+56,180,lcddev.width="360px",height="auto" />

ST 官方的 USB HID 例程,僅僅是能用,很多地方還要改善,比如識別率低,容易死機(枚

舉/通信都可能死機)等問題,這里:USBH_Check_EnumeDead 和 USBH_Check_HIDCommDead

這兩個函數(shù),就是我們針對官方 HID 例程現(xiàn)有 bug 做出的改進處理,通過這兩個函數(shù),可以檢

測枚舉/通信是否正常,當(dāng)出現(xiàn)異常時,直接重啟 USB 內(nèi)核,重新連接設(shè)備,這樣可以防止死

機造成的程序無響應(yīng)情況。

另外,為了提高對鼠標(biāo)鍵盤的識別率和兼容性,對 usbh_hid_core.c 里面的兩處代碼進行了

修改:

1,USBH_HID_ClassRequest 函數(shù),修改代碼(394 行)為:

classReqStatus = USBH_Set_Idle (pdev, pphost, 100, 0);//這里 duration 官方設(shè)置的是 0,修改為

//100,提高兼容性

2,USBH_Set_Idle 函數(shù),修改代碼(542 行)為:

phost->Control.setup.b.wLength.w = 100; //官方的這里設(shè)置的是 0,導(dǎo)致部分鼠標(biāo)無法識別,

//這里修改為 100 以后,識別率明顯提高.

以上兩處地方,官方默認值都是設(shè)置的 0,我們修改為 100 后,可以明顯提高 USB 鼠標(biāo)/

鍵盤的識別率,兼容性好很多。

還有,在 usbh_hid_keybd.h 里面,要修改鍵盤類型的定義,改為:

#define QWERTY_KEYBOARD

//通用鍵盤

//#define AZERTY_KEYBOARD

//法國版鍵盤

ST 官方例程,是使用的法國版鍵盤,一般我們國內(nèi)用的是通用鍵盤,所以,需要換一個宏

定義(換成:QWERTY_KEYBOARD)。

最后,在 usbh_hid_mouse.c 里面,MOUSE_Decode 函數(shù)用于鼠標(biāo)數(shù)據(jù)解析,但是 ST 官方

例程僅對 4 字節(jié)鼠標(biāo)數(shù)據(jù)做了解析,而忽略了 5 字節(jié)/6 字節(jié)鼠標(biāo)數(shù)據(jù)的處理,所以,需要修改

該函數(shù)為:

extern HID_Machine_TypeDef HID_Machine;

static void MOUSE_Decode(uint8_t *data)

{

if(HID_Machine.length==5||HID_Machine.length==6||HID_Machine.length==8)

//5/6/8 字節(jié)長度的 USB 鼠標(biāo)數(shù)據(jù)處理

{

HID_MOUSE_Data.button = data[0];

HID_MOUSE_Data.x = data[1];

HID_MOUSE_Data.y = data[3]<<4|data[2]>>4;

HID_MOUSE_Data.z = data[4];

}else if(HID_Machine.length==4) //4 字節(jié)長度的 USB 鼠標(biāo)數(shù)據(jù)處理

{

HID_MOUSE_Data.button = data[0];

HID_MOUSE_Data.x = data[1];

HID_MOUSE_Data.y = data[2];

HID_MOUSE_Data.z = data[3];

}

USR_MOUSE_ProcessData(&HID_MOUSE_Data);

}

再回到 usbh_usr.c,USR_MOUSE_Init 和 USR_MOUSE_ProcessData 用于處理鼠標(biāo)數(shù)據(jù),這

兩個函數(shù)在 usbh_hid_mouse.c 里面被調(diào)用,USR_MOUSE_Init 在鼠標(biāo)初始化的時候被調(diào)用,而

USR_MOUSE_ProcessData 函數(shù),則在鼠標(biāo)初始化成功,輪詢數(shù)據(jù)的時候調(diào)用,處理鼠標(biāo)數(shù)據(jù),

該函數(shù)將得到的鼠標(biāo)數(shù)據(jù)顯示在 LCD 上面。

同樣,USR_KEYBRD_Init 和 USR_KEYBRD_ProcessData 用于處理鍵盤數(shù)據(jù),這兩個函數(shù)

在 usbh_hid_keybd.c 里面被調(diào)用,USR_KEYBRD_Init 在鍵盤初始化的時候被調(diào)用,而

USR_KEYBRD_ProcessData 函數(shù),則在鍵盤初始化成功,輪詢數(shù)據(jù)的時候調(diào)用,處理鍵盤數(shù)據(jù),

該函數(shù)將鍵盤輸入的字符顯示在 LCD 上面。

其他代碼,我們就不再介紹了,請大家參考開發(fā)板光盤本例程源碼。

最后,來看看 main.c 里面的代碼,如下:

USBH_HOST USB_Host;USB_OTG_CORE_HANDLE USB_OTG_Core_dev;extern HID_Machine_TypeDef HID_Machine;//USB 信息顯示//msgx:0,USB 無連接// 1,USB 鍵盤// 2,USB 鼠標(biāo)// 3,不支持的 USB 設(shè)備void USBH_Msg_Show(u8 msgx){POINT_COLOR=RED;switch(msgx){case 0: //USB 無連接LCD_ShowString(30,130,200,16,16,"USB Connecting...");LCD_Fill(0,150,lcddev.width="360px",height="auto" />

int main(void)

{

u8 t;

Cache_Enable(); //打開 L1-Cache

HAL_Init();

//初始化 HAL 庫

Stm32_Clock_Init(432,25,2,9); //設(shè)置時鐘,216Mhz

delay_init(216); //延時初始化

uart_init(115200);

//串口初始化

LED_Init(); //初始化 LED

KEY_Init(); //初始化按鍵

SDRAM_Init();

//初始化 SDRAM

LCD_Init(); //初始化 LCD

W25QXX_Init();

//初始化 W25Q256

PCF8574_Init();

//初始化 PCF8574

POINT_COLOR=RED;

LCD_ShowString(30,50,200,16,16,"Apollo STM32F4/F7");

LCD_ShowString(30,70,200,16,16,"USB MOUSE/KEYBOARD TEST");

LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");

LCD_ShowString(30,110,200,16,16,"2016/8/11");

LCD_ShowString(30,130,200,16,16,"USB Connecting...");

//初始化 USB 主機

USBH_Init(&USB_OTG_Core_dev,USB_OTG_FS_CORE_ID,

&USB_Host,&HID_cb,&USR_Callbacks);

while(1)

{

USBH_Process(&USB_OTG_Core_dev, &USB_Host);

if(bDeviceState==1)//連接建立了

{

if(USBH_Check_HIDCommDead(&USB_OTG_Core_dev,&HID_Machine))

//檢測 USB HID 通信,是否還正常?

{

USBH_HID_Reconnect();//重連

}

}else

//連接未建立的時候,檢測

{

if(USBH_Check_EnumeDead(&USB_Host))

//檢測 USB HOST 枚舉是否死機了?死機了,則重新初始化

{

USBH_HID_Reconnect();//重連

}

}

t++;

if(t==200000)

{

LED0_Toggle;

t=0;

}

}

}

這里總共三個函數(shù):USBH_Msg_Show 用于顯示一些提示信息,在 usbh_usr.c 里面被相關(guān)函數(shù)

調(diào)用。USBH_HID_Reconnect 則用于 USB HID 重新連接,當(dāng)發(fā)現(xiàn)枚舉/通信死機的時候,調(diào)用

該函數(shù)實現(xiàn) USB 復(fù)位重啟,以重新連接;最后,main 函數(shù)就比較簡單了,處理方式和上一章

幾乎一樣,只是多了一些通信死機處理。

軟件設(shè)計部分就為大家介紹到這里。

65.4 下載驗證

在代碼編譯成功之后,我們下載到阿波羅 STM32 開發(fā)板上,然后在 USB_HOST 端子插入

USB 鼠標(biāo)/鍵盤,注意:此時 USB SLAVE 口不要插 USB 線到電腦,否則會干擾??!

等 USB 鼠標(biāo)/鍵盤成功識別后,便可以看到 LCD 顯示 USB Connected,并顯示設(shè)備類型:

USB Mouse 或者 USB KeyBoard,同時也會顯示輸入的數(shù)據(jù),如圖 65.4.1 和圖 65.4.2 所示:

圖 65.4.1 USB 鼠標(biāo)測試

圖 65.4.2 USB 鍵盤測試

其中,圖 65.4.1 是 USB 鼠標(biāo)測試界面,圖 65.4.2 是 USB 鍵盤測試界面。

最后,特別提醒大家,由于例程的 HID 內(nèi)核,只處理了第一個接口描述符,所以對于 USB

符合設(shè)備,只能識別第一個描述符所代表的設(shè)備。體現(xiàn)到實際使用中,就是:USB 無線鼠標(biāo),

一般是無法使用(被識別為鍵盤),而 USB 無線鍵盤,可以使用,因為鍵盤在第一個描述符,

鼠標(biāo)在第二個描述符。

如果想支持 USB 無線鼠標(biāo),可以通過修改 usbh_hid_core.c 里面的 USBH_HID_InterfaceInit

函數(shù)來支持

以上就是關(guān)于按鍵pos機鍵盤,阿波羅 STM32F767 開發(fā)板資料連載第六十五章 USB 鼠標(biāo)鍵盤實驗的知識,后面我們會繼續(xù)為大家整理關(guān)于按鍵pos機鍵盤的知識,希望能夠幫助到大家!

轉(zhuǎn)發(fā)請帶上網(wǎng)址:http://www.shineka.com/newsone/79335.html

你可能會喜歡:

版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請發(fā)送郵件至 babsan@163.com 舉報,一經(jīng)查實,本站將立刻刪除。