加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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

(2014-10-28 20:53:37)
标签:

佛学

分类: 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()函数开始
HalDriverInit();-> HalKeyInit();设置P0_1和P2_0为输入状态,初始化Callback为NULL,按键配置状态为FALSE
            
 osal_int_enable( INTS_ALL );->EA=1 //使用全局中断;
            
InitBoard( OB_READY );→按键有关的中断使能,
             
→HalKeyConfig( OnboardKeyIntEnable,OnBoard_KeyCallback);配置中断与回调函数→所有P0口都配置成中断失能中断
///////////斜线之间是自己写的,也是新手特别特别容易出错的地方,这个按键我自己配置了一整天///
主要是按键接口的配置:

   

    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);

下面是我把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);//此函数可以编写我们的按键处理任务。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有