This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
//***************************************************************************//
//
// 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,但是确实可以再次进入到边沿中断中。
进入到中断服务中后,GIE会自动清零吗?
是的。这是为了防止中断嵌套。
为什么观测不到GIE位恢复位1呢?
一般来说应该能观测到的,退出中断后,回到LPM语句,此时应该能观测到。
#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断点处
以上是我调试的两种情况
代码还是能执行到timer中断中,这个我不理解。因为第一次进入到中断函数中,在退出中断前,我已经将timer停止了,即TA0CTL = MC_0语句,而且从TA0CTL寄存器看,模式确实不是0,还是之前的上计数模式,请问这是问什么呢?
如果你继续点击resume呢?看起来这条语句似乎被忽略了。
代码也不会再次执行到main函数中的LPM3断点处
如果你继续点击step into 代码应该会停在LPM语句,对吗?