MyException - 我的异常网
当前位置:我的异常网» 移动开发 » 2530 开发板上的某个按键批改

2530 开发板上的某个按键批改

www.MyException.Cn  网友分享于:2013-09-10  浏览:24次
2530 开发板上的某个按键修改


        对于手上拥有一个2530开发板的Zstack初学者来说,最经常做的事情也许就是按下开发板上的某个按键,进行绑定或者远程控制另一个开发板上的LED的亮灭。自然而然地,大家都想知道这个过程是如何实现的,协议栈的按键处理函数在哪里,如果想自己设计开发板,假如按键接口和2530标准开发板不一样的话,又应当修改哪些参数才能保证按键能够起作用,这里我就来详细地解释一下。

按键的配置是在hal_key.c里实现的,在文件的顶端,我们能够找到如下的预编译内容:

/* SW_6 is at P0.1 */

#define HAL_KEY_SW_6_PORT   P0

#define HAL_KEY_SW_6_BIT    BV(1)

#define HAL_KEY_SW_6_SEL    P0SEL

#define HAL_KEY_SW_6_DIR    P0DIR

 

/* edge interrupt */

#define HAL_KEY_SW_6_EDGEBIT  BV(0)

#define HAL_KEY_SW_6_EDGE     HAL_KEY_FALLING_EDGE

 

/* SW_6 interrupts */

#define HAL_KEY_SW_6_IEN      IEN1  /* CPU interrupt mask register */

#define HAL_KEY_SW_6_IENBIT   BV(5) /* Mask bit for all of Port_0 */

#define HAL_KEY_SW_6_ICTL     P0IEN /* Port Interrupt Control register */

#define HAL_KEY_SW_6_ICTLBIT  BV(1) /* P0IEN - P0.1 enable/disable bit */

#define HAL_KEY_SW_6_PXIFG    P0IFG /* Interrupt flag at source */

 

对于具备大学英语水平的同学们来说,这些语句的含义并不难理解。这里是说Zstack协议栈的SW6按键被分配到了P0.1端口,下面所有的这些预编译内容都是为了保证按键被按下时,程序能够检测到并进行正确处理。我们看到这里的预编译内容涉及到了大量的寄存器,大家要适应Zstack的这一编码方式,习惯冗长的预编译命名(对于经常编写VC等高级语言代码的同学来说这也许并不算什么)。

好的,心急的同学也许已经迫不及待地想要开始修改了,我这里就列出我自己修改的将SW6分配到P0.7的配置代码:

/* SW_6 is at P0.7 */

#define HAL_KEY_SW_6_PORT   P0

#define HAL_KEY_SW_6_BIT    BV(7)

#define HAL_KEY_SW_6_SEL    P0SEL

#define HAL_KEY_SW_6_DIR    P0DIR

 

/* edge interrupt */

#define HAL_KEY_SW_6_EDGEBIT  BV(0)

#define HAL_KEY_SW_6_EDGE     HAL_KEY_FALLING_EDGE

 

/* SW_2 interrupts */

#define HAL_KEY_SW_6_IEN      IEN1  /* CPU interrupt mask register */

#define HAL_KEY_SW_6_IENBIT   BV(5) /* Mask bit for all of Port_0 */

#define HAL_KEY_SW_6_ICTL     P0IEN /* Port Interrupt Control register */

#define HAL_KEY_SW_6_ICTLBIT  BV(7) /* P0IEN - P0.6 enable/disable bit */

#define HAL_KEY_SW_6_PXIFG    P0IFG /* Interrupt flag at source */

如果对于以上配置有什么不很理解的地方我建议大家多去看看CC2530的说明文档,仔细理解每一个寄存器所起到的作用。对于嵌入式软件工程师来说,说明文档永远是最得力的帮手。

OK,在完成了以上配置之后,下面要关注的应该就是按键处理函数了,那么这个函数在哪呢?这里我们以Zstack协议栈的SampleSwitch工程为例,有一个文件我们要特别注意,这就是zcl_samplesw.c。这是应用层的源文件,对于广大Zstack协议栈开发者来说,以后对协议栈的修改很大一部分都是在这个文件中进行的。在这个文件中,找到这个函数:

static void zclSampleSw_HandleKeys( byte shift, byte keys )

