本帖最后由 helloxieyu 于 2015-4-10 16:05 编辑
//下面是TIMERA连续计数方式产生中断的例子,
//TACCTL0 |=CCIE; //开启CCR0中断,将进入TIMER0_A0_VECTOR中断向量,示波器测量P1.1管脚输出,周期为1秒左右
//TACCTL1 |=CCIE; //开启CCR1中断,将进入TIMER0_A1_VECTOR中断向量,示波器测量P1.1管脚输出,周期为33.5K秒左右
//问题:为什么同一个时钟配置方式,产生的中断频率会不一样呢?
int main( void )
{
WDTCTL = WDTPW +WDTHOLD;
BCSCTL1 = CALBC1_1MHZ;
DCOCTL = CALDCO_1MHZ;
P1REN|=BIT1;
P1DIR|=BIT1;
BCSCTL2 = DIVS0; //SMCLK除2
TA0CTL=TASSEL1+MC1+ TACLR+ID0+ID1; //选择SMCLK进来后再8分频,连续计数模式,
// TACCTL0 |=CCIE; //开启CCR0中断,将进入TIMER0_A0_VECTOR中断向量,示波器测量P1.1管脚输出,周期为1秒左右
TACCTL1 |=CCIE; //开启CCR1中断,将进入TIMER0_A1_VECTOR中断向量,示波器测量P1.1管脚输出,周期为33.5K秒左右
_EINT(); //使能中断,开始记录......
while(1)
{
_BIS_SR(LPM1_bits+GIE); //进入LPM1
}
return 0;
}
#pragma vector = TIMER0_A0_VECTOR
__interrupt void Timer_A0_ISR(void)
{
P1OUT=(~P1OUT);
}
#pragma vector = TIMER0_A1_VECTOR
__interrupt void Timer_A1_ISR(void)
{
P1OUT=(~P1OUT);
}
此帖出自
小平头技术问答
关键应该在这句
我翻译一下:
TASSEL1——ACLK
MC1——The timer repeatedly counts from zero to the value of TACCR0.
TACLR——Timer_A clear. Setting this bit resets TAR, the clock divider, and the count direction. The TACLR bit is automatically reset and is always read as zero.
ID0+ID1——=ID1,2分频
感觉你需要的应该是
TA0CTL=TASSEL2+MC2+ TACLR+ID3; //选择SMCLK进来后再8分频,连续计数模式,
于是乎,你的程序貌似完全错了。你的单片机工作在ACLK下,也就是33k的时钟频率下(32768低速晶振或者VLO),并且定时器工作在UP模式,在该模式下中断向量TIMER0_A1_VECTOR貌似是不生效的,但不知道你为何强行使能了这一中断,于是每个时钟周期都进入中断一次,将IO翻转来。
如果你使用TIMER0_A0_VECTOR这一中断向量,那么定时器从0开始计数,至TACCR0后触发中断翻转IO,同时计数器清零。但是,貌似你在程序里没有配置TACCR0的值,所以定时周期才会那么怪异,估计是直接0xffff了,周期大概2秒。
一周热门 更多>