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.

msp430g2452

Other Parts Discussed in Thread: MSP430G2452

CCRO与CCR1的区别,一个定时器不是只能装载一个初值吗,msp430的设置里的CCR1,又有什么用呢,同时设置了CCR0和CCR1,可不可以。我的理解是CCRO处定时器中断一下,CCR1处定时器中断一下,从而达到一个定时器,可以做两个不一样的中断。但是中断服务程序的中断变量,又是属于哪一个?

  • jiayuan song,

    MSP430G2452只有一个Timer-A, 但此Timer_A有3个可配置的 capture/compare registers。 

    即如果是用作定时器,一般是工作在Capture mode,可以最多同时支持3路定时器.

    关于中断向量,CCR0单独对应一个中断向量,其他CCIFG flags and TAIFG 共享一个中断向量。需要在其中断程序里通过判断Flag位来确认共享中断发生时是哪个flag引起的,再做对应的处理。

    具体程序,你可以参考一下MSP430G2452 code example看一下。

    CCR0中断向量服务程序:

    // Timer A0 interrupt service routine
    #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
    #pragma vector=TIMER0_A0_VECTOR
    __interrupt void Timer_A (void)

    CCR1和其他中断对应的中断向量服务程序:

    // Timer_A3 Interrupt Vector (TA0IV) handler
    #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
    #pragma vector=TIMER0_A1_VECTOR
    __interrupt void Timer_A(void)
    #elif defined(__GNUC__)
    void __attribute__ ((interrupt(TIMER0_A1_VECTOR))) Timer_A (void)
    #else
    #error Compiler not supported!
    #endif
    {
    switch( TA0IV )
    {
    case 2: // CCR1
    {
    P1OUT ^= 0x01; // Toggle P1.0
    CCR1 += 50000; // Add Offset to CCR1
    }
    break;
    case 4: break; // CCR2 not used
    case 10: break; // overflow not used
    }
    }