Dear大神,我使用CC2541的问题,定义了一个Timer3 1ms计时,和一个IO中断(P1.3),单独测试Timer和IO中断都是OK,
但是Timer3初始化后,初始化IO(P1.3)中断,当P1.3有中断产生时,Timer3就不工作了,为什么?
谁帮忙分析一下,谢谢!已经研究几天了,搞不懂。。。。。
以下是Timer和IO中断的代码,附件是.c文件
*************************************************************
**************************************************************/
#if 1 /*Binyang add for test*/
#define SPI_CLOCK_PIN 0x08 /*P1.3*/
#define SPI_DATA_PIN 0x20 /*P1.5*/
#define SPI_DATA_INTERVAL_MIN 60 /*SPI DATA数据最小时间间隔ms*/
#define SPI_DATA_INTERVAL_MAX 200 /*SPI DATA数据最大时间间隔ms*/
#define SPI_DATE_BIT_NUM 40 /*Bit date length*/
static int gTimer3_Ms = 0; /* 1 = 1ms*/
static int gLast_timer = 0; /*上一次Timer3 计时*/
static char gSPIRxDate[5] = {0}; /*存放接收到的SPI Data*/
static char gDatabitNum = 0;
/******************************************************************************
*函 数 名:InitT3
*功 能:定时器3初始化
*入口参数
*出口参数:无
******************************************************************************/
void Start_Timer3_Init(void)
{
T3CTL = 0xee; //定时器3 128分频,模计数器模式,溢出中断使能,计数器清0
T3CCTL0 = 0x44; //通道0比较功能,并且开通道0中断
T3CC0 = 0xff; //定时器3通道0捕获/比较值
IEN1 |= (1<<3); //定时器3中断使能
EA = 1; //开总中断
T3CTL |= 0x10; //启动定时器3
gTimer3_Ms = 0;
gLast_timer = 0;
}
/*******************************************************************************
*函 数 名:stop_InitT3
*功 能:定时器3 停止
*入口参数
*出口参数:无
*********************************************************************************/
void Stop_Timer3_Init(void)
{
T3CTL &= ~0x10; // Stop timer 3
gTimer3_Ms = 0;
}
void Resume_Timer3(void)
{
//IRCON &= ~0x00;
TIMIF &= ~0x11;
T3CTL |= 0x10; //启动定时器3
gTimer3_Ms = 0;
}
/******************************************************************************
*函 数 名:Timer3_ISR
*功 能:定时器3中断服务程序
*入口参数:无
*出口参数:无
******************************************************************************/
static int LED_Test_EN = 0;
#pragma vector = T3_VECTOR
__interrupt void Timer3_ISR(void)
{
//IRCON &= ~0x00;
//TIMIF &= ~0x11;
#if 1 /*Binyang add for timer*/ gTimer3_Ms++;
if(gTimer3_Ms > 0xFFFC){
gTimer3_Ms = 0;
}
#else //Test timer if(gTimer3_Ms++ > 500)
{
gTimer3_Ms = 0;
LED_Test_EN++;
if(LED_Test_EN%2){
HalLedSet(HAL_LED_1, HAL_LED_MODE_OFF );
} else{
HalLedSet(HAL_LED_1, HAL_LED_MODE_ON );
}
if(LED_Test_EN>20){
Stop_Timer3_Init();
LED_Test_EN =0;
}
}#endif
}
/******************************************************************************
*函 数 名:SPI_data_pin_init
*功 能:初始化data pin
*入口参数:无
*出口参数:无
******************************************************************************/
void SPI_data_pin_init(void)
{
P1SEL &= (uint8) ~SPI_DATA_PIN;
/* Configure direction of pins input*/
P1DIR &= (uint8) ~SPI_DATA_PIN;
P1INP &= (uint8) ~SPI_DATA_PIN;
P2INP &=(uint8) ~0x40;
gDatabitNum = 0;
}
/******************************************************************************
*函 数 名:SPI_Clock_Interrupt_init
*功 能:定时器3中断服务程序
*入口参数:无
*出口参数:无
******************************************************************************/
void SPI_Clock_Interrupt_init(void)
{
P1SEL &= ~SPI_CLOCK_PIN; P1DIR &= ~SPI_CLOCK_PIN; //初始化
//端口1,引脚3至0输入模式下的中断配置,该位为端口0的7-0脚的输入选择中断请求条件。0:输入的上升沿引起中断;1:输入的下降沿引起中断 PICTL |= 0x2; //端口1,位7至位0中断使能。0:中断禁止;1:中断使能; P1IEN |= SPI_CLOCK_PIN; //端口1,位7至位0输入中断状态标志。当某引脚上有中断请求未决信号时,其相应标志为1。
P1IFG &= ~SPI_CLOCK_PIN; //打开总中断
EA = 1;
//SPI_data_pin_init(); //Date IO init
}
/****************************************************************************
* 名 称: P1_ISR(void) 中断处理函数* 描 述: #pragma vector = 中断向量,紧接着是中断处理程序
****************************************************************************/
#pragma vector = P1INT_VECTOR__interrupt void P1_ISR(void)
{
int timer_temp = 0;
char datestatus = 0;
if(P1IFG & SPI_CLOCK_PIN){
#if 0 timer_temp = gTimer3_Ms -gLast_timer;
if( (timer_temp < SPI_DATA_INTERVAL_MIN) || (timer_temp > SPI_DATA_INTERVAL_MAX)){
/*中断时间不符合SPI DATA时间间隔*/
memset(gSPIRxDate, 0, sizeof(gSPIRxDate));
timer_temp = 0;
gDatabitNum = 0;
}else{
if(P1 & SPI_DATA_PIN){
datestatus = 1;
#if 0 if(gDatabitNum < SPI_DATE_BIT_NUM){
if(gDatabitNum < 8){
gSPIRxDate[0] = gSPIRxDate[0] |(1<<gDatabitNum);
}else if(gDatabitNum < 16){
gSPIRxDate[1] = gSPIRxDate[1] |(1<<(gDatabitNum – 8));
}else if(gDatabitNum < 24){
gSPIRxDate[2] = gSPIRxDate[2] |(1<<(gDatabitNum – 16));
}else if(gDatabitNum < 32){
gSPIRxDate[3] = gSPIRxDate[3] |(1<<(gDatabitNum – 24));
}else{
gSPIRxDate[4] = gSPIRxDate[4] |(1<<(gDatabitNum – 32));
}
}
#endif
}else{
datestatus = 0;
} gDatabitNum++;
}
gLast_timer = gTimer3_Ms;
#else LED_Test_EN++; if(LED_Test_EN%10){
HalLedSet(HAL_LED_1, HAL_LED_MODE_OFF );
} else{
HalLedSet(HAL_LED_1, HAL_LED_MODE_ON );
}
if(LED_Test_EN>1000){
LED_Test_EN =0;
}
#endif
}
P1IFG &= ~SPI_CLOCK_PIN; //清中断标志 P1IF &= ~SPI_CLOCK_PIN; //清中断标志}#endif
cedar_xuesong:
检查下是不是ISR优先级问题