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/MSP430F5529:使用外部时钟源时 Timer_A1无法正常工作(P1.6)

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/813655/ccs-msp430f5529-timer_a1-not-working-properly-with-exernal-clock-source-p1-6

器件型号:MSP430F5529
主题中讨论的其他器件:MSP-EXP430F5529LP

工具/软件:Code Composer Studio

我正在使用2个计时器(Timer_A0和 Timer_A1)对 MSP-EXP430F5529LP (LaunchPad)进行编程、条件如下:

Timer_A0:内部时钟(ACLK)、向上计数模式、捕获/比较中断被启用、定时器中断被禁用

Timer_A1:外部时钟(P1.6)、中断禁用、连续模式

Timer_A0工作正常(相应地生成中断)。

Timer_A1:我有问题。 我连接 P1.6悬空、接地和 VCC、并且计数器仍在这3个条件(浮点、GND、VCC)下运行、这意味着当我读取 TA1R (计时器计数器寄存器)时、我获得不同的值。 它应该仅在我将 P1.6放置到信号时进行计数、如果 P1.6接地、读数应该返回零。

我是否对这些计时器的工作方式有误解? 下面是用于初始化器件的代码的摘要。 欢迎提供任何帮助。

  GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P1、GPIO_PIN6); // TA1CLK

  Timer_A_initUpModeParam gTimerA0params ={0};

  Timer_A_initContinuousModeParam gTimerA1params ={0};

  // Timer_A0  
   gTimerA0params.clockSource                            =定时器_A_CLOCKSOURCE_ACLK;           //使用 ACLK 作为定时器内部时钟
   gTimerA0params.clockSourceDivider                      = TIMER_A_CLOCKSOURCE_DEVIDER_1;      //将时钟频率除以1
   gTimerA0params.timerInterruptEnable_TAIE                 = TIMER_A_TAIE_INTERRUPT_DISABLE;          //在 TAxCTL 寄存器中禁用计时器中断
   gTimerA0params.captureCompareInterruptEnable_CCR0_CCIE = TIMER_A_CAPTURECOMPARE 中断_ENABLE; //在 TAxCCTL0寄存器中启用捕捉比较中断
   gTimerA0params.timerClear                              =定时器_A_DO 清除;                    //清除时间计数器 TAxR 寄存器
   gTimerA0params.startTimer                              =错误;                                   //尚未启动计时器。
   gTimerA0params.timerPeriod                             = 500;                                   //设置计时器周期

   //清除挂起中断(在 TAxCTL 寄存器中清除标志 TAIFG)
   Timer_A_clearTimerInterrupt (timer_A0_BASE);
   //使用以前的参数初始化 TimerA0
   Timer_A_initUpMode (timer_A0_BASE、&gTimerA0params);
   //*** Init TimerA1 ***
   gTimerA1params.clockSource                            = TIMER_A_CLOCKSOURCE_EXTERNAL_TXCLK;      //使用 P1.6作为外部时钟源
   gTimerA1params.clockSourceDivider          = TIMER_A_CLOCKSOURCE_DEVIDER_1;           //将时钟频率除以1
   gTimerA1params.timerInterruptEnable_TAIE   = TIMER_A_TAIE_INTERRUPT_DISABLE;            在 TAxCTL 寄存器中禁用//计时器中断
   gTimerA1params.timerClear                 =定时器_A_DO 清除;                         //清除时间计数器 TAxR 寄存器
   gTimerA1params.startTimer                 =错误;                                        //尚未启动计时器。
   //初始化 TimerA1
   Timer_A_initContinuousMode (timer_A1_base、&gTimerA1params);
