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.

[参考译文] MSP430F5437:在向上计数模式下运行时、TA1和 TB0之间的差异

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/774356/msp430f5437-difference-between-ta1-and-tb0-when-running-in-up-mode

器件型号:MSP430F5437
主题中讨论的其他器件: MSP430F5529MSP430F5438A

大家好、TI 论坛、

我注意到、在向上计数模式下运行和切换输出引脚模式时、TA1和 TB0之间存在差异。

两个计时器使用相同的配置(如下所示)、但我从这两个计时器获得的输出引脚频率不同。  

 

TA1CCR0 = 9;

TA1CCTL1 = 0x0080;       //TA1.1处于比较模式并切换输出引脚模式

TA1CCR1 = 5;

TA1EX0 = 0x0000;         //TMRA1输入分频器扩展设置为1

TA1CTL = 0x0114;         

 

TB0CCR0 = 9;

TB0CCTL5 = 0x0080;        /TB0.5处于比较模式并切换输出引脚模式

TB0CCR5 = 5;

TB0EX0 = 0x0000;         //TMRB0输入分频器扩展设置为1分频

TB0CTL = 0x0114;    

 

两个计时器均由 ACLK 计时、在我的案例中为14.7456MHz。

 

TA1.1输出引脚频率(测量值)与公式 Fout = ACLK /((TA1CCR0 + 1)* 2)= 737.28KHz 一致

 

但是、TB0.5输出引脚频率(测量值)更高且等于819.2KHz、这与 Fout = ACLK /(TB0CCR0 * 2)= 819.2KHz 一致

 

如果我配置 TB0CCR0 = 10、那么两个定时器在各自的输出引脚上生成相同的频率(737.28KHz)。      

 

