cc2530开发板调试过程之按键配置

标签:
佛学 |
分类: ZigBee |
转载:http://wen.shuijie.blog.163.com/blog/static/578694102012102694351480/
首先:GenericApp使用的一些IO引脚有P0_1、P2_0作为按键。但是它也配置了P2_3允许中断,使用了P1_0,P1_1,P1_4作为输出,驱动,这些应注意使用。
main()函数开始
↓
osal_int_enable( INTS_ALL );->EA=1
//使用全局中断;
↓
↓
PICTL &= ~(HAL_KEY_SW_6_EDGEBIT);
#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);
↓
↓
↓
↓
↓
HalDriverInit();-> HalKeyInit();设置P0_1和P2_0为输入状态,初始化Callback为NULL,按键配置状态为FALSE
InitBoard( OB_READY );→按键有关的中断使能,
→HalKeyConfig(
OnboardKeyIntEnable,OnBoard_KeyCallback);配置中断与回调函数→所有P0口都配置成中断失能中断
///////////斜线之间是自己写的,也是新手特别特别容易出错的地方,这个按键我自己配置了一整天///
主要是按键接口的配置:
下面是我把p0.1改成p0.6的过程,我是一步一步按照数据手册弄懂每个寄存器的意思。
// SW_6 is at P0.6
#define HAL_KEY_SW_6_PORT P0
#define HAL_KEY_SW_6_BIT
BV(6)//changed by Lu
#define HAL_KEY_SW_6_SEL
P0SEL
#define HAL_KEY_SW_6_DIR
P0DIR
#define HAL_KEY_SW_6_EDGEBIT BV(0)
#define HAL_KEY_SW_6_EDGE
HAL_KEY_FALLING_EDGE
#define HAL_KEY_SW_6_IEN
IEN1
#define HAL_KEY_SW_6_IENBIT BV(5)
///这个只能是BV(5),无论你是P0.几,只要是PO口的中断触发,就是BV(5)。
#define HAL_KEY_SW_6_ICTL
P0IEN
#define HAL_KEY_SW_6_ICTLBIT BV(6)
#define HAL_KEY_SW_6_PXIFG
P0IFG
//////////////////////////////////////////////////////////////////////////////////////////////
→ osal_start_timerEx (Hal_TaskID, HAL_KEY_EVENT,
HAL_KEY_POLLING_VALUE);产生定时轮询的方式查询按键,按键配置状态为TRUE:HalKeyConfigured =
TRUE;
在Hal_drivers.c中的Hal_ProcessEvent存在处理按键的程序如: if
(events &
HAL_KEY_EVENT) →HalKeyPoll(); →得到键值等
以上初始化后,就进入了系统
osal_start_system();
以上是真正系统跑起来后的,以下假设是使用中断方式。
HalKeyConfig()从这里开始是不一样的
设置相应位的允许中断
osal_stop_timerEx( Hal_TaskID, HAL_KEY_EVENT);
停止定时器,但是 HalKeyPoll();一样会执行,检测按键,内里有个关于中断方式的按键处理是空的,可以自己编写
中断方式的话,还要处理中断函数:HAL_ISR_FUNCTION( halKeyPort0Isr, P0INT_VECTOR
)→ halProcessKeyInterrupt();
以上是底层处理按键的过程,我们在应用层如何使用呢?(注意底层中是可以修改按键对应的IO口的,如果和例程不一样就要修改了)
在Z-stack中需要用到按键时,必须注册按键任务,输入参数是我们的任务ID,如:RegisterForKeys(GenericApp_TaskID);
注册完成后,当按键事件发生时,我们会跳到事件处理函数中:GenericApp_ProcessEvent();
对应的事件宏定义为KEY_CHANGE。当发生按键事件时,就跳到事件处理函数:SampleApp_HandlesKeys(((KeyChange_t
*)MSGpkt)->state,((KeyChange_t
*)MSGpkt)->keys);//此函数可以编写我们的按键处理任务。
前一篇:调试 串口的时候遇到的一个问题
后一篇:在线调试IAR软件时出现个问题