按鍵有兩種實現(xiàn)方式查詢和中斷,其初始位置在OnBoard.c中InitBoard()中 OnboardKeyIntEnable = HAL_KEY_INTERRUPT_ENABLE; //中斷方式
//OnboardKeyIntEnable = HAL_KEY_INTERRUPT_DISABLE; 查詢方式
HalKeyConfig( OnboardKeyIntEnable, OnBoard_KeyCallback); OnBoard_KeyCallback--按鍵回調(diào)函數(shù) 1,查詢法函數(shù)調(diào)用流程如下:
HalKeyConfig()配置一定時器為輪詢按鍵作準(zhǔn)備——>
時間一到觸發(fā)系統(tǒng)任務(wù)事件調(diào)用hal_driver.c中Hal_ProcessEvent()—— >
調(diào)用HalKeyPoll()得到按鍵值——>
調(diào)用OnBoard.c中OnBoard_KeyCallback()進(jìn)一步處理——>
調(diào)用OnBoard_SendKeys()構(gòu)造消息包,準(zhǔn)備觸發(fā)應(yīng)用按鍵事件【注意這個應(yīng)用之前必須通過RegisterForKeys()注冊接收按鍵事件的任務(wù)ID】——>
調(diào)用osal_msg_send()向系統(tǒng)發(fā)送消息——>
調(diào)用osal_set_event()設(shè)置事件發(fā)生標(biāo)志——>
調(diào)用SampleApp_ProcessEvent()處理事件——>
最終調(diào)用SampleApp_HandleKeys()處理具體按鍵事件
2,中斷法函數(shù)調(diào)用流程如下:
HalKeyConfig()進(jìn)行按鍵中斷配置——>
按鍵引起中斷進(jìn)入中斷函數(shù)HAL_ISR_FUNCTION()(該函數(shù)在hal_key.c中)——>
調(diào)用halProcessKeyInterrupt()對按鍵中斷進(jìn)行下一步處理:清除中斷標(biāo)志,啟動一定時器——>
相應(yīng)事件為HAL_KEY_EVENT,時間為HAL_KEY_DEBOUNCE_VALUE。(且#define HAL_KEY_DEBOUNCE_VALUE 25,即25ms,這與開頭的英文說明一致,在中斷發(fā)生后,需等待25ms再讀鍵值,以消除按鍵的回跳。) 25ms到了以后,觸發(fā)HAL層任務(wù)HAL_KEY_EVENT事件,調(diào)用HAL層任務(wù)事件處理函數(shù)Hal_ProcessEvent() 時間一到觸發(fā)系統(tǒng)任務(wù)事件調(diào)用HAL\Common\hal_driver.c中Hal_ProcessEvent()——>
調(diào)用HalKeyPoll()得到按鍵值——>
調(diào)用OnBoard.c中OnBoard_KeyCallback()進(jìn)一步處理——>
調(diào)用OnBoard_SendKeys()構(gòu)造消息包,準(zhǔn)備觸發(fā)應(yīng)用按鍵事件【注意這個應(yīng)用之前必須通過RegisterForKeys()注冊接收按鍵事件的任務(wù)ID】——>
調(diào)用osal_msg_send()向系統(tǒng)發(fā)送消息——>
調(diào)用osal_set_event()設(shè)置事件發(fā)生標(biāo)志——>
調(diào)用SampleApp_ProcessEvent()處理事件——>
最終調(diào)用SampleApp_HandleKeys()處理具體按鍵事件
注: 1,根據(jù)實際需要在在hal_key.c中HalKeyConfig()中,修改代碼,其中原有程序查詢方式下只對上,下,左,右四個按鍵進(jìn)行配置處理;中斷方式只是sw6,sw7進(jìn)行配置處理。 2,在應(yīng)用層SampleApp_HandleKeys()添加具體按鍵事件
|