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.

[参考译文] MSP430F5529:PWM/定时器中断代码不工作

Guru**** 2484615 points
Other Parts Discussed in Thread: MSP430F5529

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1235058/msp430f5529-pwm-timer-interrupt-code-not-working

器件型号:MSP430F5529

根据下面的代码、目标是根据计时器配置函数串联产生蜂鸣声。 第一个值是计时器周期、然后是占空比、第三个值是要产生的蜂鸣声数量。

因此、根据现有函数、将计时器周期设置为32768、占空比为16384、蜂鸣次数为4。 但代码在我的 MSP430F5529 LP 上没有按预期运行。

#include <driverlib.h>

//Tested on MSP430F5529LP

int tCount; dutyCycle;
int beepCount; int counter; int newDutyCycle;
int countval = 0; int

void init();
int timer_config(int newPeriod, int newDutyCycle, int beep);
void stop_timer();

void main(){

    init();
    timer_config(32768,16384, 4);             //Configure timer

    while(1){
    }

    __bis_SR_register(LPM0 + GIE); //Enter Low Power Mode
    __no_operation();           //Enter Debugger Mode
}

void init() {

    WDT_A_hold(WDT_A_BASE);     //Stop Watchdog Timer

    GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P2, GPIO_PIN0); //Set Pin 2.0 as output pin

    //Configure Timer
    Timer_A_initUpModeParam param = {0};
    param.clockSource = TIMER_A_CLOCKSOURCE_ACLK; // ~1045000Hz
    param.clockSourceDivider = TIMER_A_CLOCKSOURCE_DIVIDER_1; //~18660Hz
    param.timerPeriod = 32768;
    param.timerInterruptEnable_TAIE = TIMER_A_TAIE_INTERRUPT_DISABLE;
    param.captureCompareInterruptEnable_CCR0_CCIE = TIMER_A_CCIE_CCR0_INTERRUPT_ENABLE;
    param.timerClear = TIMER_A_DO_CLEAR;
    param.startTimer = false;
    Timer_A_initUpMode(TIMER_A1_BASE, &param);

    //Configure Capture Compare Register
    Timer_A_initCompareModeParam paramCCR1 = {0};
    paramCCR1.compareRegister = TIMER_A_CAPTURECOMPARE_REGISTER_1;
    paramCCR1.compareInterruptEnable = TIMER_A_CAPTURECOMPARE_INTERRUPT_ENABLE;
    paramCCR1.compareOutputMode = TIMER_A_OUTPUTMODE_RESET_SET;
    paramCCR1.compareValue = 16384;
    Timer_A_initCompareMode(TIMER_A1_BASE, &paramCCR1);
}

int timer_config(int newPeriod, int newDutyCycle, int beep){

    Timer_A_setCompareValue(TIMER_A1_BASE,
                                 TIMER_A_CAPTURECOMPARE_REGISTER_0,
                                 newPeriod);
    Timer_A_setCompareValue(TIMER_A1_BASE,
                                 TIMER_A_CAPTURECOMPARE_REGISTER_1,
                                 newDutyCycle);
    Timer_A_clear(TIMER_A1_BASE);
    Timer_A_startCounter(TIMER_A1_BASE, TIMER_A_UP_MODE);


    if (countval==beep)
    {
        countval==0;
        stop_timer();
    }
    }

void stop_timer(){
        Timer_A_stop(TIMER_A1_BASE);
        Timer_A_disableInterrupt(TIMER_A1_BASE);
    }

#pragma vector = TIMER1_A0_VECTOR
__interrupt void timer1_ISR(void) {
    GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN0);
    Timer_A_clearTimerInterrupt(TIMER_A1_BASE);
}

#pragma vector = TIMER1_A1_VECTOR
__interrupt void timer0_ISR(void) {
    switch(__even_in_range(TA0IV, TA0IV_TAIFG)) {
    case TA0IV_NONE: break;
    case TA0IV_TACCR1:
        GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN0);
        countval++;
        Timer_A_clearTimerInterrupt(TIMER_A1_BASE);
        break;
    case TA0IV_TACCR2: break;
    case TA0IV_TACCR3: break;
    case TA0IV_TACCR4: break;
    case TA0IV_5:      break;
    case TA0IV_6:      break;
    case TA0IV_TAIFG:  break;
    default: _never_executed();
    }
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Damilare:

    您的 PWM 生成的配置似乎不太奇怪。 为什么要设置两个通道、一个具有占空比、另一个具有周期。

    Timer_A_setCompareValue (TIMER_A1_BASE、TIMER_A_CAPTURECOMPARE_REGISTER_0、newPeriod);
    Timer_A_setCompareValue (TIMER_A1_BASE、TIMER_A_CAPTURECOMPARE_REGISTER_1、newDutyCycle);

    我想您应该参考以下代码示例、其中描述了如何在没有中断的情况下生成 PWM。 您可以为您自己的应用启用中断。

    Timer_A_Ex5_pwmMultipleUp.c

    B.R.

    萨尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、Sal、

    非常感谢您的建议、但我在编译过程中也查看了推荐的示例、它没有达到我的预期目标、因此我采用了自己的方法。

    所发现的两组通道用于接受新周期和传入计时器配置函数的新占空比。 目标是确保可以根据传递到函数中的参数设置占空比、周期和蜂鸣次数。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、Sal、

    非常感谢您的建议、但我在编译过程中也查看了推荐的示例、它没有达到我的预期目标、因此我采用了自己的方法。

    所发现的两组通道用于接受新周期和传入计时器配置函数的新占空比。 目标是确保可以根据传递到函数中的参数设置占空比、周期和蜂鸣次数。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Damilare:

    我建议您基于 CCS 调试代码、并且您先前提供的代码编写错误似乎很小。  

    您能否在 launchpad 或其他评估板中捕获并展示您的代码生成的 PWM 信号?

    至于更改周期和占空比、您不是  在我的角度中配置 PWM 的周期、而是只更改双通道的占空比、并保持周期不变。 在 timer_config ()中,您应该改变 param.timerPeriod ,然后 PWM 周期将更新。

    B.R.

    萨尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Sal、对不起出错了。 您可以删除代码第7行中的"int"。

    另外、对于您的建议、我也会在此处查看一下。

    谢谢你。