微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI蓝牙设计交流 > CC2541 IO P1.3中断产生会影响Timer3,为什么?谢谢各位大神.....

CC2541 IO P1.3中断产生会影响Timer3,为什么?谢谢各位大神.....

时间:10-02 整理:3721RD 点击:

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

检查下是不是ISR优先级问题

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top