按键有两种实现方式查询和中断,其初始位置在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()添加具体按键事件
|