2541中断问题
各位大神们
大家好
我想请问一下有没有KeyFob中断的解释。我想解决一下中断的问题,但是在网上搜索的一些东西在协议栈中都找不到。
比如这样的:
示例程序:按键控制LED灯
1 /******************************************************************************
2 *文 件 名:KEY.c
3 *作 者:陈照
4 *时 间:2015-04-23
5 *版 本:1.0
6 *描 述:按键中断方式控制流水灯
7 ******************************************************************************/
8 #include <iocc2541.h>
9 #include "delay.h"
10
11 typedef unsigned char uchar;
12 typedef unsigned int uint;
13
14 #define LED1 P1_0
15 #define LED2 P1_1
16 #define LED3 P1_4
17 #define KEY P0_1
18
19 /******************************************************************************
20 *函 数 名:InitLED
21 *功 能:LED灯初始化
22 *入口参数:mode,mode为1则点亮所有LED,mode为0则熄灭所有LED
23 *出口参数:无
24 ******************************************************************************/
25 void InitLED(uchar mode)
26 {
27 P1SEL &= ~0x13; //P1.0,P1.1,P1.4设置为通用I/O口
28 P1DIR |= 0x13; //P1.0,P1.1,P1.4设置为输出
29 LED1 = mode; //LED灯亮熄控制
30 LED2 = mode;
31 LED3 = mode;
32 }
33
34 /******************************************************************************
35 *函 数 名:InitKey
36 *功 能:按键中断初始化
37 *入口参数:无
38 *出口参数:无
39 ******************************************************************************/
40 void InitKey(void)
41 {
42 P0SEL &= ~0x02; //P0.1设置为通用I/O口
43 P0DIR &= ~0x02; //P0.1设置为输入
44 P0IFG &= ~0x02; //P0.1中断状态标志位清0
45 PICTL |= 0x00; //P0端口下降沿触发
46 P0IEN |= 0x02; //P0.1中断使能
47 IEN1 |= 0x20; //端口P0中断使能
48 EA = 1; //开总中断
49 }
50
51 /******************************************************************************
52 *函 数 名:P0_ISR
53 *功 能:中断服务子程序
54 *入口参数:无
55 *出口参数:无
56 ******************************************************************************/
57 #pragma vector = P0INT_VECTOR
58 __interrupt void P0_ISR(void)
59 {
60 if(0x02 & P0IFG) //判断按键中断
61 {
62 LED1 = !LED1; //流水灯
63 Delay1ms(1000); //延时1s
64 LED2 = !LED2;
65 Delay1ms(1000);
66 LED3 = !LED3;
67 Delay1ms(1000);
68 }
69 P0IFG = 0; //清中断标志
70 P0IF = 0; //清中断标志,IRCON[5],P0口中断
71 }
72
73 /******************************************************************************
74 *程序入口函数
75 ******************************************************************************/
76 int main(void)
77 {
78 InitLED(0); //LED初始化,熄灭LED1~3
79 InitKey(); //按键中断初始化
80
81 while(1)
82 {
83 }
84 }
能具体说明下您的问题吗? TI的协议栈安装文件夹 C:\Texas Instruments\BLE-CC254x-1.4.1.43908b\Projects\ble\KeyFob 是包含keyfob例程的。其中也包含了中断方式
你好, Susan Yang
是的KeyFob包含中断的方式但是用的方法我不是很明白
我感觉按键是将键值传送到app层然后调用相应的回调函数。
但是按键中断不就是通过按键->产生中断->调用中断处理函数吗?
比如说在KeyFob中hal_key.c中最后这个函数是通过宏定义定义的函数。
HAL_ISR_FUNCTION( halKeyPort2Isr, P2INT_VECTOR )
{
HAL_ENTER_ISR();
if (HAL_KEY_JOY_MOVE_PXIFG & HAL_KEY_JOY_MOVE_BIT)
{
halProcessKeyInterrupt();
}
/*
Clear the CPU interrupt flag for Port_2
PxIFG has to be cleared before PxIF
Notes: P2_1 and P2_2 are debug lines.
*/
HAL_KEY_JOY_MOVE_PXIFG = 0;
HAL_KEY_CPU_PORT_2_IF = 0;
CLEAR_SLEEP_MODE();
HAL_EXIT_ISR();
return;
}
这个函数产生的源头是在这里(hal_mcu.h中第98行)
#if defined( CC2541) || defined( CC2541S )
#include <CC2541.h>
#else // CC2540
#include <CC2540.h>
#endif // CC2541 || CC2541S
#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)
这个是不是设置中断处理函数呀?这个地方有些疑问,我调试了如果按键就会进入这里。但是在KeyFob中还有
static void keyfobapp_HandleKeys( uint8 shift, uint8 keys )这样的函数。
我的意思是中断处理函数,和键值传到上层是不是可以理解为效果一样?
下面是在NPI文件夹下npi.c -> Output文件夹下的ioCC2541.h中
/* ------------------------------------------------------------------------------------------------
* Interrupt Vectors中断向量
* ------------------------------------------------------------------------------------------------
*/
#define RFERR_VECTOR VECT( 0, 0x03 ) /* RF core error situation */
#define ADC_VECTOR VECT( 1, 0x0B ) /* ADC end of conversion */
#define URX0_VECTOR VECT( 2, 0x13 ) /* USART 0 RX complete */
#define URX1_VECTOR VECT( 3, 0x1B ) /* USART 1 RX complete */
#define ENC_VECTOR VECT( 4, 0x23 ) /* AES encryption/decryption complete */
#define ST_VECTOR VECT( 5, 0x2B ) /* Sleep Timer Compare */
#define P2INT_VECTOR VECT( 6, 0x33 ) /* Port 2 Inputs and I2C */
#define UTX0_VECTOR VECT( 7, 0x3B ) /* USART0 TX Complete */
#define DMA_VECTOR VECT( 8, 0x43 ) /* DMA Transfer Complete */
#define T1_VECTOR VECT( 9, 0x4B ) /* Timer 1 (16-bit) Capture/Compare/Overflow */
#define T2_VECTOR VECT( 10, 0x53 ) /* Timer 2 */
#define T3_VECTOR VECT( 11, 0x5B ) /* Timer 3 (8-bit) Capture/Compare/Overflow */
#define T4_VECTOR VECT( 12, 0x63 ) /* Timer 4 (8-bit) Capture/Compare/Overflow */
#define P0INT_VECTOR VECT( 13, 0x6B ) /* Port 0 Inputs */
#define UTX1_VECTOR VECT( 14, 0x73 ) /* USART1 TX Complete */
#define P1INT_VECTOR VECT( 15, 0x7B ) /* Port 1 Inputs */
#define RF_VECTOR VECT( 16, 0x83 ) /* RF General Interrupts */
#define WDT_VECTOR VECT( 17, 0x8B ) /* Watchdog Overflow in Timer Mode */
但是根据上面的写法第一次发表的
#pragma vector = P0INT_VECTOR
58 __interrupt void P0_ISR(void)
59 {
60 if(0x02 & P0IFG) //判断按键中断
61 {
62 LED1 = !LED1; //流水灯
63 Delay1ms(1000); //延时1s
64 LED2 = !LED2;
65 Delay1ms(1000);
66 LED3 = !LED3;
67 Delay1ms(1000);
68 }
69 P0IFG = 0; //清中断标志
70 P0IF = 0; //清中断标志,IRCON[5],P0口中断
71 }
协议栈是不是把这两句封装到一个宏中了?
#pragma vector = P0INT_VECTOR
58 __interrupt void P0_ISR(void)
冲突了,把原来的中断程序屏蔽掉。