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.

[参考译文] MSP430FR5994:TA0处于外部时钟脉冲计数模式

Guru**** 2589280 points
Other Parts Discussed in Thread: MSP-EXP430FR5994

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/753860/msp430fr5994-ta0-in-external-clock-pulse-counting-mode

器件型号:MSP430FR5994
主题中讨论的其他器件:MSP-EXP430FR5994

-

使用的电路板:MSP-EXP430FR5994

-

大家好、我正在尝试在外部时钟脉冲计数模式下使用计时器 A0。 我使用了如下所示的代码。 如果我将时钟源设置为 TIMER_A_CLOCKSOURCE_ACLK、代码似乎可以正常运行。 这可确保计时器配置正确。

现在、我尝试将 MCU 芯片的 MCU 引脚3 (端口1.2)映射到计时器/计数器0的时钟输入。 为了实现这一点、我使用了函数 GPIO_setPeripheralModuleFunctionInputPin ()、其中我尝试了全部三个参数(GPIO_primary_module_functionGPIO_secondary 模块_function GPIO_ternary_module_function)。 但这些选项似乎都不起作用。

单步执行调试模式中的代码在寄存器监视窗口中显示 TA0下的 TA0R 寄存器没有变化。 如果时钟源被选为  ACLK、那么我注意到在调试模式中 TA0R 寄存器值会逐渐增加。

为了向 MCU 引脚3发送时钟脉冲、我已使用跳线连接板接头中的 P1.2引脚。 跳线的另一端是交替连接到接头的 GND 和3.3V 引脚。 有人能建议代码中是否有遗漏的内容吗? 或者、我可能在做一些概念上错误的事情。

-

代码:

-

   // 配置计数器

  Timer_A_initContinuousModeParam timerAContiModeCfgParams;

  timerAContiModeCfgParams.clockSource = TIMER_A_CLOCKSOURCE_EXTERNAL_TXCLK;

  timerAContiModeCfgParams.clockSourceDivider = TIMER_A_CLOCKSOURCE_divider _1;

  timerAContiModeCfgParams.startTimer = true;

  timerAContiModeCfgParams.timerClear = timer_a_do_clear;

  timerAContiModeCfgParams.timerInterruptEnable_TAIE = TIMER_A_TAIE_INTERRUPT_DISABLE;

  Timer_A_initContinuousMode (timer_A0_BASE、

                &timerAContiModeCfgParams);

  // 为外部 CLK 输入配置 GPIO 引脚

  GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P1、

                        GPIO_PIN2、

                        GPIO_ternary_module_function);

  // 测试循环

  while (1)

  {

    counterValue_U16 = Timer_A_getCounterValue (timer_A0_BASE);

    if (counterValue_U16 % 2)

    {

      LED_RED_ON;

    }

    其他

    {

      LED_RED_OFF;

    }

  }

-

此致

