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.

[参考译文] CCS/MSP430FR5994:仅生成两个脉冲。

Guru**** 2587345 points
Other Parts Discussed in Thread: MSP430FR5994

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/827274/ccs-msp430fr5994-generate-only-two-pulses

器件型号:MSP430FR5994

工具/软件:Code Composer Studio

您好!

今天、我一直在使用 MSP430FR5994 Launchpad 仅生成两个脉冲。 无需重复脉冲。 现在、我可以在 P3.5上生成重复 PWM、而不会出现任何问题。 以下是代码:

#include
void main (void)

WDTCTL = WDTPW | WDTHOLD;//停止 WDT

//配置 GPIO
P3DIR |= BIT4 | BIT4;// P3.5和 P3.6输出
P3SEL0 |= BIT4 | BIT5;// P3.5和 P3.6选项选择
P3SEL1 &=~(BIT4 | BIT5);

//禁用 GPIO 上电默认高阻抗模式以激活
//先前配置的端口设置
PM5CTL0 &=~LOCKLPM5;

TB0CCR0 = 1000-1;// PWM 周期
TB0CCTL4 = OUTMOD_7;// CCR4复位/置位
TB0CCR4 = 750;// CCR4 PWM 占空比
TB0CTL = TBSSEL_SMCLK | MC__UP | TBCLR;// SMCLK、向上计数模式、清除 TBR

_bis_SR_register (LPM0_bits);//输入 LPM0
// while (1);

以下是我尝试仅生成两个脉冲但失败的情况:

我已经使用中断来强制将 TB0CCR0置为零。 但它不起作用。 它仍然输出连续重复 PWM 波形。

2.我已经使用中断将 CCR4更改为不同的值。 可以更改占空比、但脉冲仍然重复出现。

3.我还在 main()函数中用于()循环,以便在 Pin3.5中只生成两个脉冲,但根本不生成波形。

如果可以、请查看并发送一些有用的建议。 非常感谢。

谢谢、

