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.

[参考译文] MSP 低功耗微控制器论坛

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1480927/msp-low-power-microcontroller-forum

器件型号:MSP430FR2476

工具与软件:

您好!

我想使用计时器 A3.0作为 PWM 输出。 为此、我定义了以下内容:

void pwmTempLuefter(real outpwm) {
  
    real vCCR0;

    P4DIR  |= BIT1;                           
    P4SEL0 |= BIT1; 

    PM5CTL0 |=LOCKLPM5;
     
    vCCR0 = 65500;
    TA3CCR0 = (uint16)vCCR0;                       
    TA3CCTL1 = OUTMOD_6;                      // CCR1 reset/set
    TA3CCR1 = (uint16)(vCCR0*outpwm);         // CCR1 PWM duty cycle
    TA3CTL |= TASSEL__SMCLK | MC_3 | ID_3 | TACLR;//  |TAIE; 

  
}

例如、TIMERB0上的 PWM 正常工作。 计时器 A3.0有何不同?

有人能在这里帮助我吗?

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

    "输出模式2、3、6和7对输出单元0来说是无用的、因为 EQUn = EQU0。"

    但是、虽然您配置的引脚用于 A3.0、但您配置的输出单元用于 A3.1。

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

    尊敬的 David:

    首先,非常感谢你的答复。
    您说我为3.1定义了 PWM。 不知怎么地、我无法在我的思维中看到错误。 它应该如何正确? 提前感谢。

    此致

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

    > TA3CCTL1 = OUTMOD_6;// CCR1复位/设置

    OUTMOD 是生成输出信号的源、按照编码、它在 TA3.1 (CCR1/CCTL1)(在 P4.0而非 P4.1上)上实现该功能。

    最简单的补救方法是切换到使用 P4.0 (P4DIR/P4SEL/接线)。  

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

    您好!

    这是否意味着、如果我写入 TA3CCTL0 = OUTMOD_6、则该值会在 TA3.0上输出?

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

    您将获得输出、但它不会很有趣(常量)。 正如 David 在《用户指南》中引用的(上述)所指出的那样、tax.0对于(可变) PWM 没有用处。 它可以生成50%的占空比(OUTMOD=4)、仅此而已。

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

    您好!

    Danke zunächst für ñ a Die Antwort. Dann sollte ich 也是一个 TA3.2 DIE PWM ausgeben。 ICH würde è s es Dann wie foldg umsetzen:

    void pwmTempLuefter(float outpwm) {
      
        float vCCR0;
        
        P3DIR |= BIT7;
        P3SELC |=BIT7;
        
        PMM_unlockLPM5();
    
        vCCR0 = 65500;
        TA3CCR1 = (uint16_t)vCCR0;                       
        TA3CCTL2 = OUTMOD_6;                      // CCR1 reset/set
        TA3CCR2 = (uint16_t)(vCCR0*outpwm);         // CCR1 PWM duty cycle
        TA3CTL |= TASSEL__SMCLK | MC_3 | ID_3 | TACLR ;
    
        
      
    }

    "怎么样?

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

    对不起她的英语,

    您好!

    感谢您的回答。 然后我应将 PWM 输出到 TA3.2。 然后、我将按以下方式执行:

    void pwmTempLuefter(float outpwm) {
      
        float vCCR0;
        
        P3DIR |= BIT7;
        P3SELC |=BIT7;
        
        PMM_unlockLPM5();
    
        vCCR0 = 65500;
        TA3CCR1 = (uint16_t)vCCR0;                       
        TA3CCTL2 = OUTMOD_6;                      // CCR1 reset/set
        TA3CCR2 = (uint16_t)(vCCR0*outpwm);         // CCR1 PWM duty cycle
        TA3CTL |= TASSEL__SMCLK | MC_3 | ID_3 | TACLR ;
    
        
      
    }

    我是否理解正确?

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

    是的、这是一般想法。

    OUTMOD=6实际上是切换/置位、而不是复位/置位。 这两者是相同的、从第二个周期开始。

    ---

    未经请求:

    > P3SELC |=BIT7;

    我很确定这将在您希望 PSEL=01时设置 PSEL=11。 我建议您坚持:

    > P3SEL0 |=BIT7;

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

    早上好、

    感谢您发送编修。
    尽管进行了更改、但仍然没有获得适当的 PWM。 对于 MSP430FR2476 40引脚外壳、还有其他需要考虑的因素吗? (Re 映射或类似工具)。
    我现在还有另一个‘问题'端口3.0和3.3无法切换。 是否有任何限制? 例如、我已经看到、P3.0在开发底板上完全没有引出。

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

    您在 P3.7上看到了什么? [悬空? 卡在0? 卡在1?] 我建议您使用调试器["寄存器"视图]来查看 TA3CCR0和 TA3CCR2中实际上包含的内容。 P3.7是 TA3.2的未重新映射目标[参考数据表(SLASEO7C)表9-16]。 (我认为这就是你选择它的原因。)

    您如何切换 P3.0/.3? 您在引脚上看到了什么?

    未经请求:  

    > PMM_unlockLPM5();

    我建议您将其移至 main ()。 这并不是说这不起作用、而是对错误的邀请、因为在你调用此函数之前、你真的不能信任任何 GPIO、并且系统的所有其他部分都需要知道这一点。

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

    您好!

    首先、端口3.0/3.3按如下方式初始化:

    #include <msp430.h>
    #include "driverlib.h"
    #include "global.h"
    
    vInitSystem(){
    
        WDT_A_hold(WDT_A_BASE);    
        
        initClock();
      
        initGPIO();
    }
    
    void initClock(){
    
      CS_initClockSignal( CS_FLLREF, CS_REFOCLK_SELECT, CS_CLOCK_DIVIDER_1 );
      CS_initClockSignal( CS_ACLK,   CS_REFOCLK_SELECT, CS_CLOCK_DIVIDER_1 );
        
      CS_initFLLParam param = {0};
        
      CS_initFLLCalculateTrim( CS_MCLK_DESIRED_FREQ_IN_KHZ, CS_MCLK_FLLREF_RATIO, &param );
      CS_clearAllOscFlagsWithTimeout(1000);
    
      SFR_enableInterrupt(SFR_OSCILLATOR_FAULT_INTERRUPT);
      
    
       _NOP();
      
    }
    
    void initGPIO(){
    
         P3DIR  |= BIT3; 
         PM5CTL0 &= ~LOCKLPM5;
    
    }

    主程序如下所示:

    #include <msp430.h>
    #include "driverlib.h"
    #include "global.h"
    
    void main(){
      
      WDT_A_hold(WDT_A_BASE);
      
      initSystem();
      
       while(1){
       
         _NOP();
         
         TogglePort3();
         delay_ms(250);
         
       }
    }
    
    // ------------------------------------------------------------------------------------------
    void TogglePort3(){
    
      P3OUT ^= BIT3;
      
    
    }
    // ------------------------------------------------------------------------------------------
    void delay_ms(const uint32_t delay_time_ms){
      
      const uint32_t cycles_per_loop = 8;
      
        uint32_t delayTime = CS_getSMCLK() / (cycles_per_loop * 1000u ) ;
        delayTime = delayTime * delay_time_ms;
           
        do{
          __delay_cycles(1);
          
        }while(--delayTime > 0);
    }

    寄存器中也可以看到切换操作、但示波器上的线始终保持为高电平。 该引脚通过一个上拉电阻器进行连接。 它应该实际工作(就像它以前在其他项目中多次工作一样)。

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

    我没有看到您描述的在 Launchpad 上运行此代码的行为。  我的示波器在 P3.3上看到~2Hz 方波。

    我合并了两个片段,并编辑最少,以使它构建。 我在 P3.3上放置1K 到3.3V。  

    我不确定我们的做法有何不同。

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

    早上好、

    嗯、我想它可以是我的电路板。 我在项目中使用了许多其他功能(I2C、RS485等)。 这是一个非常复杂的项目,我可以想象有很多互动。 当然、我已经将我的示例写在一个单独的项目中、但电路保持不变。 我几乎不能想象任何其他东西。
    我要非常感谢你的支持。 很高兴能够与他人交流想法。 我祝愿你和在这里作出贡献的每个人都有一个美好的星期。