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/MSP430F5438A:中断

Guru**** 2553950 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/631430/ccs-msp430f5438a-interrupts

部件号:MSP430F5438A

工具/软件:Code Composer Studio

包括"MSP4S.h"

Void主(void)

   易失性长整型i=0;

   //停止WDT

   WDTCTL = WDTPW + WDTHOLD;    

 

   //配置输入/输出引脚

   //将WFP 1.0 设置为输出端口(用于LED1)    

   P1SEL = P1SEL &~BIT0;  

   P1DIR = P1DIR | BIT0;

   //将WFP 1.1 设置为输出端口(用于LED2)

   P1SEL = P1SEL &~BIT1;  

   P1DIR = P1DIR | BIT1;  

   

   //将WFP 2.6 设置为输入端口(用于SW1)

   P2SEL = P2SEL和~BIT6;  

   P2DIR = P2DIR和~BIT6;

   //启用内部拉电阻器并设置为上拉

   P2REN = P2REN | BIT6;  

   P2OUT = P2OUT | BIT6;

   //为WFP 1.6 设置中断(SW1)

   // WFP 2.6 高/低边缘(下降边缘)

   P2IES |= BIT6;

   //已清除WFP 2.6 IFG

   P2IFG &=~BIT6;

   //启用WFP 2.6 中断

   P2IE |= BIT6;

 

   //全局启用中断

   _EINT();

 

   //带有软件延迟的轮询环路

   for (;;) //这等同于while (1)

   {

       //切换LED 2.

       P1OUT ^= 0x02;   

       //旋转n个周期

       对于(i=0;i<3万;i++){;}    

   }       

}

 

//端口2中断服务例程(ISR)

#pragma vector=port2_vector

__interrupt void Port_2 (void)

     // WFP 1.0 =切换LED 1

     P1OUT ^= BIT0;

     

     //清除WFP 2.6 IFG

     P2IFG &=~BIT6;

}

我对编程很陌生,我刚刚开始了解中断。

我的任务是修改以上代码,使开关1 (WFP 2.6)被释放时,LED 1 (WFP 1.0)打开,按下时,它将关闭。

目前,每次按下开关1时,LED2都会持续闪烁,LED1会打开和关闭。

有人能向我指出正确的方向吗?

我补充说

   同时(1)

   {

     //如果S1被释放

     IF (P2IN和BIT6)

     {

            //打开LED

            P1OUT |= BIT0;

     }

     否则

     {

            //关闭LED

            P1OUT &=~BIT0;

     }     

   }               

我不知道如何将其集成到代码中。 我只是把它放进去,现在LED1在它被释放时打开,在它被按下时关闭(按它应该的那样),但当我按下SW1时,LED2只是关闭。  

我对此非常陌生,因此非常感谢任何帮助。

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我猜你把while循环放在你的P2 ISR里面,在这种情况下,它永远不会离开去维修WFP 1.1 开关。 如果您需要在每个边缘转换上中断,则应在P2ISR中切换P2IES的BIT6。 您还可以评估WFP 2.6 并相应地打开/关闭LED指示灯,但绝不能将您的代码陷在ISR内。 我建议您练习使用CCS调试器来帮助识别和修复代码问题。

    此致,
    Ryan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你说得对,我确实在ISR内部进行了循环。 我现在明白了为什么这是错误的。

    如何在ISR中写入以切换BIT6 P2IES? 是吗?:

    //端口2中断服务例程(ISR)

    #pragma vector=port2_vector

    __interrupt void Port_2 (void)



    P2IES ^= BIT6;

    // WFP 1.0 =切换LED 1

    P1OUT ^= BIT0;



    //清除WFP 2.6 IFG

    P2IFG &=~BIT6;

    }


    此外,如何评估2.6 以相应地打开/关闭,我不理解您的意思?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您的PIN切换代码是正确的,在ISR内,您仍会检查P2IN的BIT6状态,以确定中断是发生在上升还是下降边缘,并采取相应的措施。

    此致,
    Ryan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    所以,我只想检查一下是否正确。在ISR中,我将输入:



    P2IES ^= BIT6;

    //如果S1被释放

    IF (P2IN和BIT6)



    //打开LED

    P1OUT |= BIT0;

    }

    否则



    //关闭LED

    P1OUT &=~BIT0;

    }



    // WFP 1.0 =切换LED 1

    P1OUT ^= BIT0;



    //清除WFP 2.6 IFG

    P2IFG &=~BIT6;

    }
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是完成所需应用程序必须遵循的基本过程。

    此致,
    Ryan