首页 > 解决方案 > 在 UP 模式和 OUTMOD_7 信号中使用 TimerA 生成 3 个频率为 2 kHz 且占空比为 P1.4 10% 和 P1.3 30% 和 P1.2 60% 的 PWM 信号

问题描述

我正在使用 MSP430F5529 开发板,一个创建的 PCB 和 CCS 进行编程。我的代码如下:

#include <msp430.h>


int main(void)
{
   
    WDTCTL = WDTPW | WDTHOLD;       //stop watchdog timer
    
    P1SEL |= BIT2;                  //configure P1.2 as TA0.2
    P1DIR |= BIT2;                  //P1.2 is output (compare mode)
    P1SEL |= BIT3;                  //configure P1.3 as TA0.3
    P1DIR |= BIT3;                  //P1.3 is output (compare mode)
    P1SEL |= BIT4;                  //configure P1.4 as TA0.4
    P1DIR |= BIT4;                  //P1.4 is output (compare mode)

    TA0CCR0 = 999;                  //CCR0 is used to generate the desired period
    TA0CCR2 = 599;                  //CCR2 is used to generate 0.60 duty cycle
    TA0CCR3 = 299;                  //CCR3 is used to generate 0.30 duty cycle
    TA0CCR4 = 99;                   //CCR4 is used to generate 0.10 duty cycle


    TA0CCTL2 = OUTMOD_7;            //PWM 2
    TA0CCTL3 = OUTMOD_7;            //PWM 3
    TA0CCTL4 = OUTMOD_7;            //PWM 4

    TA0CTL = MC_1 + TASSEL_2 + TACLR|ID_2;
    _BIS_SR(LPM0_bits+GIE);
}

使用此代码没有一个 LED 亮起,我不确定如何修复它。

标签: cembedded

解决方案


您在裸机 MCU 程序中从 main() 返回,因此它会在有机会做任何有意义的事情之前崩溃并烧毁。

在独立程序中编写 main() 的最常见方法是:

void main (void)
{
   ...

   for(;;)
   { 
     // kick watchdog here
     ...
   }
}

值得注意的是,这永远不会从 main() 返回,而是停留在“永远”循环中。

void main (void)是每个嵌入式系统编译器都支持的实现定义的形式。(要在 gcc 上使用这种形式,您必须使用 . 进行编译-ffreestanding。)


推荐阅读