TI中文支持网
TI专业的中文技术问题搜集分享网站

MSP430F5438A: 关于GIE的疑问

Part Number:MSP430F5438AOther Parts Discussed in Thread:MSP-FET430UIF

//***************************************************************************//
//
// Main Function
//
//***************************************************************************//
void main( void )
{
WDTCTL = WDTPW + WDTHOLD;
//PMM_CFG();
Init_CLK();
Init_Port();
Init_Timer0_A5();

Init_Timer0_A5_CCTL0();
Init_Timer0_A5_CCTL1();

TA0CTL |= MC__CONTINUOUS; // Continuous mode: Timer counts up to 0FFFFh
_EINT();

LPM4;
}

代码如上,在进入LPM前,使能了中断,即将GIE设置为1,在CCS调试环境种可以观测到SR寄存器中GIE位变为1

问题1. 进入到中断服务中后,GIE会自动清零吗?从调试情况看,是这样的,不过我在SLAU208Q中没有找到相关说明。

问题2.按照这里的描述,退出中断会恢复SR之前的设定值,我在单步调试的时候,执行完中断,为什么观测不到GIE位恢复位1呢?

我的工程是捕获脉冲边沿,虽然观测不到GIE恢复为1,但是确实可以再次进入到边沿中断中。

Ben Qin:

user78960159 说:进入到中断服务中后,GIE会自动清零吗?

是的。这是为了防止中断嵌套。

user78960159 说:为什么观测不到GIE位恢复位1呢?

一般来说应该能观测到的,退出中断后,回到LPM语句,此时应该能观测到。

,

Ben Qin:

你好,请问您的问题解决了吗?

,

user78960159:

#include "msp430x54x.h"#include <stdlib.h>#include <stdio.h>#include "PIN_DEF.H"

#pragma vector=TIMER0_A0_VECTOR __interrupt void Timer0_A0 (void){ P1OUT ^= 0xF0 ; P9OUT ^= 0x0F ; TA0CCR0 = (16000) – 1 ; TA0CTL = MC_0;}

//***************************************************************************//// ////函数:Init_CLK(void) ////功能:初始化主时钟: MCLK = XT2 //// ////***************************************************************************//void Init_CLK(void){ WDTCTL = WDTPW + WDTHOLD ; // 关看门狗 P5SEL |= 0x0C ; // 端口功能选择振荡器 UCSCTL6 &= ~XT2OFF ; // 振荡器使能 UCSCTL3 |= SELREF_2 ; // FLLref = REFO UCSCTL4 |= SELA_2 ; // ACLK=REFO,SMCLK=DCO,MCLK=DCO do { UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG); // 清除 XT2,XT1,DCO 错误标志 SFRIFG1 &= ~OFIFG ; }while(SFRIFG1&OFIFG) ; // 检测振荡器错误标志 UCSCTL6 |= XT2DRIVE0 + XT2DRIVE1 ; // XT2 驱动模式 24~32MHz UCSCTL4 |= SELS_5 + SELM_5 ; // SMCLK = MCLK = XT2}

//***************************************************************************//// //// Init_Port(void): 设置IO端口 //// ////***************************************************************************//void Init_Port(void){ P5DIR |= POWER ; // 主电源 MAIN_POWER_OFF ; P7DIR |= LED_PWR ; // 发光二极管电源 P7OUT &=~LED_PWR ; P1OUT = 0xF0 ; // 设置LED控制端IO属性 P1DIR = 0xF0 ; P9OUT = 0x0F ; P9DIR = 0x0F ;}

//***************************************************************************//// //// Init_TimerA0(void): 设置TimerA0 //// ////***************************************************************************//void Init_Timer0_A5(void){ TA0CTL = 0 // 复位Timer0_A5, 分频系数设置为1 | (1 << 2) // 计数器清0 | (2 << 8) ; // 计数时钟设为SMCLK ; TA0CCR0 = 16000 – 1 ; // SMCK=EX2=16MHz,设置计数器溢出时间为1ms TA0CCTL0 = 0 // 初始化捕获控制 | (1 << 4) ; // 使能比较中断 TA0CTL |= (1 << 4) ; // 设置计数器为加计数,启动}

//***************************************************************************//// //// 主程序: 初始化时钟、端口和定时器 //// ////***************************************************************************//void main( void ){ WDTCTL = WDTPW + WDTHOLD ; // 关闭看门狗 Init_CLK() ; Init_Port() ; Init_Timer0_A5() ; _EINT() ; LPM3 ;}

以上为全部代码;CCS版本Version: 11.1.0.00011;仿真器MSP-FET430UIF

在main函数的LPM3语句初设置断点;在timer0中断函数TA0CTL = MC_0;语句出设置断点

调试情况1

第一次点击Resume 

可以看到GIE变为1;

第二次点击Resume

可以看到进入到中断处理函数,GIE变为0;

第三次点击Resume

之后再观测观测窗口滚动鼠标滚轮,当出现黄色背景数值时表示有数值变换后,代码会再次执行到Mian函数的LPM3断点处,同时可看到GIE变为1,

这个我能理解,我开启了以下功能

第四次点击Resume

代码还是能执行到timer中断中,这个我不理解。因为第一次进入到中断函数中,在退出中断前,我已经将timer停止了,即TA0CTL = MC_0语句,而且从TA0CTL寄存器看,模式确实不是0,还是之前的上计数模式,请问这是问什么呢?

调试情况2

如果在第一次进入到timer中断时,进行单步操作,即Step Into,当执行TA0CTL = MC_0;后,计数器模式就为0了,停止计数,这时观测变量窗口,滚动鼠标,出现黄色背景变量,代码也不会再次执行到main函数中的LPM3断点处

以上是我调试的两种情况

,

Ben Qin:

user78960159 说:代码还是能执行到timer中断中,这个我不理解。因为第一次进入到中断函数中,在退出中断前,我已经将timer停止了,即TA0CTL = MC_0语句,而且从TA0CTL寄存器看,模式确实不是0,还是之前的上计数模式,请问这是问什么呢?

如果你继续点击resume呢?看起来这条语句似乎被忽略了。

user78960159 说:代码也不会再次执行到main函数中的LPM3断点处

如果你继续点击step into 代码应该会停在LPM语句,对吗?

赞(0)
未经允许不得转载:TI中文支持网 » MSP430F5438A: 关于GIE的疑问
分享到: 更多 (0)

© 2024 TI中文支持网   网站地图 鲁ICP备2022002796号-1