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.

[参考译文] MSP430FR5969:I/O 中断

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

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1065258/msp430fr5969-i-o-interrupt

器件型号:MSP430FR5969

您好!

我必须在使用 MSP430FR5969 Launch Pad 的 I/O 中断处理程序内创建计时器延迟(采用轮询方法)。 I/O 中断只执行一次、之后程序停止、然后我应该复位微控制器。 只有在复位后、程序才会按我的预期执行。 我还尝试清除中断标志、但即使在清除中断标志后、它也会进入 ISR_TRAP。
如何在 I/O 中断处理程序中使用计时器延迟?  

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

    我在整理这里的序列时遇到了一些问题。 您可能需要(按步骤、按时间顺序)描述您希望发生的情况以及(根据需要)每个步骤实际发生的情况。

    如果您的计划是始终在延迟后立即重置 MCU、那么我认为在 ISR 内部旋转没有任何问题、直到那时。  如何执行复位?

    ISR_Trap 几乎总是意味着您已经启用了一个中断、但没有为其提供 ISR。 MCU 复位似乎不可能使 ISR (代码+矢量字)消失,因此我怀疑还会发生其他情况--也许您意外启用了另一个中断。 您是否正在使用 RTC?

    如果您可以发布相关代码(不要忘记在底部使用"Insert->Code"),这里的人可能会看到一些内容。

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

    您好!

    我在 launchpad 上使用的是具有全强度的12MHz HFXTCLK。我没有对 SMCLK 使用任何预分频值(我只对计时器使用预分频器)。
    我将全速12MHz 时钟用于我的系统。 我想使用16位计时器延迟在中断发生时创建64ms 的脉冲。 在中断发生后、I/O 引脚提供64ms 的脉冲时间。 但是、在处理程序代码执行后、代码会在我无法创建相同中断后结束一次。
    在调试模式下、分步调试过程会在执行处理程序代码后引导我进入 ISR_Trap。 请参阅以下代码。

    #include <msp430.h> 
    
    
    /**
     * main.c
     */
    // I/O PORT 1 is used in this program
    
    void clk_con()
    {
        CSCTL0_H = CSKEY >> 8;
        CSCTL1 = 0X000C;
        CSCTL2 = 0X0155;
        CSCTL3 = 0X0000;
        CSCTL4 = 0XCC01;
        CSCTL0_H = 0;
    }
    void tmr_con(){
        TA1CTL = 0x02D2;
        TA1EX0 = 0X0007;
        TA1CCTL0 = 0X0010;;
        //TA1CCR0 = 0X2EE0;
    }
    void delay()
    {
        while(!(TA1CTL & TAIFG));
        TA1CTL &= ~(TAIFG);
    }
    int main(void)
    {
    	WDTCTL = WDTPW | WDTHOLD;	// stop watchdog timer
    	PM5CTL0 &= ~LOCKLPM5;
    	io_con();
    	clk_con();
    	FRCTL0 = FRCTLPW | NWAITS_1;
    	tmr_con();
    
    	__bis_SR_register(GIE);
    
    	return 0;
    }
    
    #pragma vector= PORT1_VECTOR
    __interrupt void PORT1(void)
    {
        TA1CCR0= 0X2EE0;
        P1OUT |= 0X01;
        TA1CCTL0 = (~CCIFG);
        delay();
        P1OUT = 0X00;
        TA1CTL |= TACLR;
        P1IFG = 0X00;
    }
    

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

    > TA1CCTL0 = 0X0010;;

    这将设置 CCIE、这将导致 Timer1_A0_vector 中断、 从而使您进入 ISR_Trap [参考用户指南(SLAU367P)表25-6和25.2.6.1]。

    您对 CCR0中断不感兴趣、因此只需删除此行代码即可。

    ------

    > TA1CTL = 0x02D2;

    这等效于  

    > TA1CTL = tassel_2 | ID_3 | MC_1 | TAIE; // SMCLK/8、向上、启用

    TAIE 将导致 Timer1_A1_vector 中断[参考 UG 第25.2.6.2]节、这将使您进入 ISR_Trap。

    您不想在 TAIFG 上中断、因为您要对其进行轮询、所以请尝试:

      TA1CTL = tassel_2 | ID_3 | MC_1; // SMCLK/8、向上

    ------

    > TA1CCR0= 0X2EE0;

    这不会重置 TA1计数器、因此您的延迟将是周期中剩余的任何时间(因为它一直在计数)。 我建议您将其移至 tmr_con()并将其替换为(此处):

    > TA1CTL |= TACLR; //重置计数器以获得完整周期

    ------

    更一般的情况:在编码时,main()函数返回,(在我调用时)最终在 abort()中的循环中。 它不会导致 MCU 复位。