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:TimerA 2、3和4有问题

Guru**** 2535750 points
Other Parts Discussed in Thread: MSP430FR5994

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/722295/msp430fr5994-having-issues-with-timera-2-3-and-4

器件型号:MSP430FR5994

我将 msp430fr5994用于具有 DriverLib 的 CC V 8中。 我在连续模式下使用 Timer A、无外部引脚、ACLK。

我似乎无法使除0和1之外的 A 计时器正常工作。

正如检查一样、我将 TIMER_A2_BASE 和 TIMER2_A1_Vector 的使用移到了 define 语句中。

#define PortTimer_A2_base
#define PortTimerVector TIMER2_A1_Vector

如果我使用 相应 的 PortTimerVector TIMER0_A1_vector 或 Timer1_A1_vector ISR 例程将 PortTimer 定义为 timer_A0_BASE 或 timer_A1_vector、一切都很棒。

将它们移动到任何其他计时器 A 实例都不会生成中断、即使是应与0和1相同的实例4也是如此。

我是否在文档中遗漏了一些内容?

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

    请您尝试我们的 TimerA 演示代码吗?您没有显示 TimerA 的配置,您可能会错过一些点。

    此致
    Gary
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我发现 TIMERA 0、1和2、3和4之间存在一个差异。
    在 DriverLib 实例中、2、3和4要求您在 ISR 退出时复位中断、这与0和1不同。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好

    我发现根据用户指南25.2.6.2 (www.ti.com/.../slau367o.pdf)自动清除中断标志
    您使用哪种演示?

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

    这就是我的想法! 但是、当我在 A 组中将我的测试计时器设置为3时、

    使用 CCS 调试器并单步执行 ISR;

    从 ISR 返回时、TA3CTL 寄存器中的 TAIFG 标志不会清零。

    我这样说是因为对于计时器3、当我不使用 Timer_A_clearTimerInterrupt()时、它永远不会返回到 LPM3。

    在不使用 Timer_A_clearTimerInterrupt ()的情况下、在 A 组中使用定时器0或1确实返回到 LPM3。

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

    感谢您的回答。 我将设置硬件以对其进行测试。

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

    我发现当您读取 TAxIV 寄存器时,中断标志会自动清零。 TimerA0或 TimerA2不匹配。
    您是否在 ISR 中访问过 TAxIV 寄存器?

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

    感谢您对我的问题给予的热情关注。  我观察了程序行为、因为我在 ISR 中有一个_BIC_SR_REGISTER_ON_EXIT (LPM3_BITS)。

    如果没有 Timer_A_clearTimerInterrupt (PortTimer)、程序永远不会退出 LPM3。 在下面找到我的计时器代码、可能我错过了一些东西。


    //
    * parally_io_timers.c
    *
    创建时间:2018年8月24日
    *
    //
    #include "driverlib.h"
    
    #include "msp430fr5994.h"
    
    #include "parally_io_timers.h"
    
    #define PortTimer_A2_base
    #define PortTimer_timer_A
    param_model_param_model_param/ initPortTimer_param_param_model_param_param_model_param_param_param_model_param_param_param_param_param_model_param_param_param_par
    
    
    
    选择时钟源。
    //! \n 有效值为:
    //! -\b TIMER_A_CLOCKSOURCE_EXTERNAL_TXCLK [默认值]
    //! -\b TIMER_A_CLOCKSOURCE_ACLK
    //! -\b TIMER_A_CLOCKSOURCE_SMCLK
    //! --\b TIMER_A_CLOCKSOURCE_INVERD_EXTERNAL_TXCLK
    TIMER_A_CLOCKSOURCE_SMCLK、
    //! 是时钟源//
    !的所需分频器 \n 有效值为:
    //! -\b TIMER_A_CLOCKSOURCE_DEVIDER_1 [默认值]
    //! -\b TIMER_A_CLOCKSOURCE_DEVIDER_2
    //! -\b TIMER_A_CLOCKSOURCE_DEVIDER_3
    //! -\b TIMER_A_CLOCKSOURCE_DEVIDER_4
    //! -\b TIMER_A_CLOCKSOURCE_DEVIDER_5
    //! -\b TIMER_A_CLOCKSOURCE_DEVIDER_6
    //! -\b TIMER_A_CLOCKSOURCE_DEVIDER_7
    //! -\b TIMER_A_CLOCKSOURCE_DEVIDER_8
    //! -\b TIMER_A_CLOCKSOURCE_DEVIDER_10
    //! -\b TIMER_A_CLOCKSOURCE_DEVIDER_12
    //! -\b TIMER_A_CLOCKSOURCE_DEVIDER_14
    //! -\b TIMER_A_CLOCKSOURCE_DEVIDER_16
    //! -\b TIMER_A_CLOCKSOURCE_DEVIDER_20
    //! -\b TIMER_A_CLOCKSOURCE_DEVIDER_24
    //! -\b TIMER_A_CLOCKSOURCE_DEVIDER_28
    //! -\b TIMER_A_CLOCKSOURCE_DEVIDER_32
    //! -\b TIMER_A_CLOCKSOURCE_DEVIDER_40
    //! -\b TIMER_A_CLOCKSOURCE_DEVIDER_48
    //! -\b TIMER_A_CLOCKSOURCE_DEVIDER_56
    //! -\b TIMER_A_CLOCKSOURCE_DEVIDER_64
    TIMER_A_CLOCKSOURCE_DEVIDER_1、
    //! 启用或禁用 Timer_A 中断
    //! \n 有效值为:
    //! -\b TIMER_A_TAIE_INTERRUPT_ENABLE
    //! - b TIMER_A_TAIE_INTERRUPT_DISABLE [默认值]
    TIMER_A_TAIE_INTERRUPT_ENABLE、
    //! 决定 Timer_A 时钟分频器、计数方向、计数是否需要为
    //! 复位。
    //! \n 有效值为:
    //! -\b TIMER_A_DO _清除
    //! -\b TIMER_A_SKIP_CLEAR [Default]
    TIMER_A_SKIP_CLEAR、
    //! 是否立即启动计时器
    true
    };
    
    void Timer_Port_Setup (void){
    //以 ACLK 为源的连续模式中的启动定时器
    Timer_A_clearTimerInterrupt (PortTimer);
    Timer_A_initContinuousMode (PortTimer、&initPort_TimerA_ContParam);
    // Timer_A_startCounter (PortTimer_A_Continuous_mode);
    }
    
    
    
    //端口计时器中断服务例程
    //来自 e2e.ti.com/.../2365461
    //空计时器 A0中断服务例程
    //来自 e2e.ti.com/.../2365461
    #if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
    #void 计时器 A0中断服务例程//从#define (__TimPorterZero_Varite_Timer__
    (timerOutpute_Timer_ Timer_ Timer_ Timerf
    
    )_ Timer_Timer_Timerf (timer_timer_timer_timer_timer_timer_timer_timervector (timer_timer_timer_
    
    
    
    Timer_A_clearTimerInterrupt (PortTimer);
    
    }
    
    
    #if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
    #pragma vector=PortTimerVector
    __interrupt
    #elif defined (__GNU__)
    __attribute__(INTERRUPT (PortTimerVector)))#Portenvoid
    
    (PortTimervector ISR)
    )
    //*********
    //计时器 ISR 和矢量
    //*********
    timerPortData = true;
    //如有必要,唤醒主线
    if (timerPortData)__BIC_SR_REGISTER_ON_EXIT (LPM3_BITS);//从0 (SR)清除 LPM3位
    Timer_A_clearTimerInterrupt (PortTimer);
    }
    
    
    

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

    我不知道您为什么定义这两个 ISR。 为什么定义 timerPortData?
    您能不能澄清您想要做什么以及您的问题是什么。
    如果只想使用驱动程序 LIB 演示、您可以先参考这些演示。
    dev.ti.com/.../

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

    我了解到结构由 DriverLib 强加、一个中断用于 TIMER2_A0_vector、一个中断用于 TIMER2_A1_vector、 我了解每个矢量都需要自己的 ISR。  是这样吗?

    问题出在没有

        Timer_A_clearTimerInterrupt(PortTimer);
    语句中、中断永远不会清除。  这是我希望理解的问题之一、因为它可能会产生影响、而不仅仅是将该声明添加到 ISR 中。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我打包了该代码并将其放在 FR5994 Launchpad 上。 它按预期工作---- A1中断,~16Hz,无 A0中断。 我单步执行 TA0-TA4、发现它们之间的行为没有差异。

    A0中断自动清除 CCTL0:CCIFG (非 TAIFG)。 A1中断不会自动清除任何内容、因此您始终需要调用 clearTimerInterrupt 来清除 TAIFG。

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

    为清楚起见、我的 main.c 文件如下:

    #include "driverlib.h" //可能包括 msp430.h?
    #include "parally_io_timers.h"
    int main (void){
    
    WDT_A_HOLD (WDT_A_base);
    P1OUT &=~(BIT0|BIT1);
    P1DIR |=(BIT0|BIT1);
    PM5CTL0 &=~LOCKLPM5;
    Timer_Port_Setup();
    _enable_interrupt ();
    while (1)
    {
    LPM3;
    P1OUT ^= BIT1; // LP LED2 (无法禁用)
    }
    /*NOTREACHED*/
    返回(0);
    } 
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    啊、我一定错过了 A1无法自动清零、这是我的问题。 是否在某处记录了这种情况?

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

    我想有人会说、它是通过遗漏记录的。 FR59用户指南(SLAU367O)秒 25.2.6区分这两种情况。 SEC 25.2.6.1 (CCR0)显示"当 TAxCCR0中断请求被服务时"它被复位、而 SEC 25.2.6.2 (所有其他)不会复位。

    [编辑:结果显示两个段都显示"自动复位"(不同的上下文)。]

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    啊,一个特色! 感谢您的深入见解。