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.

[参考译文] MSP430FR6989:MSP430FR6989

Guru**** 2524550 points


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

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

器件型号:MSP430FR6989

大家好、我尝试在每1秒的间隔内发送数据、并同时闪烁。 但我不知道为什么会延迟时间。 LED 闪烁需要1秒以上的时间。 并且我在每4秒的间隔内接收1个字符"V"(0x56) 我们将感谢您的任何帮助。 如果中断或传输代码有任何问题、请通过注释通知我。

当我删除这些函数时、UART (SELECT_CLOCK_SIGNAL)可能会导致这种情况。 它开始以所需的速度运行、但会变大、并且不会接收我需要的数据

 

#include

#define RED_LED 0x0001

#define ENABLE_Pins 0xFFFE //需要使用输入和输出

#define UART_CLK_SEL 0x0080 //指定 UART 外设的精确时钟

#define br0_for_9600 0x34 //使用9600波特所需的值

#define BR1_for_9600 0x00 //使用9600波特所需的值

#define CLK_MOD 0x4911 //微控制器将"清理"时钟信号

#define STOP_WATCHDOG 0x5A80 //停止看门狗计时器

#define ACLK 0x0100 // Timer_A ACLK 源

#define Up 0x0010 // Timer_A 向上计数模式

#define ADC12_P84 0x0007 //将输入 P8.4用于模拟输入

void select_clock_Signals (void);//分配微控制器时钟信号

void assign_pins_TO_UART (void);// P4.2表示 TXD、P4.3表示 RXD

void use_9600_Baud (void);// UART 以9600位/秒的速度运行

