CC2530芯片在TI协议栈中自定义外部中断
2013-07-11 16:22
246 查看
CC2530芯片在TI协议栈中自定义外部中断
学过单片机或写过CC2530裸板程序的同学都知道,外部中断的处理是通过中断服务程序实现的。
在CC2530裸板程序中,我们可以这样实现。
裸板上外部中断的触发是非常简单的,那么当cc2530上移植了TI协议栈后,如果写外部中断呢。首先我们可以在协议栈中hal_muc.h文件中找到格式的定义。
如果用户完成了这个操作后,可能发现还是触发不了中断服务程序。我通过一个比较偏门的方法测试成功了。TI协议栈中,定义了按键的驱动和中断。我们首先在在onbroad.c文件中使能按键中断,找到以下语句。
OnboardKeyIntEnable = HAL_KEY_INTERRUPT_ENABLE;
然后在hal_key.c中把按键的中断服务程序关闭掉。直接全部注释。。
这样的话P0口的外部中断就定义成功了,亲测有效。
学过单片机或写过CC2530裸板程序的同学都知道,外部中断的处理是通过中断服务程序实现的。
在CC2530裸板程序中,我们可以这样实现。
#pragma vector = P0INT_VECTOR __interrupt void P0_ISR(void) //假设P0口全部定义为中断模式 { if(P0IFG >>4 & 0x01) //P0IFG是CC2530的中断标志位 { led2 = ~led2; //P0_4触发中断 } if(P0IFG >>5 & 0x01) //P0_5触发中断 { led1 = ~led1; } P0IFG = 0; P0IF = 0; }
裸板上外部中断的触发是非常简单的,那么当cc2530上移植了TI协议栈后,如果写外部中断呢。首先我们可以在协议栈中hal_muc.h文件中找到格式的定义。
/* ------------------------------------------------------------------------------------------------ * Compiler Abstraction * ------------------------------------------------------------------------------------------------ */ /* ---------------------- IAR Compiler ---------------------- */ #ifdef __IAR_SYSTEMS_ICC__ #include <ioCC2530.h> #define HAL_COMPILER_IAR #define HAL_MCU_LITTLE_ENDIAN() __LITTLE_ENDIAN__ #define _PRAGMA(x) _Pragma(#x) #define HAL_ISR_FUNC_DECLARATION(f,v) _PRAGMA(vector=v) __near_func __interrupt void f(void) #define HAL_ISR_FUNC_PROTOTYPE(f,v) _PRAGMA(vector=v) __near_func __interrupt void f(void) #define HAL_ISR_FUNCTION(f,v) HAL_ISR_FUNC_PROTOTYPE(f,v); HAL_ISR_FUNC_DECLARATION(f,v) /* ---------------------- Keil Compiler ---------------------- */ #elif defined __KEIL__ #include <CC2530.h> #define HAL_COMPILER_KEIL #define HAL_MCU_LITTLE_ENDIAN() 0 #define HAL_ISR_FUNC_DECLARATION(f,v) void f(void) interrupt v #define HAL_ISR_FUNC_PROTOTYPE(f,v) void f(void) #define HAL_ISR_FUNCTION(f,v) HAL_ISR_FUNC_PROTOTYPE(f,v); HAL_ISR_FUNC_DECLARATION(f,v) /* ------------------ Unrecognized Compiler ------------------ */ #else #error "ERROR: Unknown compiler." #endif 我用的是IAR编译器,所以格式为HAL_ISR_FUNCTION(P0_IRQ,P0INT_VECTOR) 所以我们在一个文件中通过下面语句进行中断的声明。 _PRAGMA(vector=P0INT_VECTOR) __near_func __interrupt void P0ISR(void); 通过如下格式书写中断服务程序。 HAL_ISR_FUNCTION(P0_IRQ,P0INT_VECTOR) { if(P0IFG >>4 & 0x01) //P0IFG是CC2530的中断标志位 { led2 = ~led2; //P0_4触发中断 } if(P0IFG >>5 & 0x01) //P0_5触发中断 { led1 = ~led1; } P0IFG = 0; P0IF = 0; }
如果用户完成了这个操作后,可能发现还是触发不了中断服务程序。我通过一个比较偏门的方法测试成功了。TI协议栈中,定义了按键的驱动和中断。我们首先在在onbroad.c文件中使能按键中断,找到以下语句。
OnboardKeyIntEnable = HAL_KEY_INTERRUPT_ENABLE;
然后在hal_key.c中把按键的中断服务程序关闭掉。直接全部注释。。
这样的话P0口的外部中断就定义成功了,亲测有效。
相关文章推荐
- ZigBee TI ZStack CC2530 3.11 IO口02-外部中断
- 03 TI cc2530外部中断的应用
- CC2530外部中断相关
- ZigBee TI ZStack CC2530 3.15 按键驱动02-中断模式
- CC2530 外部中断 提醒
- Zigbee-cc2530笔记---按键与外部中断
- CC2530基础实验二 外部中断实验
- CC2530外部中断
- 【原创】zstack - 协议栈程序精简日志-IO口外部中断试验
- CC2530 外部中断 提醒
- CC2530裸机实现PWM输出(按键外部中断改变占空比)
- CC2530学习笔记の外部中断——按键控制LED
- TMS320F28335之外部中断和自定义中断
- zigbee学习笔记3----cc2530 外部中断实验
- ZigBee TI ZStack CC2530 8.4 用高版本IAR打开低版本协议栈
- zigbee学习笔记3----cc2530 外部中断实验
- 第8章 CC2530外部中断
- ZigBee TI ZStack CC2530 2.3 协议栈版本
- TI的Zigbee芯片 CC2530中添加波特率2400,4800等UART 波特率
- S3C2440外部中断系统详解