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.

LED翻转测试输出的脉冲宽度不一致时什么原因?



代码:

#include <msp430.h>

int main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
BCSCTL1 |= XTS;
P3DIR |= 0x20; // P1.0 output
CCTL0 = CCIE; // CCR0 interrupt enabled
CCR0 = 1000;
//TACTL = TASSEL_2 + MC_2; // SMCLK, contmode
TACTL = TASSEL_1 + MC_1;

__bis_SR_register(LPM0_bits + GIE); // Enter LPM0 w/ interrupt
}

// Timer A0 interrupt service routine
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(TIMERA0_VECTOR))) Timer_A (void)
#else
#error Compiler not supported!
#endif
{
P3OUT ^= 0x20; // Toggle P1.0
CCR0 += 1000; // Add Offset to CCR0
}

  • CCR0 += 1000; // Add Offset to CCR0


    增加了周期的数值,宽度肯定会增加,直到CCR0数据溢出

  • john sue 说:

    代码:

    #include <msp430.h>

    int main(void)
    {
    WDTCTL = WDTPW + WDTHOLD; // Stop WDT
    BCSCTL1 |= XTS;
    P3DIR |= 0x20; // P1.0 output
    CCTL0 = CCIE; // CCR0 interrupt enabled
    CCR0 = 1000;
    //TACTL = TASSEL_2 + MC_2; // SMCLK, contmode
    TACTL = TASSEL_1 + MC_1;

    __bis_SR_register(LPM0_bits + GIE); // Enter LPM0 w/ interrupt
    }

    // Timer A0 interrupt service routine
    #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
    #pragma vector=TIMERA0_VECTOR
    __interrupt void Timer_A (void)
    #elif defined(__GNUC__)
    void __attribute__ ((interrupt(TIMERA0_VECTOR))) Timer_A (void)
    #else
    #error Compiler not supported!
    #endif
    {
    P3OUT ^= 0x20; // Toggle P1.0
    CCR0 += 1000; // Add Offset to CCR0
    }

    两种解决方案:

    1. TACTL = TASSEL_2 + MC_2; // SMCLK, contmode 

    中断里 

    P3OUT ^= 0x20; // Toggle P1.0
    CCR0 += 1000; // Add Offset to CCR0

    2.TACTL = TASSEL_1 + MC_1; 

    中断里

    P3OUT ^= 0x20; // Toggle P1.0