用1M的DCO时钟通过TIMER A产生1秒左右的中断,为何用CCR0能成功,用CCR1就不行了呢?

2019-03-24 09:40发布

本帖最后由 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);
}    此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
7条回答
qiushenghua
2019-03-25 09:54
helloxieyu 发表于 2015-4-11 11:07
首先要感谢“qiushenghua”大大对我的帮助,您已经不止一次不厌其烦的帮我分析解决问题了,谢谢。
============================================================
1. 在代码里的TASSEL1的值是0x0200即bit9位等于1,即选择的是SMCLK,这个是没有问题的。
2. 在代码里的ID0+ID1=0x0040+0x0080,即bit6与bit7位都是1,即输入时钟为8分频,这个也是没有问题的。
3. 我上面的代码如果改成:
    TACCTL0 |=CCIE; //开启CCR0中断,将进入TIMER0_A0_VECTOR中断向量,
    //TACCTL1 |=CCIE;  
   这样是完全正常的,示波器测量P1.1管脚输出,周期为1秒左右;
4. 这就足以证明我上面的1,2点是对时钟的选择即分频的选择是完全正确的了。

确实是我搞错了,ID0+ID1和ID_3其实是相等的,你用的是寄存器的写法,我用的是赋值的写法。很久没用430写东西,语法都快忘记了,以为用的是枚举变量,实际上配置的是寄存器地址。






一周热门 更多>

相关问题

    相关文章