{

  zAddrType_t dstAddr;

  (void)shift;  // Intentionally unreferenced parameter

 

  if ( keys & HAL_KEY_SW_1 )

  {

    // Using this as the "Light Switch"

#ifdef ZCL_ON_OFF

    zclGeneral_SendOnOff_CmdToggle( SAMPLESW_ENDPOINT, &zclSampleSw_DstAddr, false, 0 );

#endif

  }

 

  if ( keys & HAL_KEY_SW_2 )

  {

    HalLedSet ( HAL_LED_4, HAL_LED_MODE_OFF );

 

    // Initiate an End Device Bind Request, this bind request will

    // only use a cluster list that is important to binding.

    dstAddr.addrMode = afAddr16Bit;

    dstAddr.addr.shortAddr = 0;   // Coordinator makes the match

    ZDP_EndDeviceBindReq( &dstAddr, NLME_GetShortAddr(),

                           SAMPLESW_ENDPOINT,

                           ZCL_HA_PROFILE_ID,

                           0, NULL,   // No incoming clusters to bind

                           ZCLSAMPLESW_BINDINGLIST, bindingOutClusters,

                           TRUE );

  }

 

  if ( keys & HAL_KEY_SW_3 )

  {

  }

 

  if ( keys & HAL_KEY_SW_4 )

  {

    HalLedSet ( HAL_LED_4, HAL_LED_MODE_OFF );

 

    // Initiate a Match Description Request (Service Discovery)

    dstAddr.addrMode = AddrBroadcast;

    dstAddr.addr.shortAddr = NWK_BROADCAST_SHORTADDR;

    ZDP_MatchDescReq( &dstAddr, NWK_BROADCAST_SHORTADDR,

                       ZCL_HA_PROFILE_ID,

                       ZCLSAMPLESW_BINDINGLIST, bindingOutClusters,

                       0, NULL,   // No incoming clusters to bind

                       FALSE );

  }

}

聪明的同学一看就明白了,哦,原来如此简单啊,那我是不是只要这么添加就成了:

if ( keys & HAL_KEY_SW_6 )

{

   处理函数…

}

没有错,杀人越货居家旅行必备的天下第一奇毒秘密配方已尽收你眼底了,哈哈。OK,修改之后编译下载,大功告成,按下按键,等待见证奇迹的时刻。咦,咋什么反应都没???

呵呵,是不是有种想要砸电脑的感觉,Zstack协议栈确实相当令人各种厌烦,除了以上的配置,还有两个要注意的地方。在hal_board_cfg.h文件中,有下面两句预编译语句:

/* S1 */

#define PUSH1_BV          BV(1)

#define PUSH1_SBIT         P0_1

这时你心想,这不是S1么,跟S6有毛的关系啊!咦,不对啊,Zstack默认的的SW6不是对应着P0.1么,怎么这里的S1也关联到P0.1去了。呵呵,这个其实是TI的不对了,确实这里的S1和刚才的SW6是一回事,就让我们尽情地对着TI的协议栈送上各种“美好的”问候词吧。在hal_key.c中,也可以看到:

if (HAL_PUSH_BUTTON1())

{

  keys |= HAL_KEY_SW_6;

}

是不是憋不住想骂人了,淡定淡定。我们把hal_board_cfg.h中的那两个预编译代码进行相应的修改:

/* S1 */

#define PUSH1_BV          BV(7)

#define PUSH1_SBIT         P0_7

编译下载,按下按键,此刻,屏幕缓缓变黑,最后留下一行颇有深意的文字:To be continued…

影迷们请尽情期待13年悬疑大剧的下一集

文章评论

我是如何打败拖延症的
我是如何打败拖延症的
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
一个程序员的时间管理
一个程序员的时间管理
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
程序员都该阅读的书
程序员都该阅读的书
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
总结2014中国互联网十大段子
总结2014中国互联网十大段子
 程序员的样子
程序员的样子
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
漫画:程序员的工作
漫画:程序员的工作
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
中美印日四国程序员比较
中美印日四国程序员比较
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
那些争议最大的编程观点
那些争议最大的编程观点
代码女神横空出世
代码女神横空出世
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
旅行,写作,编程
旅行,写作,编程
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
Java程序员必看电影
Java程序员必看电影
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
我的丈夫是个程序员
我的丈夫是个程序员
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
程序员应该关注的一些事儿
程序员应该关注的一些事儿
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
10个调试和排错的小建议
10个调试和排错的小建议
程序员的鄙视链
程序员的鄙视链
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
为什么程序员都是夜猫子
为什么程序员都是夜猫子
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
程序员必看的十大电影
程序员必看的十大电影
如何成为一名黑客
如何成为一名黑客
编程语言是女人
编程语言是女人
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有