Zstack之HAL层增加新的按键key的分析笔记2

 新增按键的初始化部分已经修改完了,接下来对新增按键的检测以及事件处理部分进行修改。这儿首先要明确一点,对于按键的检测,Zstack提供了两种方式,第一种是基于芯片的硬件中断检测和处理,第二种是采用轮询方式,定时查询按键对应端口进行按键检测和处理。这两种方式在Zstack中既有不同之处,也有共同之处。不同在于硬件检测的开始部分,而后面的按键具体检测和按键事件的发送处理又是一样的。下面首先基于中断检测的流程,对相关代码进行修改。

第一步,对HAL_ISR_FUNCTION()这个函数里的代码进行修改。该函数是硬件在检测到P0口中断时,自动从P0口中断入口地址跳转过来的。在这里面我们对其判断条件进行增加,具体如图1所示:


图1

接下来的第二步,对在该中断中被调用的函数halProcessKeyInterrupt()这个函数内部的代码进行修改。该函数的作用是通过查询端口对应的中断标志位寄存器P0IFG来确定是否确实有按键中断,如果有,则开启定时器设置一定时间后发送HAL_KEY_EVENT事件给Hal_ProcessEvent()进行处理。采用该定时器的目的在于消抖,而Hal_ProcessEvent这个应该很熟悉了,hal层的循环处理任务。这里面需要修改的地方如下图2所示:


图2

接下来,很明显我们需要去看看并修改Hal_ProcessEvent这个函数内部的代码了。在Hal_driver.c中可以找到该函数。其内部关于按键事件的处理代码结构如下图3所示:


图3

很显然,对按键的键值处理是在HalKeyPoll()中完成的。继续跳回Hal_key.c中进行修改吧。对该函数内的代码具体修改如下图4所示:


图4

注意这里有一个宏定义HAL_PUSH_BUTTON7()是之前没有在Hal_key.h中被宏定义的,该宏定义和其他按键类似的宏定义在Hal_board_cfg.h中。具体如下图5所示:


图5

这里面又包含两个宏定义,他们同样也都是在Hal_board_cfg.h中被定义的,且是在同一处地方。具体如下图6所示:


图6

这里需要特别注意的是PUSH7_POLARITY被宏定义为ACTIVE_LOW。该宏定义用于检测哪些按键被按下,因为网蜂的板子是端口平时为上拉,按键按下的时候,对应的端口位为低电平,所以我们将之宏定义为ACTIVE_LOW。而TI官方的板子则正好相反,所以PUSH1_POLARITY我们也将之重新宏定义为ACTIVE_LOW。

根据逻辑,如果检测到确实有按键按下,接下来是不是应该发送该消息到OSAL层呢?这是通过一个回调函数OnBoard_KeyCallback()实现的,该函数在InitBoard中调用HalKeyConfig()时就被注册用于应对此时的情景了的。该函数位于OnBoard.c中。具体的该函数代码修改如图7所示:


图7

一般来说,使用OnBoard_SendKeys()函数就能够成功地把相应的按键事件发送给Hal_ProcessEvent进行处理了,如果发送失败的话,可以用下面的If语句进行处理。

至此,按键事件的检测和发送部分的代码就修改完毕了。接下来就剩下最后一个地方,按键事件消息包的解析。按键事件KEY_CHANGE是属于SYS_EVENT_MSG事件中的一个子事件,这个就是在用户任务中进行处理了。关于KEY_CHANG,我是采用Video_HandleKeys()函数来处理的,如图8所示:


图8

在Video_HandleKeys()里,关于具体的按键检测以及关于按键的处理如图9所示:


图9

可以看出,在用户代码里,如果检测到时SW6,即普通按键1,则会调用HAL 层的串口函数打印“PUSH BUTTON1”,如果是SW7,即普通按键2,则会通过串口打印“PUSH BUTTON2”

而实验结果如下图10所示:


图10

最最后,很重要的一点,那就是如何设置按键的检测方式呢,是选择中断检测还是轮询方式呢?此也是通过对一个变量进行设置实现的。该变量为OnboardKeyIntEnable,在InitBoard()中被赋值,具体设置方式如下图11所示:

图11

以上就是根据硬件中断方式检测按键值的流程所进行的新增按键所需对Zstack进行的代码修改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值