Zstack的按键机制_第1页
Zstack的按键机制_第2页
Zstack的按键机制_第3页
Zstack的按键机制_第4页
Zstack的按键机制_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Zstack 的按键机制的按键机制 这一节我们看按键机制 后续会陆续看这一节我们看按键机制 后续会陆续看 UART 机制和绑定机制 通过这三大机制深入机制和绑定机制 通过这三大机制深入 学习学习 Zstack 消息的传递机制 掌握消息的传递机制 掌握 Zstack 开发流程 开发流程 1 了解了解 TI 的的 EB 板按键板按键 TI 的的 EB 板按键资源有一个独立按键和一个摇杆 独立按键连接到板按键资源有一个独立按键和一个摇杆 独立按键连接到 P0 1 摇杆四个方 摇杆四个方 向串联电阻连接到向串联电阻连接到 P0 6 摇杆的确认按钮 中心按键 连接到 摇杆的确认按钮 中心按键 连接到 P0 5 类似与独立按键 类似与独立按键 TI 的的 EB 板按键部分原理图 板按键部分原理图 A 独立按键原理图 独立按键原理图 图图 1 EB 板独立按键原理图板独立按键原理图 由原理图可以看出按键为低电平有效 由原理图可以看出按键为低电平有效 B 摇杆按键原理图摇杆按键原理图 图图 1 EB 板摇杆按键原理图 这个图想横着占一页 板摇杆按键原理图 这个图想横着占一页 由原理图可以看出摇杆的确认按钮 中心按键 是高电平有效 由原理图可以看出摇杆的确认按钮 中心按键 是高电平有效 2 轮询与中断轮询与中断 Zstack 中提供了两种方式采集按键数据 轮询方式和中断方式 中提供了两种方式采集按键数据 轮询方式和中断方式 轮询方式 轮询方式 中断方式 中断方式 3 按键的初始化按键的初始化 A 相关宏定义 相关宏定义 在在 key c 文件中定义了关于按键的宏 文件中定义了关于按键的宏 注意按键初始化配置属于底层驱动的配置 在注意按键初始化配置属于底层驱动的配置 在 涉及到底层时会遇到大量的涉及到底层时会遇到大量的 CC2430 寄存器 要养成查看寄存器 要养成查看 datasheet 的好习惯 的好习惯 按键 按键 6 SW6 对应原理图的独立按键 对应原理图的独立按键 S1 按键 按键 6 SW6 相关的宏定义 相关的宏定义 define HAL KEY BIT0 0 x01 define HAL KEY BIT1 0 x02 define HAL KEY BIT2 0 x04 define HAL KEY BIT3 0 x08 define HAL KEY BIT4 0 x10 define HAL KEY BIT5 0 x20 define HAL KEY BIT6 0 x40 define HAL KEY BIT7 0 x80 if defined HAL BOARD CC2430EB defined HAL BOARD CC2430BB define HAL KEY SW 6 ENABLE define HAL KEY SW 6 PORT P0 define HAL KEY SW 6 BIT HAL KEY BIT1 define HAL KEY SW 6 SEL P0SEL define HAL KEY SW 6 DIR P0DIR define HAL KEY SW 6 IEN IEN1 define HAL KEY SW 6 IENBIT HAL KEY BIT5 define HAL KEY SW 6 EDGE HAL KEY RISING EDGE define HAL KEY SW 6 EDGEBIT HAL KEY BIT0 define HAL KEY SW 6 ICTL PICTL define HAL KEY SW 6 ICTLBIT HAL KEY BIT3 define HAL KEY SW 6 PXIFG P0IFG define HAL KEY P0INT LOW USED HAL KEY SW 6 BIT endif 按键 按键 5 SW5 对应原理图的摇杆的确认按钮 中心按键 对应原理图的摇杆的确认按钮 中心按键 摇杆相关宏定义 摇杆相关宏定义 if defined HAL BOARD CC2430EB define HAL KEY JOYSTICK ENABLE define HAL KEY JOY CHN HAL ADC CHANNEL 6 define HAL KEY SW 5 ENABLE define HAL KEY SW 5 PORT P0 define HAL KEY SW 5 BIT HAL KEY BIT5 define HAL KEY SW 5 SEL P0SEL define HAL KEY SW 5 DIR P0DIR define HAL KEY SW 5 INP P0INP define HAL KEY SW 5 IEN IEN1 define HAL KEY SW 5 IENBIT HAL KEY BIT5 define HAL KEY SW 5 EDGE HAL KEY RISING EDGE define HAL KEY SW 5 EDGEBIT HAL KEY BIT2 define HAL KEY SW 5 ICTL PICTL define HAL KEY SW 5 ICTLBIT HAL KEY BIT4 define HAL KEY SW 5 PXIFG P0IFG define HAL KEY POINT HIGH USED HAL KEY SW 5 BIT endif B 代码分析 代码分析 按键的初始化属于硬件的初始化 在按键的初始化属于硬件的初始化 在 Zstack 中硬件驱动在中硬件驱动在 HalDriverInit 集中处理 集中处理 在主函数在主函数 Main 中调用了函数中调用了函数 HalDriverInit 进行硬件驱动的初始化 该函数根据编译选进行硬件驱动的初始化 该函数根据编译选 项对硬件逐个进行了初始化 项对硬件逐个进行了初始化 HalDriverInit 代码如下 代码如下 程序代码 程序代码 void HalDriverInit void 定时器定时器 HalTimerInit ADC if defined HAL ADC endif LED 灯灯 if defined HAL LED endif 串口串口 if defined HAL UART endif 按键按键 if defined HAL KEY endif 由上述代码可以看出除定时器以外其它初始化都是根据条件进行初始化的 这里满足由上述代码可以看出除定时器以外其它初始化都是根据条件进行初始化的 这里满足 按键初始化条件 注 硬件驱动初始化没有完全列举 可以参见具体协议栈 按键初始化条件 注 硬件驱动初始化没有完全列举 可以参见具体协议栈 程序代码 程序代码 Set to TRUE enable KEY usage FALSE disable it Notes On 2430EB DB analog joystick is used to simulate keys Keys won t work unless HAL ADC is also set to TRUE ifndef HAL KEY define HAL KEY TRUE endif 上述代码摘自上述代码摘自 hal board cfg h 文件 从上述代码可以看出 文件 从上述代码可以看出 TI 的的 Zstack 协议栈默认协议栈默认 是使用独立按键的 是使用独立按键的 使用摇杆的时候还要确保使用摇杆的时候还要确保 HAL ADC 为真 即为真 即 Zstack 协议栈使用协议栈使用 AD 采集 关于采集 关于 HAL ADC 代码如下 代码如下 程序代码 程序代码 Set to TRUE enable ADC usage FALSE disable it ifndef HAL ADC define HAL ADC TRUE endif 上述代码同样摘自上述代码同样摘自 hal board cfg h 文件 可以看出文件 可以看出 Zstack 协议栈默认使用协议栈默认使用 AD 转换转换 器 由上述器 由上述 define HAL KEY TRUE 和和 define HAL ADC TRUE 可以知道在可以知道在 TI 的的 Zstack 协议栈默认情况既可以使用普通的独立按键也可以使用模拟的摇杆 协议栈默认情况既可以使用普通的独立按键也可以使用模拟的摇杆 void HalKeyInit void if HAL KEY TRUE halKeySavedKeys 0 if defined HAL KEY SW 6 ENABLE HAL KEY SW 6 SEL 设定为通用设定为通用 I O 口口 HAL KEY SW 6 DIR 设置为输入模式设置为输入模式 endif if defined HAL KEY SW 5 ENABLE HAL KEY SW 5 SEL 设定为通用设定为通用 I O 口口 HAL KEY SW 5 DIR 设置为输入模式设置为输入模式 HAL KEY SW 5 INP HAL KEY SW 5 BIT 设置为三态模式设置为三态模式 endif pHalKeyProcessFunction NULL HalKeyConfigured FALSE endif HAL KEY 按键驱动初始化函数按键驱动初始化函数 HalKeyInit 说明 说明 配置了三个全局变量 全局变量 配置了三个全局变量 全局变量 halKeySavedKeys 是用来保存按键值的 初始化是用来保存按键值的 初始化 时将其初始化为时将其初始化为 0 pHalKeyProcessFunction 为指向按键处理函数的指针 当有按键按下为指向按键处理函数的指针 当有按键按下 时调用按键处理函数对按键进行处理 初始化时将其初始化为时调用按键处理函数对按键进行处理 初始化时将其初始化为 NULL 在按键的配置函数 在按键的配置函数 中对其进行配置 全局变量中对其进行配置 全局变量 HalKeyConfigured 用来标示按键是否被配置 初始化时没有用来标示按键是否被配置 初始化时没有 配置按键 所以此时该变量被初始化为配置按键 所以此时该变量被初始化为 FALSE 配置了两个按键的 配置了两个按键的 I O 口 函数中用条件语句判定是否使能了口 函数中用条件语句判定是否使能了 SW5 和和 SW6 由 由 前面的宏定义可以看出 如果使用的是前面的宏定义可以看出 如果使用的是 TI 的的 EB 板 则板 则 SW5 和和 SW6 都将被使能 有上述都将被使能 有上述 代码可以看出按键驱动初始化函数代码可以看出按键驱动初始化函数 HalKeyInit 将与将与 SW5 和和 SW6 相连接的相连接的 I O 设定通用设定通用 I O 口 并都设置为输入模式 而且将口 并都设置为输入模式 而且将 SW5 的输入模式设定为三态 的输入模式设定为三态 4 按键的配置 按键的配置 按键的初始化只是简单的对按键进行了初始化与按键的初始化只是简单的对按键进行了初始化与 I O 的配置 如果要使用的配置 如果要使用 Zstack 的按的按 键仍需要进一步对按键进行配置 下面我们着重理清按键的配置 键仍需要进一步对按键进行配置 下面我们着重理清按键的配置 Zstack 对按键处理提供对按键处理提供 了两种方法 轮询法和中断法 在配置按键时也是分为两种情况与之对应 我们这里对两了两种方法 轮询法和中断法 在配置按键时也是分为两种情况与之对应 我们这里对两 种配置模式逐一说明 种配置模式逐一说明 Zstack 默认使用轮询的方式处理 我们先以轮询入手 默认使用轮询的方式处理 我们先以轮询入手 A 配置轮询方式的按键 配置轮询方式的按键 TI 的的 Zstack 为什么会默认使用轮询方式为什么会默认使用轮询方式对按键进行处理 其实最重要的一点是因为对按键进行处理 其实最重要的一点是因为 TI 的的 EB 和和 ED 板都有摇杆 因为摇杆的四个方向是以电压的大小区分的 是不能产生中板都有摇杆 因为摇杆的四个方向是以电压的大小区分的 是不能产生中 断的 如果使用了中断方式对按键进行处理那么摇杆的四个方向键就是摆设了 所以断的 如果使用了中断方式对按键进行处理那么摇杆的四个方向键就是摆设了 所以 TI 的的 Zstack 采取轮询的方式处理按键 采取轮询的方式处理按键 为什么要使用摇杆 为什么要使用摇杆 其实原因也很简单 为了节省其实原因也很简单 为了节省 I O 口资源 口资源 CC2430 只有只有 21 个通用个通用 I O 口 如果使用一个摇杆就可以就可以节省使用三口 如果使用一个摇杆就可以就可以节省使用三 个独立个独立 I O 口 口 代码分析 代码分析 按键的配置函数在板载初始化函数按键的配置函数在板载初始化函数 InitBoard 中被调用中被调用 函数函数 InitBoard 负责板载的初负责板载的初 始化与配置 始化与配置 HalKeyConfig 决定了将按键的处理方式为轮询方式或者是中断方式 决定了将按键的处理方式为轮询方式或者是中断方式 程序代码 程序代码 define HAL KEY INTERRUPT DISABLE 0 x00 define HAL KEY INTERRUPT ENABLE 0 x01 void InitBoard byte level OnboardKeyIntEnable HAL KEY INTERRUPT DISABLE 使用轮询方式使用轮询方式 HalKeyConfig OnboardKeyIntEnable OnBoard KeyCallback 板载初始化函数板载初始化函数 InitBoard 说明 说明 由代码由代码 HAL KEY INTERRUPT DISABLE 得知处理方式被设置为轮询方式 如果得知处理方式被设置为轮询方式 如果 我们要设置为中断方式 只需要给变量我们要设置为中断方式 只需要给变量 OnboardKeyIntEnable 赋值赋值 HAL KEY INTERRUPT ENABLE 即可 另一个参数即可 另一个参数 OnBoard KeyCallback 是按键处是按键处 理的回调函数的函数名 如果有按键按下时将会调用这个回调函数进行处理 该按键回调理的回调函数的函数名 如果有按键按下时将会调用这个回调函数进行处理 该按键回调 函数会在按键处理详细说明 函数会在按键处理详细说明 程序代码 程序代码 void HalKeyConfig bool interruptEnable halKeyCBack t cback if HAL KEY TRUE Hal KeyIntEnable interruptEnable 保存参数决定处理方式是轮询或是中断保存参数决定处理方式是轮询或是中断 pHalKeyProcessFunction cback 保存参数按键处理的回调函数保存参数按键处理的回调函数 if Hal KeyIntEnable 如果为真则配置为中断方式如果为真则配置为中断方式 else 否则配置为轮询方式否则配置为轮询方式 if defined HAL KEY SW 6 ENABLE HAL KEY SW 6 ICTL 清除中断清除中断 HAL KEY SW 6 IEN endif if defined HAL KEY SW 5 ENABLE HAL KEY SW 5 ICTL HAL KEY SW 5 IEN endif osal start timerEx Hal TaskID HAL KEY EVENT L KEY POLLING VALUE 定时触发事件定时触发事件 HAL KEY EVENT 溢出时间为 溢出时间为 HAL KEY POLLING VALUE HalKeyConfigured TRUE endif HAL KEY 按键配置函数按键配置函数 HalKeyConfig 说明 说明 配置三个全局变量 配置三个全局变量 Hal KeyIntEnable 保存了按键处理方式 全局变量保存了按键处理方式 全局变量 pHalKeyProcessFunction 保存了按键处理的回调函数 在按键处理工程中将被调用 第三保存了按键处理的回调函数 在按键处理工程中将被调用 第三 个变量仍是个变量仍是 HalKeyConfigured 用来标示按键是否配置 当按键配置完成将其设定为用来标示按键是否配置 当按键配置完成将其设定为 TRUE 配置两个按键 由于上述代码使用的是轮询方式对按键事件进行配置 就不允许 配置两个按键 由于上述代码使用的是轮询方式对按键事件进行配置 就不允许 按键产生中断 在配置按键按键产生中断 在配置按键 SW5 和和 SW6 时将时将其对应的中断使能禁止其对应的中断使能禁止 具体配置代码需参 具体配置代码需参 见按键相关宏定义和见按键相关宏定义和 CC2340 的的 datasheet 进行理解 进行理解 事件 事件 HAL KEY EVENT 在将按键配置为轮询方式后 在将按键配置为轮询方式后 Zstack 会定时触发事件会定时触发事件 HAL KEY EVENT 检测是否有按键按下 定时器的溢出时长为检测是否有按键按下 定时器的溢出时长为 HAL KEY POLLING VALUE 事件的处理我们后续讲解 这里完成了轮询方式的配置 接下来我们看如何将按键配事件的处理我们后续讲解 这里完成了轮询方式的配置 接下来我们看如何将按键配 置为中断方式 置为中断方式 B 配置中断方式的按键 配置中断方式的按键 为了让大家能更加深入了解为了让大家能更加深入了解 Zstack 中机制和数据流的传递 虽然中机制和数据流的传递 虽然 TI 的的 Zstack 默认是默认是 以轮询方式处理按键 但其中断方式的代码都给我们准备好了 只需我们稍微改动一点即以轮询方式处理按键 但其中断方式的代码都给我们准备好了 只需我们稍微改动一点即 可 下面一起看如何将按键配置为中断方式 可 下面一起看如何将按键配置为中断方式 程序代码 程序代码 代码分析 代码分析 按键的配置函数在板载初始化函数按键的配置函数在板载初始化函数 InitBoard 中被调用中被调用 函数函数 InitBoard 负责板载的初负责板载的初 始化与配置 在函数始化与配置 在函数 InitBoard 调用按键配置函数调用按键配置函数 HalKeyConfig 根据参数值对按键进行根据参数值对按键进行 配置 决定了将按键的处理方式为轮询方式或者是中断方式 配置 决定了将按键的处理方式为轮询方式或者是中断方式 程序代码 程序代码 define HAL KEY INTERRUPT DISABLE 0 x00 define HAL KEY INTERRUPT ENABLE 0 x01 void InitBoard byte level OnboardKeyIntEnable HAL KEY INTERRUPT ENABLE 使用中断方式使用中断方式 HalKeyConfig OnboardKeyIntEnable OnBoard KeyCallback 程序代码 程序代码 void HalKeyConfig bool interruptEnable halKeyCBack t cback if HAL KEY TRUE Hal KeyIntEnable interruptEnable 保存参数决定处理方式是轮询或是中断保存参数决定处理方式是轮询或是中断 pHalKeyProcessFunction cback 保存参数按键处理的回调函数保存参数按键处理的回调函数 if Hal KeyIntEnable if defined HAL KEY SW 5 ENABLE PICTL 设定上升沿或者下降沿触发设定上升沿或者下降沿触发 if HAL KEY SW 5 EDGE HAL KEY FALLING EDGE PICTL HAL KEY SW 5 EDGEBIT endif HAL KEY SW 5 ICTL HAL KEY SW 5 ICTLBIT 设定中断使能设定中断使能 HAL KEY SW 5 IEN HAL KEY SW 5 IENBIT HAL KEY SW 5 PXIFG HAL KEY SW 5 BIT 清除中断标志清除中断标志 endif if defined HAL KEY SW 6 ENABLE PICTL 设定上升沿或者下降沿触发设定上升沿或者下降沿触发 if HAL KEY SW 6 EDGE HAL KEY FALLING EDGE PICTL HAL KEY SW 6 EDGEBIT endif HAL KEY SW 6 ICTL HAL KEY SW 6 ICTLBIT 设定中断使能设定中断使能 HAL KEY SW 6 IEN HAL KEY SW 6 IENBIT HAL KEY SW 6 PXIFG HAL KEY SW 6 BIT 清除中断标志清除中断标志 endif else HalKeyConfigured TRUE endif HAL KEY 按键配置函数按键配置函数 HalKeyConfig 说明 说明 配置三个全局变量 配置三个全局变量 配置两个按键 配置两个按键 我们这里是要将按键配置为中断方式我们这里是要将按键配置为中断方式 需要将按键配置为上升沿 需要将按键配置为上升沿 或是下降沿触发 同时需要将按键的对应或是下降沿触发 同时需要将按键的对应 I O 口配置为允许中断 即中断使能 在配置触口配置为允许中断 即中断使能 在配置触 发沿时首先默认配置为上升沿 然后检测按键相关宏定义决定是否需要配置为下降沿 在发沿时首先默认配置为上升沿 然后检测按键相关宏定义决定是否需要配置为下降沿 在 配置完中断使能后清除中断标志位允许按键中断 具体配置代码需参见按键相关宏定义和配置完中断使能后清除中断标志位允许按键中断 具体配置代码需参见按键相关宏定义和 CC2340 的的 datasheet 进行理解 进行理解 将按键配置为中断方式 将按键配置为中断方式 在程序中没有触发类似在程序中没有触发类似 HAL KEY EVENT 的事件 而的事件 而 是交由中断函数进行处理 是交由中断函数进行处理 当有按键按下时中断函数就会捕获中断 从而调用按键的处理当有按键按下时中断函数就会捕获中断 从而调用按键的处理 函数进一步进行相关处理 关于中断方式的按键处理将在后面的进行梳理 函数进一步进行相关处理 关于中断方式的按键处理将在后面的进行梳理 5 按键的处理 按键的处理 A 轮询方式处理 轮询方式处理 轮询方式是轮询方式是 TI 的的 Zstack 对按键默认的处理方式 对按键默认的处理方式 Zstack 会每隔会每隔 100ms 对按键检测一对按键检测一 次次 如果有按键按下就执行相关的处理 如果有按键按下就执行相关的处理 Zstack 是以每隔是以每隔 100ms 触发一次触发一次 HAL KEY EVENT 事件实现的轮询的 定时器溢出时间事件实现的轮询的 定时器溢出时间 HAL KEY POLLING VALUE 即为轮询的的间隔 即为轮询的的间隔 Zstack 每次轮询按键都会与保存的按键值 每次轮询按键都会与保存的按键值 halKeySavedKeys 进行对比 保存按键 进行对比 保存按键 值在按键初始化函数被初始化为值在按键初始化函数被初始化为 0 如果没有按下即与先前保存的按键值相等 如果没有按下即与先前保存的按键值相等 Zstack 不不 进行处理 如果有按键按下 那么按键值与保存的按键值 进行处理 如果有按键按下 那么按键值与保存的按键值 halKeySavedKeys 不同 将 不同 将 会调用按键处理回调处理函数进行处理 并将此时得到的按键值保存以便下次比较 会调用按键处理回调处理函数进行处理 并将此时得到的按键值保存以便下次比较 在轮询方式配置完成后 在轮询方式配置完成后 Zstack 便触发了事件便触发了事件 HAL KEY EVENT 其任务 其任务 ID 为为 Hal TaskID 则对应的处理函数即为 则对应的处理函数即为 HAL 层的事件处理函数层的事件处理函数 Hal ProcessEvent 触发 触发 了了 HAL 层的层的 HAL KEY EVENT 标志着开始了按键的轮询 详细代码如下 标志着开始了按键的轮询 详细代码如下 程序代码 程序代码 uint16 Hal ProcessEvent uint8 task id uint16 events if events if Hal KeyIntEnable osal start timerEx Hal TaskID HAL KEY EVENT 100 endif HAL KEY return events HAL KEY EVENT HAL KEY EVENT 事件处理说明 事件处理说明 在处理 在处理 HAL KEY EVENT 事件时调用了函数事件时调用了函数 HalKeyPoll 函数 函数 HalKeyPoll 负责检测是否有按键按下 如果有按键按下会触发相应的回调函数 负责检测是否有按键按下 如果有按键按下会触发相应的回调函数 在调用函数 在调用函数 HalKeyPoll 检测完按键过后 检测完按键过后 用用 if 条件判断语句检测按键是否是轮条件判断语句检测按键是否是轮 询方式处理 询方式处理 这里我们是以轮询方式处理按键 所以满足这里我们是以轮询方式处理按键 所以满足 if 条件判断语句的条件 即执行条件判断语句的条件 即执行 函数函数 osal start timerEx 定时再次触发事件定时再次触发事件 HAL KEY EVENT 定时长度为 定时长度为 100ms 由 由 此可以看出如此的循环的触发事件此可以看出如此的循环的触发事件 HAL KEY EVENT 即完成了对按键的定时轮询 即完成了对按键的定时轮询 处理处理 HAL KEY EVENT 事件时调用了函数事件时调用了函数 HalKeyPoll HalKeyPoll 函数进一步函数进一步 来去检测是否有按键按下 其详细代码如下 来去检测是否有按键按下 其详细代码如下 程序代码 程序代码 define HAL KEY STATE NORMAL 0 x00 define HAL KEY STATE SHIFT 0 x01 void HalKeyPoll void uint8 keys 0 初始键值为初始键值为 0 if defined HAL KEY SW 6 ENABLE if HAL KEY SW 6 PORT endif if defined HAL KEY SW 5 ENABLE if HAL KEY SW 5 PORT endif if Hal KeyIntEnable 轮询方式轮询方式 if keys halKeySavedKeys return halKeySavedKeys keys 保存按键值下次比较保存按键值下次比较 if keys HalKeyPoll 函数说明 函数说明 HalKeyPoll 函数对所有的按键进行检测 这里我们只是列举了函数对所有的按键进行检测 这里我们只是列举了 SW5 和和 SW6 两两 个按键 摇杆的四个方向是利用个按键 摇杆的四个方向是利用 AD 采集的数值不同决定的 具体可以参见协议栈代码 采集的数值不同决定的 具体可以参见协议栈代码 这里不一一列举了 这里不一一列举了 按键值的采集 首先函数定义了一个 按键值的采集 首先函数定义了一个 uint8 的局部变量的局部变量 keys 用来存储按键的值 用来存储按键的值 并将其值初始化为并将其值初始化为 0 通过 通过 if 条件语句判定是否有条件语句判定是否有 SW5 或者或者 SW6 被按下 注意程序中的被按下 注意程序中的 代码在检测代码在检测 SW5 时是检测对应位是否为高电平时是检测对应位是否为高电平 而检测而检测 SW6 时检测对应位是否为低电平时检测对应位是否为低电平 这里的高低电平与我们最初分析原理图时一致 如果有按键按下则将其对应的数值赋给局这里的高低电平与我们最初分析原理图时一致 如果有按键按下则将其对应的数值赋给局 部变量部变量 keys 轮询处理 如果是轮询方式首先要对读取的按键进行判别 如果读取的按键值为 轮询处理 如果是轮询方式首先要对读取的按键进行判别 如果读取的按键值为 上次的按键值直接返回不进行处理 如果读取的按键值和上次的按键值不同 则将读取的上次的按键值直接返回不进行处理 如果读取的按键值和上次的按键值不同 则将读取的 按键值保存到全局变量按键值保存到全局变量 halKeySavedKeys 以便下一次比较 并调用函数进行处理 以便下一次比较 并调用函数进行处理 回调函数处理按键 回调函数处理按键 当有按键按下后则当有按键按下后则 keys 值不为值不为 0 并且在按键配置函数 并且在按键配置函数 HalKeyConfig 的时候我们为按键配置了回调函数的时候我们为按键配置了回调函数 OnBoard KeyCallback 所以 所以 if keys if registeredKeysTaskID NO TASK ID 这里必须要被注册这里必须要被注册 分配内存空间分配内存空间 msgPtr keyChange t osal msg allocate sizeof keyChange t if msgPtr 内存分配成功内存分配成功 msgPtr hdr event KEY CHANGE msgPtr state state msgPtr keys keys osal msg send registeredKeysTaskID uint8 msgPtr return ZSuccess else return ZFailure OnBoard SendKeys 函数说明函数说明 按键的注册 按键的注册 if registeredKeysTaskID NO TASK ID 用来用来判断按键是否被注判断按键是否被注 册册 在 在 Zstack 中 如果要使用按键必须要注册 类似于端点中 如果要使用按键必须要注册 类似于端点 endpoint 的注册 但按键的的注册 但按键的 注册只能注册给一个层 这里我们以注册只能注册给一个层 这里我们以 SampleApp 实例进行说明 实例进行说明 在在 SampleApp 实例的应用层初始化代码中调用了按键注册函数实例的应用层初始化代码中调用了按键注册函数 RegisterForKeys 进进 行按键注册 其传递的任务行按键注册 其传递的任务 ID 为为 SampleApp TaskID 按键注册函数代码如下 按键注册函数代码如下 程序代码 程序代码 byte RegisterForKeys byte task id 仅允许注册一次仅允许注册一次 if registeredKeysTaskID NO TASK ID 判断条件 确定没有被注册判断条件 确定没有被注册 registeredKeysTaskID task id 将传来的将传来的 ID 赋给了赋给了 registeredKeysTaskID return true else return false 按键注册函数按键注册函数仅允许注册一次 即只能有一个层注册按键仅允许注册一次 即只能有一个层注册按键 在按键注册时首先检测了 在按键注册时首先检测了 全局变量全局变量 registeredKeysTaskID 初始化为 初始化为 NO TASK ID 是否等于 是否等于 NO TASK ID 如 如 果等于则证明按键没有被注册 可以被注册 按键的注册实际上就是将函数传递来的任务果等于则证明按键没有被注册 可以被注册 按键的注册实际上就是将函数传递来的任务 ID 赋给赋给 全局变量全局变量 registeredKeysTaskID 的过程 的过程 数据的发送 在确定按键已经被注册的前提下 数据的发送 在确定按键已经被注册的前提下 Zstack 对按键信息进行打包处理 对按键信息进行打包处理 封装到信息包封装到信息包 msgPtr 中 将将要触发的事件中 将将要触发的事件 KEY CHANGE 按键的状态 按键的状态 state 和按键的和按键的 键值键值 keys 一并封装 然后调用一并封装 然后调用 osal msg send 将按键信息发送到注册按键的对应层 将按键信息发送到注册按键的对应层 这里我们以这里我们以 SampleApp 工程为例 工程为例 Zstack 最终触发了最终触发了 SampleApp 应用层的处理函数应用层的处理函数 中的中的 KEY CHANGE 事件 代码如下 事件 代码如下 程序代码 程序代码 uint16 SampleApp ProcessEvent uint8 task id uint16 events case KEY CHANGE SampleApp HandleKeys keyChange t MSGpkt state keyChange t MSGpkt keys break SampleApp ProcessEvent 在处理在处理 HAL KEY EVENT 事件时调用了应用层的按键处事件时调用了应用层的按键处 理函数理函数 SampleApp HandleKeys 按键处理函数 按键处理函数 SampleApp HandleKeys 对按键进一步对按键进一步 处理 其代码如下 处理 其代码如下 程序代码 程序代码 void SampleApp HandleKeys uint8 shift uint8 keys if keys if keys P0IF 0 P0 口外部中断函数说明口外部中断函数说明 在该中断函数调用了按键中断处理函数在该中断函数调用了按键中断处理函数 halProcessKeyInterrupt 对中断进行处理 且对中断进行处理 且 将将 P0 口中断标志位清零 中断处理函数口中断标志位清零 中断处理函数 halProcessKeyInterrupt 代码如下 代码如下 程序代码 程序代码 void halProcessKeyInterrupt void bool valid FALSE if defined HAL KEY SW 6 ENABLE if HAL KEY SW 6 PXIFG valid TRUE endif if defined HAL KEY SW 5 ENABLE if HAL KEY SW 5 PXIFG valid TRUE endif if valid osal start timerEx Hal TaskID HAL KEY EVENT HAL KEY DEBOUNCE VALUE 按键中断处理按键中断处理 halProcessKeyInterrupt 说明 说明 局部变量 局部变量 valid 说明 函数中的局部变量说明 函数中的局部变量 valid 标示了是否有按键按下 如果有按标示了是否有按键按下 如果有按 键按下则定时触发键按下则定时触发 HAL KEY EVENT 事件 事件 这里说明一点 这里说明一点 P0 口外部中断不只是我们口外部中断不只是我们 这里的两个按键 这里的两个按键 按键的检测 在该函数中通过检测按键对应位的 按键的检测 在该函数中通过检测按键对应位的中断标志位是否为中断标志位是否为 1 判断按键 判断按键 按下 按下 CC2340 的每一个的每一个 I O 都可以产生中断 如果有按键按下则要将对应位的中断标志都可以产生中断 如果有按键按下则要将对应位的中断标志 位置为位置为 0 并将局部变量 并将局部变量 valid 设置为设置为 TRUE 从而触发 从而触发 AL KEY EVENT 事件对按键处事件对按键处 理 理 HAL KEY EVENT 事件 如果有按键按下则会定时触发事件 如果有按键按下则会定时触发 HAL KEY EVENT 事事 件 定时长度为件 定时长度为 HAL KEY DEBOUNCE VALUE 25ms 这里说明一下 在按键中断 这里说明一下 在按键中断 处理函数处理函数 halProcessKeyInterrupt 并没有读取按键的值 而是定时触发了并没有读取按键的值 而是定时触发了 HAL KEY EVENT 事件 在处理事件 在处理 HAL KEY EVENT 事件时读取 定时时长事件时读取 定时时长 HAL KEY DEBOUNCE VALUE 25ms 是为了按键消抖 是为了按键消抖 按键中断处理按键中断处理 halProcessKeyInterrupt 所触发的所触发的 HAL KEY EVENT 事件在事件在 HAL 层层 事件处理函数事件处理函数 Hal ProcessEvent 被处理 具体代码如下 被处理 具体代码如下 程序代码 程序代码 uint16 Hal ProcessEvent uint8 task id u

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论