ZE

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

    更新:

    这是我感到厌烦的另一种方式。 但我失败了。 我意识到 CCR0和 CCR1的优先级远远高于 while ()或 for ()或 if……else...

    代码如下:

    #include

    volatile unsigned int i;

    int main (空)

    WDTCTL = WDTPW | WDTHOLD;//停止 WDT

    //配置 GPIO
    P3DIR |= BIT4 | BIT4;// P3.5和 P3.6输出
    P3SEL0 |= BIT4 | BIT5;// P3.5和 P3.6选项选择
    P3SEL1 &=~(BIT4 | BIT5);

    //禁用 GPIO 上电默认高阻抗模式以激活
    //先前配置的端口设置
    PM5CTL0 &=~LOCKLPM5;

    while (I < 4)

    TB0CCR0 = 1000-1;// PWM 周期
    TB0CCTL4 = OUTMOD_7;// CCR4复位/置位
    TB0CCR4 = 750;// CCR4 PWM 占空比
    TB0CTL = TBSSEL_SMCLK | MC__UP | TBCLR;// SMCLK、向上计数模式、清除 TBR
    I ++;

    如果(I >=4)
    P3OUT &=~BIT0;

    我们非常感谢您的任何建议。

    谢谢。

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

    嘿、Ze、

    您是否正在使用计时器中断来尝试和停止脉冲?  您可以共享该软件吗?  

    对我来说、这似乎是实现这一目标的最佳方式。   

    我还建议设置计时器模式、MC = 00、以停止和停止计时器。  

    请尝试一下、并让我知道它是如何运行的。   

    谢谢、

    JD

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

    你好,JD

    感谢您回复我的帖子。 我使用了中断来尝试、但它不起作用。 下面是我尝试使用的代码。

    CCR 寄存器的优先级似乎高于中断。 我只能得到重复的连续 PWM 波形。

    在我的情况下、MC 不能更改。 显示 MC 不可修改。

    第一次尝试

    #include "msp430.h"
    #ifndef TIMER0_B0_VECTOR
    #define TIMER0_A1_VECTOR TIMERRA1_VECTOR
    #define TIMER0_A0_VECTOR TIMER0_VECTOR
    #define TIMER0_B0_VECTOR TIMERB0_VECTOR
    #define TIMER0_B1_VECTOR TIMERB1_VECTOR

    #endif

    volatile unsigned int i;
    int j = 0;

    void main (void)


    WDTCTL = WDTPW + WDTHOLD;//停止看门狗计时器

    //P1DIR&=~BIT3;
    // ConfigTimerA2();

    // P3OUT &= 0x00;//关闭所有内容。 清除 Port1输出寄存器
    // P3DIR &= 0x00;//清除方向寄存器
    // P1DIR |= BIT0 + BIT6;// P1.0和 P1.6引脚输出其余为输入
    P3DIR|= BIT4;// P1.0引脚输出其余为输入
    P3REN |= BIT4;//启用内部上拉/下拉电阻器
    P3OUT |= BIT4;//为 P1.3选择上拉模式

    P3IE |= BIT4;// P1.3中断被启用
    P3IES |= BIT4;// P1.3高/低边沿
    P3IFG &=~BIT4;// P1.3 IFG 被清零

    CSCTL0_H = CSKKEY_H;//解锁 CS 寄存器
    CSCTL1 = DCOFSEL_0;//将 DCO 设置为1MHz
    CSCTL2 = SELA_LFXTCLK | SELESS__DCOCLK | SELM_DCOCLK;//设置 ACLK = XT1;MCLK = DCO
    CSCTL3 = DIVA__1 | DIVM_1 | DIVM__1;//将所有分频器设置为1
    CSCTL4 &=~LFXTOFF;
    操作

    CSCTL5 &=~LFXTOFFG;//清除 XT1故障标志
    SFRIFG1 &=~OFIFG;
    } while (SFRIFG1 & OFIFG);//测试振荡器故障标志
    CSCTL0_H = 0;


    TB0CCTL0 = CCIE;// TBCCR0中断被使能
    TB0CCR0 = 50000;
    TB0CTL = TBSSEL_ACLK | MC__UP;// ACLK、UP 模式

    _BIS_SR (LPM3_BITS | GIE);//输入 LPM0、带中断。 关闭 CPU 以在保持中断被启用的同时提供一些电源

    //端口1中断服务例程
    #pragma vector = TIMER0_B0_vector
    _interrupt void Timer0_B0_ISR (void)


    for (i = 7;i > 0;i-)//7 -> 109us

    P3OUT ^= BIT4;

    对于(j = 0;j < 10;j++)

    P3OUT = 0x00 + BIT4;//3 -> 50us

    P3IFG &=~BIT4;// P1.3 IFG 被清零

    第二次尝试

    #include
    #include

    void main (void)

    WDTCTL = WDTPW | WDTHOLD;//停止 WDT

    //配置 GPIO
    P3DIR |= BIT4 | BIT4;// P3.5和 P3.6输出
    P3SEL0 |= BIT4 | BIT5;// P3.5和 P3.6选项选择
    P3SEL1 &=~(BIT4 | BIT5);

    //禁用 GPIO 上电默认高阻抗模式以激活
    //先前配置的端口设置
    PM5CTL0 &=~LOCKLPM5;

    TB0CCR0 = 1000-1;// PWM 周期
    TB0CCTL4 = OUTMOD_7;// CCR2复位/置位
    TB0CCR4 = 750;// CCR2 PWM 占空比
    TB0CTL = TBSSEL_SMCLK | MC__UP | TBCLR;// SMCLK、向上计数模式、清除 TBR

    如果(TB0R > 10)
    P3OUT = 0x08;

    _bis_SR_register (LPM0_bits);//输入 LPM0
    // while (1);

    #pragma vector=TIMER0_B1_vector
    _interrupt void Timer0_B1_ISR (void)

    静态 uint16_t 计数器= 0;
    TB0CTL &=~TBIFG;//清除中断标志

    if (++计数器<= 500)

    TB0CCR5 -= 50;

    if (TB0CCR5 =0)  
    计数器= 0;//复位计数器

    第三次尝试

    #include

    int main (空)

    WDTCTL = WDTPW | WDTHOLD;//停止 WDT

    //配置 GPIO
    P1DIR |= BIT4 | BIT4;// P3.5和 P3.6输出
    P1SEL0 |= BIT4 | BIT4;// P3.5和 P3.6选项选择
    P1SEL1 &=~(BIT4 | BIT5);

    //禁用 GPIO 上电默认高阻抗模式以激活
    //先前配置的端口设置
    PM5CTL0 &=~LOCKLPM5;

    TB0CCR0 = 100-1;// PWM 周期
    TB0CCTL1 = OUTMOD_7;// CCR1复位/置位
    TB0CCR1 = 75;// CCR1 PWM 占空比
    TB0CCTL2 = OUTMOD_7;// CCR2复位/置位
    TB0CCR2 = 25;// CCR2 PWM 占空比
    TB0CTL = TBSSEL_SMCLK | MC__UP | TBCLR | TBIE;// SMCLK、向上计数模式、清除 TBR
    _bis_SR_register (LPM0_Bits | GIE);//输入 LPM0

    #pragma vector=Port1_vector
    _interrupt void Port_1 (void)

    TB0CCTL1 = 0x0000;
    TB0CCTL2 = 0x0000;
    P1IFG &=~BIT4;// P1.4 IFG 被清零

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

    您好、Ze、

    您需要像在#2中尝试的那样使用计时器中断、但在 ISR 内部、您需要关闭计时器。  同样、我要通过将计时器设置为停止模式来实现此目的。  

    下面是一个非常基本的 TimerB 示例、它只是切换 ISR 内的 P1.0 GPIO。  如果将此行添加到 ISR、则只能看到 GPIO 切换一次。   

    TB0CTL = MC__STOP; 

    假设这对您有效、那么您只需向其添加全局计数、即可在第2个脉冲上停止计数。   

    谢谢、

    JD