Soumyajit

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

    我看不到你在哪里

    PM5CTL0 &=~LOCKLPM5; //启用 GPIO
    

    此外、我非常确定您需要次级模块功能(P1SEL=10)。

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

    您好、Bruce、

     感谢您的回复。 抱歉、不发布执行的初始代码、从而造成混淆。 请参阅以下初始代码。 代码确实调用了函数  PMM_unlockLPM5 ()。 您对其他可能出错的问题还有其他建议吗?

    -

    #define INPUT_SWITCH_TO_LED_BLINK 测试0

    #define LPM_WAKEUP_BY_INTERRUPT_TEST 0

    #define CPU_WAKEUP_BY_RTC 0

    #define VLO_MODE 0

    #define LFXT_MODE 0

    #define PULSE_Counting_IN_LPM3_MODE 1

    #define FRAM_DATA_LOCK_TEST 0

    #define LED_RED_OFF  GPIO_setOutputLowOnPin (GPIO_PORT_P1、GPIO_PIN0);

    #define LED_RED_ON   GPIO_setOutputHighOnPin (GPIO_PORT_P1、GPIO_PIN0);

    #define LED_GREEN_OFF  GPIO_setOutputLowOnPin (GPIO_PORT_P1、GPIO_PIN1);

    #define LED_GREEN_ON   GPIO_setOutputHighOnPin (GPIO_PORT_P1、GPIO_PIN1);

    define DELAY_HIGH (I) for (i=100000;i>0;i---)

    define DELAY_MEDIUM (I) for (i=20000;i>0;i---)

    define DELAY_LOW (I) for (i=10000;i>0;i---)

    define DELAY_VE_LOW (I) for (i=1000;i>0;i---)

    针对(i=100;i>0;i---)的#define DELAY_VE_LOW_LOW (I)

    针对(i=10;i>0;i---)的#define DELAY_VE_Very _LOW_(I)

    int main (空)

      volatile uint32_t i、j;

    #IF (PULSE_Counting_IN_LPM3_MODE)

      uint16_t counterValue_U16 = 0;

    #endif

      //停止看门狗计时器

      WDT_A_HOLD (WDT_A_base);

      //将 P1.0设置为输出方向

      GPIO_setAsOutputPin (

        GPIO_PORT_P1、

        GPIO_PIN0

        );

      //将 P1.1设置为输出方向

      GPIO_setAsOutputPin (

        GPIO_PORT_P1、

        GPIO_PIN1

        );

      // SW2配置

      GPIO_setAsInputPinWithPullUpResistor (

          GPIO_PORT_P5、

          GPIO_PIN5

          );

      // SW1配置

      GPIO_setAsInputPinWithPullUpResistor (

          GPIO_PORT_P5、

          GPIO_PIN6

          );

      //禁用 GPIO 上电默认高阻抗模式

      //激活先前配置的端口设置

      PMM_unlockLPM5 ()

      // 红色 LED 亮起

      LED_RED_ON;

      DELAY_LOW (I);

      // 红色 LED 熄灭

      LED_RED_OFF;

      对于(j = 0;j < 5;j++)

      {

        LED_GREEN_ON;

        DELAY_Very 低电平(I);

        LED_GREEN_OFF;

        DELAY_LOW (I);

      }

      // 绿色 LED 亮起

      LED_GREEN_ON;

      //延迟

    //  for (i=100000;i>0; i--);

      DELAY_HIGH (I);

    #IF (PULSE_Counting_IN_LPM3_MODE)

      // 将计数器配置为外部时钟脉冲源

      Timer_A_initContinuousModeParam timerAContiModeCfgParams;

      timerAContiModeCfgParams.clockSource = TIMER_A_CLOCKSOURCE_EXTERNAL_TXCLK;

      timerAContiModeCfgParams.clockSourceDivider = TIMER_A_CLOCKSOURCE_divider _1;

      timerAContiModeCfgParams.startTimer = true;

      timerAContiModeCfgParams.timerClear = timer_a_do_clear;

      timerAContiModeCfgParams.timerInterruptEnable_TAIE = TIMER_A_TAIE_INTERRUPT_DISABLE;

      Timer_A_initContinuousMode (timer_A0_BASE、

                   &timerAContiModeCfgParams);

      // 为外部 CLK 输入配置 GPIO 引脚

      GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P1、

                           GPIO_PIN2、

                           GPIO_secondary 模块功能);

      // 测试循环

      while (1)

      {

        counterValue_U16 = Timer_A_getCounterValue (timer_A0_BASE);

        if (counterValue_U16 % 2)

        {

          LED_RED_ON;

        }

        其他

        {

          LED_RED_OFF;

        }

      }

    #endif

    -

    谢谢你

    -

    此致

    Soumyajit

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

    您的计时器配置正常。

    问题似乎出在测试用例中。 在3V3和 GND 之间移动接地线会导致计数不稳定(通常无)、并且主要是当它浮动时、我移动它时。 可能是计时器中的信号调节正在执行某项操作。

    我成功地将 P1.2引脚安装到其中一个按钮上(Launchpad 底部的高侧引脚-靠近电路板的 USB 端)。 由于您设置了内部上拉电阻器、因此每次按下按钮时、我得到非常干净的边沿和一个(偶尔2次从反弹) TA0R 节拍。

    我还成功地将 P1.2修补到 P1.3 (TA1.2)并在 TA1.2上生成2Hz 信号、从而使其获得稍快的信号:

    #define TRIGGER_PERIOD 62500u // 8*62.5ms ->2Hz
    P1SEL0 |= BIT3; // P1.3作为 TA1.2
    P1SEL1 &=~BIT3; //根据 SLASE54B 表6-21
    P1DIR |= BIT3;
    TA1CCR0 = TRIGGER_PERIOD-1;//周期50000时钟(2Hz)
    TA1CCR2 = TRIGGER_PERIOD/2;// 50%占空比的中途
    TA1CCTL2 = OUTMOD_7; //重置/设置
    TA1CTL = tassel_2 |ID_3 | MC_1 | TACLR;// SMCLK/8、向上[、清除] 

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

    您好、Bruce、

     我使用下面显示的修改代码尝试了从电路板上的 LED 红色引脚(J7)到端口 P1.2的跳线。 它发挥了作用。 感谢您的建议。

    -

    #IF (PULSE_Counting_MODE)

      // 重要:

      // 将跳线从 MCU 的 LED 红色引脚连接到端口 P1.2

      // 这样做是为了将来自 LED 红色的开/关脉冲作为脉冲输入馈送到 TA0 CLK 输入源

      // 将计数器配置为外部时钟脉冲源

      Timer_A_initContinuousModeParam timerAContiModeCfgParams;

      timerAContiModeCfgParams.clockSource = TIMER_A_CLOCKSOURCE_EXTERNAL_TXCLK;

      timerAContiModeCfgParams.clockSourceDivider = TIMER_A_CLOCKSOURCE_divider _1;

      timerAContiModeCfgParams.startTimer = true;

      timerAContiModeCfgParams.timerClear = timer_a_do_clear;

      timerAContiModeCfgParams.timerInterruptEnable_TAIE = TIMER_A_TAIE_INTERRUPT_DISABLE;

      Timer_A_initContinuousMode (timer_A0_BASE、

                    &timerAContiModeCfgParams);

      // 为外部 CLK 输入配置 GPIO 引脚

      GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P1、

                            GPIO_PIN2、

                            GPIO_secondary 模块功能);

      uint8_t loopCounter_u8 = 0;

      // 测试循环

      while (1)

      {

        counterValue_U16 = Timer_A_getCounterValue (timer_A0_BASE);

        if (counterValue_U16 % 2)

        {

          LED_GREEN_ON;

        }

        其他

        {

          LED_GREEN_OFF;

        }

        if ((loopCounter_u8++)% 2)

        {

          LED_RED_ON;

        }

        其他

        {

          LED_RED_OFF;

        }

        DELAY_LOW (I);

      }

    #endif

    -

    此致

    Soumyajit