谢谢、
弗朗西斯科·克鲁斯
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我打包了代码并在 F5529 Launchpad 上运行、但看不到您描述的行为。 我在 P1.2上以 TA0频率输出方波、并将其修补为 P1.6、TA1计数正确。 如果我将 P1.6连接到 GND、它不会计数。  

    我不知道我们在做什么不同。

    作为参考(我将 TA0CNT0与 TA1R 进行了比较):

    #include "driverlib.h"
    int main (void)
    {
    WDT_A_HOLD (WDT_A_base);
    GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P1、GPIO_PIN6);// TA1CLK
    
    Timer_A_initUpModeParam gTimerA0params ={0};
    Timer_A_initContinuousModeParam gTimerA1params ={0};
    
    // Timer_A0
    gTimerA0params.clockSource = TIMER_A_CLOCKSOURCE_ACLK;//使用 ACLK 作为定时器内部时钟
    gTimerA0params.clockSourceDivider = TIMER_A_CLOCKSOURCE_divider;//将时钟频率除以1
    gTimerA0params.timerInterruptEnable_TAIE = TIMER_A_TAIE_INTERRUPT_DISABLE;//在 TAxCTL 寄存器中禁用计时器中断
    gTimerA0params.captureCompareInterruptEnable_CCR0_CCIE =
    Timer_A_CAPTURECOMPARE INTERRUPT_ENABLE;//在 TAxCCTL0寄存器中启用捕捉比较中断
    gTimerA0params.timerClear = TIMER_A_DO _清除;//清除时间计数器 TAxR 寄存器
    gTimerA0params.startTimer = false; //尚未启动计时器。
    gTimerA0params.timerPeriod = 500; //设置计时器周期
    //清除挂起中断(在 TAxCTL 寄存器中清除标志 TAIFG)
    Timer_A_clearTimerInterrupt (timer_A0_BASE);
    //使用以前的参数初始化 TimerA0
    Timer_A_initUpMode (timer_A0_BASE、&gTimerA0params);
    
    //*** Init TimerA1 ***
    gTimerA1params.clockSource = TIMER_A_CLOCKSOURCE_EXTERNAL_TXCLK;//使用 P1.6作为外部时钟源
    gTimerA1params.clockSourceDivider = TIMER_A_CLOCKSOURCE_divider;//将时钟频率除以1
    gTimerA1params.timerInterruptEnable_TAIE = TIMER_A_TAIE_INTERRUPT_DISABLE;//在 TAxCTL 寄存器中禁用计时器中断
    gTimerA1params.timerClear = TIMER_A_DO _CLEAR;//清除时间计数器 TAxR 寄存器
    gTimerA1params.startTimer = false; //尚未启动计时器。
    //初始化 TimerA1
    Timer_A_initContinuousMode (timer_A1_base、&gTimerA1params);
    
    //为 TA1进行计数
    //跳线 P1.2到 P1.6以查看其计数
    TA0CCR1 = TA0CCR0/2; // 50%的占空比,没有真正的理由
    TA0CCTL1 = OUTMOD_7; //复位/置位提供方波
    P1SEL |= BIT2; //根据 SLAS590N 表6-46在 P1.2上输出 TA0.1
    P1DIR |= BIT2;
    
    Timer_A_startCounter (timer_A0_BASE、timer_A_up_mode);
    Timer_A_startCounter (timer_A1_base、timer_A_Continuous_mode);
    _enable_interrupt ();
    LPM0; //永久睡眠
    返回(0);
    }
    无符号 TA0CNT0;
    #pragma vector=TIMER0_A0_VECTOR
    __INTERRUPT void TA0_CCR0_ISR (void)
    {
    ++TA0CNT0;
    返回;
    }
    

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

    您好、Francisco、

      我还在 MSP430F5529LP Launchpad 上测试了您的代码,没有做任何更改,一切都正常工作,在将 P1.6连接到时钟信号时,计数正常, 如果我将 P1.6连接到 GND 或悬空,则计数不正确。  

    此致、

    Johnson He

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

    Bruce、

    非常感谢您的澄清。 我想确保我对 MSP430F5529计时器的理解是正确的。 在你的反馈之后、我返回到我的代码(比我发送的代码大)、因为我也在使用 USB 通信 API。 我放置在上面的代码是完成调用一个 C 函数来初始化定时器、然后我调用 API USB_setup (true、true)、所有这些都来自 main()。 当我更改了调用顺序时,首先调用 USB_setup(),然后初始化计时器,然后计时器开始正常工作。 在计时器初始化导致这种神秘的行为之后,它看起来像是调用 USB_setup()。 我将尝试详细了解 USB_setup() API 以进行确认,并确保它不是我所做的导致这种神秘行为的其他事情。

    非常感谢您的快速支持

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

    Shuai、

    在你的反馈之后、我返回到我的代码(比我发送的代码大)、因为我也在使用 USB 通信 API。 在主函数中,我正在调用我的函数来初始化计时器,然后调用 USB_setup() API。 更改调用顺序后,首先是 USB_setup(),然后是我的计时器初始化,所有(计时器)都开始正常工作。

    非常感谢您的快速响应。