main (空)

  WDTCTL = STOP_WATCHDOG;//停止 WDT

  PM5CTL0 = ENABLE_Pins;//使能引脚

  P1DIR = RED_LED;

  TA0CCR0 = 40000;// 400计数为1s

  TA0CTL = ACLK + UP;//为 Timer_0设置 ACLK、UP 模式

  TA0CCTL0 = CCIE;//为 Timer_启用中断

  select_clock_Signals ();//分配微控制器时钟信号

  assign_pins_to _UART ();// P4.2用于 TXD

  USE_9600_BAUD ();// UART 以9600位/秒的速度运行

  BIS_SR (LPM0_Bits | GIE);//激活使能 中断

  while (1);

  #pragma vector=TIMER0_A0_VECTOR

    _interrupt void Timer0_ISR (void)

    {

      P1OUT = P1OUT ^ RED_LED;

      UCA0TXBUF = 0x56;

    }

    void select_clock_Signals (void)

    {

      CSCTL0 = 0xA500;//访问时钟校准寄存器的"密码"

      CSCTL1 = 0x0046;//指定主时钟的频率

      CSCTL2 = 0x0133;//分配额外的时钟信号

      CSCTL3 = 0x0000;//使用预期频率的时钟,不要减慢时钟速度

    }

    void assign_pins_to _UART (void)

    {

      P4SEL1 = 0x00;// 0000 0000

      P4SEL0 = BIT2;

   }

    void use_9600_Baud (void)

    {

      UCA0CTLW0 = UCSWRST;//将 UART 置于软件复位状态

      UCA0CTLW0 = UCA0CTLW0 | UART_CLK_SEL;//指定 UART 的时钟源

      UCA0BR0 = br0_for_9600;//指定9600的比特率(波特率)

      UCA0BR1 = BR1_for_9600;//指定9600的比特率(波特率)

      UCA0MCTLW = CLK_MOD;//"清除"时钟信号

      UCA0CTLW0 = UCA0CTLW0 &(~UCSWRST);//使 UART 退出软件复位

    }

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

    我查看了您的代码、看起来您已经正确设置了 UART。 我唯一发现问题的是您在 TA0CCR0中放置的值。

    您将 TA0CCR0设置为40000、并且其源时钟为~9.4kHz。 数学运算40000/9.3kHz = 4.3秒、这与您看到的结果相加。 尝试在 TA0CCR0中设置10000的值、您应该会看到一个更接近1秒的间隔

    此致、
    Caleb Overbay
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的回答、我将会这样做

    但是、当我使用其他程序时、它工作正常(恰好为1秒)。 下面是它工作正常的示例。
    我很困惑。



    #include
    #define RED_LED 0x0001 // P1.0是红色 LED
    #define STOP_WATCHDOG 0x5A80 //停止看门狗计时器
    #define ACLK 0x0100 // Timer_A ACLK 源
    #define Up 0x0010 // Timer_A 向上计数模式
    #define ENABLE_Pins 0xFFFE //需要使用输入和输出
    MAIN ()

    WDTCTL = STOP_DOU狗;//停止看门狗计时器
    PM5CTL0 = ENABLE_Pins;//需要使用输入和输出
    P1DIR = RED_LED;//将红色 LED 设置为输出
    TA0CCR0 = 20000;//设置 Timer_0的值
    TA0CTL = ACLK + UP;//设置 ACLK、UP 模式
    TA0CCTL0 = CCIE;//为 Timer_0启用中断
    _BIS_SR (GIE);//激活之前启用的中断
    while (1);//在这里等待中断


    #pragma vector=TIMER0_A0_VECTOR
    _interrupt void Timer0_ISR (void)

    静态无符号字符 x = 0;//用于计算过去的次数
    X = x+1;//递增过去的计数
    if (x=15)//如果计数15*20,000 = 300,000

    P1OUT = P1OUT ^ RED_LED;//切换红色 LED
    X = 0;//重置主控计数

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

    此程序与原始帖子中的程序完全不同。 您还需要记住、拉取 ACLK 的 VLO 不是很精确、并且可能在6kHz 至14kHz 之间变化、这可能会显著改变间隔。

    此致、
    Caleb Overbay
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    那么,定时器的速度是否会根据程序而变化? 是否有任何方法可以使计时器更快?
    我使用计算出的时间(25微秒* 40000 = 1秒)。 那么、同时使用 UART 和计时器会影响计时器? 这表明两个程序之间存在很大差异。 (在原始程序中闪烁需要4秒(实时)、而在第二个程序中闪烁只需要0.5秒(实时)。 这种急剧变化的原因可能是什么。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Sabin、

    计时器速度取决于您提供的时钟。 在这种情况下、您将从 VLO 获取该信号、VLO 是一种速度更慢、精度更低的信号源。 如果要提高计时器的速度、应为其提供不同的源。

    [引用 user="Sabin Timsina"]使用计算的时间(25us * 40000 = 1sec)

    您从何处获得25us? VLO 振荡频率为~9.4kHz、周期为~106us。

    Sabin Timsina 说:
    因此、同时使用 UART 和计时器会影响计时器?

    我不确定我是否理解这个问题。 您在向我展示的每个程序中都以不同的方式设置了您的计时器。 首先、您将 TA0CCR0设置为40000、然后将 TA0CCR0设置为20000。 那么 ISR 中的逻辑也会有很大不同。 所有这些都不考虑 VLO 的自然变化。 无论如何、对于第二个程序、LED 不会以0.5秒的间隔闪烁。

    更改第一个程序中的 TA0CCR0寄存器对您的间隔有何影响?

    此致、  
    Caleb Overbay

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

    非常感谢。

    是的、更改 第一个程序中的 TA0CCR0寄存器对我有效。  

    我对第二个问题感到抱歉。 我是说在第二个程序中、每个20000计数等于0.5秒。 因此、 LED 每7.5秒切换一次

    很抱歉,我很困惑。 我认为我在两个程序中使用了相同的计时代码、但可能是错误的、因为我对它的详细了解不多。

    哪些代码行会更改时钟源? 我想提高时钟速度、如何更改它。

    关于25mcosec、我在一本书中看到它、它说 从0到1计数需要25微秒。 我不确定它使用的时钟源。

    希望你们能帮我清除困惑。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    现在、我得到了您所说的内容、我修复了它、谢谢。
    我对第一个计划中的"波特率"有些困惑。

    目前我有9600波特率、我想将其更改为115200波特率
    将" UCA0BR0 = br0_for_9600 (0x34)"更改为" UCA0BR0 =(0x04)"更改了我的波特率、但与我的数据混淆
    我是否必须更改任何其他内容?


    "我使用计算出的时间(25微秒* 40000 = 1秒)"
    我以为我使用的是 LFMODCLK、即5MHz/128 =25.6us。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Sabin、

    我建议使用 MSP430波特率计算 器来确定115200波特的适当寄存器设置。 尝试一下、让我知道它是如何工作的。  

    此致、

    Caleb Overbay

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    嘿、Caleb、再次感谢您。 我解决了这个问题。

    现在、我在将波特率更改为460800时遇到了问题

    当我在"低频波特率模式设置"中使用460800波特率时、
    它工作正常。 我接收我发送的真实数据

    但是、当我在"过采样波特率模式设置"中使用460800波特率时、
    我收到的数据错误、甚至没有发送

    这是我的 UART 设置代码,

    void select_clock_Signals (void)

    CSCTL0 = 0xA500;//访问时钟校准寄存器的"密码"
    CSCTL1 = 0x0046;//指定主时钟的频率
    CSCTL2 = 0x0233;//分配额外的时钟信号
    CSCTL3 = 0x0000;//使用预期频率的时钟,不要减慢时钟速度


    void assign_pins_to _UART (void)

    P4SEL1 = 0x00;// 0000 0000
    P4SEL0 = BIT2;// 0000 1100


    void use_9600_Baud (void)

    UCA0CTLW0 = UCSWRST;//将 UART 置于软件复位状态
    UCA0CTLW0 = UCA0CTLW0 | UART_CLK_SEL;//指定 UART 的时钟源
    UCA0BR0 = 1;//指定9600的比特率(波特率)
    UCA0BR1 = BR1_for_9600;//" BR1_for_9600"=0x00指定9600的比特率(波特率)
    UCA0MCTLW =(UCBRS0|UCBRS1|UCBRS2)+UCBRF_0+UCOS16;
    // UCA0MCTLW = CLK_MOD;//"清除"时钟信号
    UCA0CTLW0 = UCA0CTLW0 &(~UCSWRST);//使 UART 退出软件复位
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Caleb、我正在寻找您的帮助。 我想使用尽可能高的波特率。 最高波特率是多少?如何获得? 也可以为上一个问题寻找解决方案。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好、Sabin、

    如用户指南的表30-5所示、由于 TX/RX 误差较大、在过采样模式(UCOS16集)下、对于8MHz 的 BRCLK、不建议使用460800的波特率。 如果您想使用460800波特进行过采样、我建议您将 BRCLK 增加到16MHz。 数据表的表5-16提供了最大输入时钟频率(16MHz)和波特率(4Mbaud)。 在不进行过采样的情况下、应能够以921600波特率进行操作、误差最小。

    此致、
    Ryan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢你的帮助
    我尝试了您说的内容、但是每当我将时钟更改为16MHz 时、UART 传输就会停止工作、即使 LED 不闪烁、这也是我的代码。

    #include
    #define RED_LED 0x0001
    #define ENABLE_Pins 0xFFFE //需要使用输入和输出
    #define UART_CLK_SEL 0x0080 //指定 UART 外设的精确时钟
    #define STOP_WATCHDOG 0x5A80 //停止看门狗计时器
    #define ACLK 0x0100 // Timer_A ACLK 源
    #define Up 0x0010 // Timer_A 向上计数模式
    void select_clock_Signals (void);//分配微控制器时钟信号
    void assign_pins_TO_UART (void);// P4.2表示 TXD、P4.3表示 RXD
    void use_9600_Baud (void);// UART 以9600位/秒的速度运行


    main (空)

    WDTCTL = STOP_WATCHDOG;//停止 WDT
    PM5CTL0 = ENABLE_Pins;//使能引脚
    P1DIR = RED_LED;
    TA0CCR0 = 40000;// 40000计数为1s
    TA0CTL = ACLK + UP;//为 Timer_0设置 ACLK、UP 模式
    TA0CCTL0 = CCIE;//为 Timer_启用中断
    select_clock_Signals ();//分配微控制器时钟信号
    assign_pins_to _UART ();// P4.2用于 TXD
    USE_9600_BAUD ();// UART 以9600位/秒的速度运行
    _BIS_SR (GIE);//激活使能中断
    while (1);


    #pragma vector=TIMER0_A0_VECTOR
    _interrupt void Timer0_ISR (void)

    P1OUT = P1OUT ^ RED_LED;
    UCA0TXBUF = 0x55;


    void select_clock_Signals (void)

    CSCTL0 = 0xA500;//访问时钟校准寄存器的"密码"
    CSCTL1 = 0x0048;//将主时钟的频率指定为16MHz
    CSCTL2 = 0x0233;//分配额外的时钟信号
    CSCTL3 = 0x0000;//使用预期频率的时钟,不要减慢时钟速度


    //
    //*用于对适当的引脚进行 UART 控制*
    //
    void assign_pins_to _UART (void)

    P4SEL1 = 0x00;// 0000 0000
    P4SEL0 = BIT2;

    //
    //*指定 UART 波特率*
    //
    void use_9600_Baud (void)

    UCA0CTLW0 = UCSWRST;//将 UART 置于软件复位状态
    UCA0CTLW0 = UCA0CTLW0 | UART_CLK_SEL;//指定 UART 的时钟源
    UCA0BR0 = 17;//指定9600的比特率(波特率)
    UCA0BR1 = 0;//指定9600的比特率(波特率)
    //UCA0MCTLW = CLK_MOD;//"清除"时钟信号
    UCA0MCTLW =(UCBRS0 | UCBRS1)+ UCBRF_0;
    UCA0CTLW0 = UCA0CTLW0 &(~UCSWRST);//使 UART 退出软件复位


  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在配置时钟系统之前、器件数据表需要一个 FRAM 等待状态(RFCTL0 = FRCTLPW | NWAITS1;)、用于8MHz 以上的 MCLK 运行。

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

    您是否仍然需要有关此问题的帮助?

    此致、
    Caleb Overbay
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢、我的问题已经解决