您能解释一下这种行为吗?

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

    我找不到这种行为的任何文档。

    您使用的是 TI EVM 还是定制电路板?
    您是否尝试在测量输出信号周期的同时使计时器彼此完全同步运行?
    您能否与我共享完整的固件计时器固件?

    谢谢、
    JD
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    JD、您好、我正在收集信息、并将在适当的时候作出回应。
    感谢您在这方面的帮助。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    JD、您好!

    要解决您的问题、请执行以下操作:

    为此,我查阅了《MSP430x5xx 和 MSP430x6xx 系列用户指南》,SLAU208Q。
    第465页的第17.2.3.1段指出、增模式中的 Timer_A 的周期等于 TAxCCR0+1。
    第486页第18.2.3.1段为增模式中的 Timer_B 提供了相同类型的信息。
    与 Timer_A 一样、在增模式中 Timer_B 的周期等于 TBxCL0 + 1。

    2.我使用的是带有 MSP430F5437A 的定制板。

    3.我只需要在定时器输出引脚上生成两个时钟信号并设置所需的周期
    相应的输出 PI 无需在计时器之间同步。
    问题是、由于某种原因、我从 Timer_B 获取的周期与 TBxCL0+1不一致
    (请参阅上面的问题1的答案。)、而 Timer_A 的周期与 TAxCCR0 + 1完全一致。

    即、在 Timer_A 和 Timer_B 输出引脚配置为切换模式时、相应的引脚
    输出 PI 频率应为:
    Timer_A:Fpin = Fclk /((TAxCCR0 + 1)* 2) Timer_B:Fpin = Fclk /((TBxCL0 + 1)* 2)

    但是、我在 Timer_B 的输出引脚上测量的频率略高于预期和
    与方程式 Fpin = Fclk /(TBxCL0 * 2)一致、后者偏离了中提供的规格
    数据表。


    下面是与 Timer_A 和 Timer_B 相关的完整固件配置
    两个定时器均由 ACLK 提供时钟并在增模式下运行、配置了 TA1.1和 TB0.6输出引脚
    在中
    切换模式。

    在 TA1.1输出引脚上、我需要一个等于 ACLK / 20的时钟、因此我将值9加载到 TA1CCR0中、
    在 FAC 中、这确实导致了 ACLK / 20的 TA1.1输出引脚时钟频率(在上测量)
    电路板)。

    另一方面、在 TB0.6输出引脚上、我需要一个等于 ACLK / 18的时钟、因此我最初加载了该时钟
    值8在 TB0CL0 (在 IAR 嵌入式工作平台中被称为 TB0CCR0)内、但它导致 TB0.6
    ACLK/16的输出引脚时钟(在电路板上测得)。
    在我将 TB0CL0值更改为9后、TB0.6输出引脚上的时钟频率被设置为 ACLK / 18。

    换句话说、两个计时器的固件配置现在都是100%相同的、但它们会生成
    不同的输出引脚周期。

    为什么会发生这种情况? 我在这里错过了什么?

    //ACLK = 14745600Hz
    //Config TA1.1
    TA1CCR0 = 9;//TMRA1输出引脚频率= ACLK /((9 + 1)* 2)= 737.28KHz
    TA1CCTL1 = 0x0080;//TA1.1处于比较模式并切换输出引脚模式
    TA1CCR1 = 5;
    TA1EX0 = 0x0000;//TMRA1输入分频器扩展设置为1分频
    TA1CTL = 0x0114;//TMRA1在向上计数模式中,时钟源 ACLK;输入 div 1;清除计时器和分频器
    //Config TB0.6
    //注:寄存器名称 TB0CCR0用于 IAR EWB,它对应于 TI SLAU208Q 中使用的 TB0CL0
    TB0CCR0 = 9;//TMRB0输出引脚频率= ACLK /(9 * 2)= 819.2KHz)??????
    TB0CCTL6 = 0x0080;在比较模式和切换输出引脚模式中为//TB0.6
    TB0CCR6 = 5;
    TB0EX0 = 0x0000;//TMRB0输入分频器扩展设置为1分频
    TB0CTL = 0x0114;//TMRB0在向上计数模式中,时钟源 ACLK;输入 div 1;清除计时器和分频器
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我打包了该代码并在 MSP430F5529 Launchpad 上运行、两个波形看起来完全匹配。 它们甚至是同步的、我认为这是重合的。

    Launchpad 没有14MHz 晶体、只有4MHz 晶体、因此产生的频率为200kHz。当然、F5529不是 F5437。

    我不确定你和我的表现有何不同。

    #include 
    
    void
    clk_init (void)
    {
    P5SEL |=(BIT4|BIT5); // XT1 (LP 上为32kHz)
    P5SEL |=(BIT2|BIT3); // XT2 (LP 上为4MHz)
    UCSCTL6 &=~XT2OFF; //启用 XT2
    UCSCTL3 |= SELREF_2; // FLLref = REFO
    //由于未使用 LFXT1,
    //使用 LFXT1提供 FLL 可能会导致
    // XT1OFFG 标志置1
    UCSCTL4 |= SE拉美 经济体系2; // ACLK=REFO、SMCLK=DCO、MCLK=DCO
    
    //循环直到 XT1、XT2和 DCO 稳定-在本例中循环直到 XT2稳定
    操作
    {
    UCSCTL7 &=~(XT2OFFG + XT1LFOFFG + DCOFFG);
    //清除 XT2、XT1、DCO 故障标志
    SFRIFG1 &=~OFIFG; //清除故障标志
    } while (SFRIFG1和 OFIFG); //测试振荡器故障标志
    UCSCTL6 &=~XT2DRIVE0; //根据减少 XT2驱动 //预期频率
    UCSCTL4 |= SELs_5 + SELM_5; // SMCLK=MCLK=XT2
    UCSCTL4 =(UCSCTL4 &~SEL_7)|SELA _5; // ACLK=XT2
    
    return;
    }
    int
    main (void)
    {
    WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
    clk_init ();
    //ACLK = 4000000Hz 来自 Launchpad XT2 (ACLK = 14745600Hz、最初)
    //配置 TA1.1
    TA1CCR0 = 9;//TMRA1输出引脚频率= 0x78kHz (CCLK = 0x781Hz)+
    TACLK = 0x781Hz (TACLK = 0x781Hz) //TA1.1处于比较模式并切换输出引脚模式
    TA1CCR1 = 5;
    TA1EX0 = 0x0000;//TMRA1输入分频器扩展设置为除以1
    TA1CTL = 0x0114;//TMRA1处于向上计数模式,时钟源 ACLK;输入 div 1;清除计时器和分频
    器 P2SEL |= BIT0; // P2.0作为 TA1.1,符合 SLAS590N 表6-47
    P2DIR |= BIT0;
    //配置 TB0.6
    //注:寄存器名称 TB0CCR0用于 IAR EWB,它对应于 TI SLAU208Q
    TB0CCR0 = 9中使用的 TB0CL0;//TMRB0输出引脚频率= ACLK = 19.8 Hz?/?Hz
    TB0CCTL6 = 0x0080;在比较模式和切换输出引脚模式
    下、//TB0.6 TB0CCR6 = 5;
    TB0EX0 = 0x0000;//TMRB0输入分频器扩展设置为除以1
    TB0CTL = 0x0114;在向上计数模式下、时钟源 ACLK;输入 div 1;清除计时器和分频
    器= BIT3SEL | //根据 SLAS590N 表6-48
    P3DIR |= BIT6将 P3.6设置为 TB0.6;
    while (1)
    {
    LPM0;
    }/*NOTREACHED*/
    
    RETURN 0;
    }
    

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

    您好、Ed、

    感谢您提供更多信息。  很高兴看到 Bruce 能够在 MSP430F5529上进行测试、并且没有任何问题。

    我没有任何 MSP430F5437A、但 明天我会在 MSP430F5438A 实验板上运行与 Bruce 相同的测试。  MSP430F5438A 是相关器件、它们应该共享这个完全相同的外设。  

    明天下午、我将分享这些结果。   

    谢谢、

    JD

       

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

    您好、Ed、

    我还在目标板上的 MSP430F5438A 器件上运行了该测试、发现 TimerA 和 TimerB 输出之间没有差异。  该板没有任何晶体、因此我只关闭了默认时钟。  我测试了 Aclk 和 SMclk。  

       

    我必须更改引脚并从 Bruce 提供的代码中删除 clk_init。  这是我的:

    /**
    * main.c
    */
    int main (void)
    {
    
    WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
    // clk_init ();
    
    //ACLK = 4000000Hz、来自 Launchpad XT2 (ACLK = 14745600Hz、最初)
    //Config TA1.1
    TA1CCR0 = 9;//TMRA1输出引脚频率= ACLK /((9 + 1)* 2)= 737.28KHz
    TA1CCTL1 = 0x0080;//TA1.1处于比较模式并切换输出引脚模式
    TA1CCR1 = 5;
    TA1EX0 = 0x0000;//TMRA1输入分频器扩展设置为1分频
    TA1CTL = 0x0114;//TMRA1在向上计数模式中,时钟源 ACLK;输入 div 1;清除计时器和分频器
    P8SEL |= BIT6;//根据 SLAS590N 表6-47将 P2.0设置为 TA1.1
    P8DIR |= BIT6;
    //Config TB0.6
    //注:寄存器名称 TB0CCR0用于 IAR EWB,它对应于 TI SLAU208Q 中使用的 TB0CL0
    TB0CCR0 = 9;//TMRB0输出引脚频率= ACLK /(9 * 2)= 819.2KHz)??????
    TB0CCTL6 = 0x0080;在比较模式和切换输出引脚模式中为//TB0.6
    TB0CCR6 = 5;
    TB0EX0 = 0x0000;//TMRB0输入分频器扩展设置为1分频
    TB0CTL = 0x0114;//TMRB0在向上计数模式中,时钟源 ACLK;输入 div 1;清除计时器和分频器
    P4SEL |= BIT6;//根据 SLAS590N 表6-48将 P3.6设置为 TB0.6
    P4DIR |= BIT6;
    while (1)
    {
    LPM0;
    }
    
    /*NOTREACHED*/
    返回0;
    } 

    还在12MHz SMclk 下进行了测试:

      

    谢谢、

    JD