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