请看附件,纯属个人理解,有不足之处请指出
1、 先找到 InitBoard()的定义 2、 修改 OnboardKeyIntEnable 的值: OnboardKeyIntEnable = HAL_KEY_INTERRUPT_DISABLE;//失能按键中断; OnboardKeyIntEnable = HAL_KEY_INTERRUPT_ENABLE; //使能按键中断,此处使能按键 中断。 3、 按键配置函数 HalKeyConfig( OnboardKeyIntEnable, OnBoard_KeyCallback); 这个函数中失能、使能中断执行不同的代码。下面分别讲解 a)、中断失能 清除中断使能寄存器。
在 HAL_KEY_POLLING_VALUE 时间后产生一个 HAL_KEY_EVENT 事件。找到这个事件的 处理函数,如下图所示:
图 1 禁用中断的处理函数 在 HalKeyPoll();中进行按键的扫描,如果有按键按下,记录键值,并执行按键处理函数 OnBoard_KeyCallback();100ms 后再次产生HAL_KEY_EVENT 事件,相当于 100ms 轮询一 次。 b)、中断使能 注意中断使能时,如果用户是普通案件代替五向按键,不能用五向按键的宏定义,需要 自己重定义,否则会出现错误。 重定义如下:
如果中断使能,则进入按键中断的配置: a)、配置 SW1 边沿触发、设置中断初始条件 b)、配置 SW2 边沿触发、设置中断初始条件 c)、停止按键轮询。 4、找到按键的中断处理函数,并进行更改 按键 P0 口的中断处理函数为 HAL_ISR_FUNCTION( halKeyPort0Isr, P0INT_VECTOR ) 当有中断产生是,执行 halProcessKeyInterrupt 函数。 代码如下:
a)、对按键 SW6 检测到按键边沿后,产生 HAL_KEY_EVENT 事件,HalKeyPoll ()函数中记录 keys= HAL_KEY_SW_6 的值,并将其发送给 MyApp_TaskID 任务。MyApp_TaskID 中检测到按键 改变,产生 KEY_CHANGE 事件,调用按键处理函数 MyApp_HandleKeys()。 b)、对按键 SW7(有按键长按短按的功能) 按键按下检测到上升边沿,记录时间 t1; 将触发边沿改变成下降沿触发,按键松开时记
录系统时间 T2。全局变量 MyApp_Key_differnt_Time=t2-t1; 之后又进入到 HalKeyPoll (void)处理函数中;
Keybuf1 和 keybuf2 用来检测按键是否产生了一个按下&抬起的动作,如果不这么做, 按键平时为高电平,抬起按键后也为高电平,用 Keybuf1 和keybuf2 作为按键按下抬起 完成的标志位。然后的过程和 SW6 类似。 4、 MyApp_TaskID 任务中对按键的实际处理代码 MyApp_HandleKeys(); 按键 SW6 不做讲解,对 SW7 的代码如下: 长按超过 3000ms,执行清除 NV 的动作 小于 3000ms,执行功率改变的动作。
pdf格式文档51黑下载地址:
|