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.

[参考译文] MSP430FR4133:为 WS2812b LED 条生成1.25us 脉冲

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1194525/msp430fr4133-generating-a-1-25us-pulse-for-ws2812b-led-strip

器件型号:MSP430FR4133

我正在尝试编写 C 语言软件对 MSP430进行编程、以便为 WS2812b LED 条创建数据信号。 我需要使用需要1.25微秒周期的数据脉冲发送24位数据。 我尝试使用 SMCLK 创建这些文件、据我所知、SMCLK 的频率为16MHz。 我的计时器在此频率上计数、这意味着如果计数到我在 TACCR0寄存器中设置的20、我将得到1.25us 的周期。 然后、我将 TACCR1设置为7以获得所需的占空比信号。 我将使用计时器 ISR、然后输出具有所需周期和占空比的脉冲。

但是、当我用示波器监视数据脉冲时、我得到的频率为~37us、但我不确定是什么导致了这种情况。 我还尝试通过设置 P8SEL0 ||位0来监控 SMCLK 的频率 、从而根据 64引脚 PM 封装的引脚分配选择 SMCLK 连接到的引脚16上的主要模块功能。 这种情况没有发生,所以我不知道我是否做得正确。

对于 MCU、我不是专家、非常希望获得有关创建频率为16MHz 的计时器以及如何确保计时器处于该频率的建议。 我附上了我的守则,并尽量解释问题,但如果有任何问题不清楚,请随时提出问题。  

#include <msp430.h>

#pragma vector = TIMER0_A0_VECTOR
__interrupt void ISR_TA0_CCR0(void)
{        
  P1OUT |= BIT3;
  TA0CCTL0 &= ~CCIFG;
}

#pragma vector = TIMER0_A1_VECTOR
__interrupt void ISR_TA0_CCR1(void)
{
  P1OUT &= ~BIT3;
  TA0CCTL1 &= ~CCIFG;
}



int main(void)
{

  WDTCTL = WDTPW | WDTHOLD; 

  
  //configADC();
  // Disable the GPIO power-on default high-impedance mode
  // to activate previously configured port settings
  PMM_unlockLPM5();
  
  __enable_interrupt();
 
 
  //Setting up timer for data signal
  TA0CTL |= TACLR;
  TA0CTL |= MC_1;
  TA0CTL |= TASSEL_2;
  TA0CCR0 = 20;
  TA0CCR1 = 6;
  
  TA0CCTL0 |= CCIE;
  TA0CCTL1 |= CCIE;
  
  TA0CCTL0 &= ~CCIFG;
  TA0CCTL1 &= ~CCIFG;

  //Setting P1.3 as an output
  P1DIR |= BIT3;
  
  //Trying to check freuency of SMCLK
  P8DIR |= BIT0;
  P8SEL0 |= BIT0;


  while(1)
  {        
    
  }
}




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

    我没有看到时钟系统的配置。 复位时、大多数器件默认为 MCLK = SMCLK = 1MHz。 请查看文档以了解有关更改该内容的详细信息。

    通过 Google 快速搜索、可以找到 MSP430G 的代码来驱动这些 LED。 对特定器件进行修改不会很困难。 您的方法似乎注定要失败、因为处理中断所花费的时间太长。

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

    我同意您的观点、我偶然发现了该代码、但我在将代码从一个微控制器修改为另一个微控制器方面没有任何经验。 我一直在尝试为自己修改它、但我很努力。 不确定如何替换以下代码、以便适用于 MSP430FR4133。

        WDTCTL = WDTPW + WDTHOLD;  // Stop WDT
        if (CALBC1_16MHZ==0xFF)    // If calibration constant erased
        {
            while(1);              // do not load, trap CPU!!
        }
    
        // configure clock to 16 MHz
        BCSCTL1 = CALBC1_16MHZ;    // DCO = 16 MHz
        DCOCTL = CALDCO_16MHZ;

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

    不要被细节所挂。 目标是16MHz MCLK。 该文档提供了您需要了解的所有信息。 您还可以从产品页面中查找代码示例。 (链路在螺纹顶部有用插入)

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

    我已经了解了一些人使用 SPI 生成此类波形的位置。 FR4133没有 DMA、因此为了避免间隙、您可能需要调整写入 TXBUF 的循环。

    Resource Explorer 中有一些 SPI 示例:

    https://dev.ti.com/tirex/explore/node?node=A__AHE8WiChEC1qyd5.ZYkM8Q__msp430ware__IOGqZri__LATEST