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.

[参考译文] MSP432P401R:msp432端口中断问题

Guru**** 2539500 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/573394/msp432p401r-msp432-port-interrupt-problem

部件号:MSP432P401R

大家好,

我在使用端口中断功能时遇到了麻烦,该功能用于WFP 1.1 和WFP 1.4。 它说我根本没有使用端口1。 我只能看到红色 和蓝色LED亮起。 对于代码,我要使用两个按钮,每个按钮控制一个LED,每个LED以不同的速度闪烁。 每个按钮都更改其控制的LED的行为。 而且我根本没有激活计时器。 有什么想法可能会成为问题吗?

下面是我的代码。 提前感谢您的参与,

Alda

/* DriverLib包括*/
#include "driverlib.h"

/*标准包括*/
#include <stdint.h>

#include <stdbool.h>

/*应用程序定义 */
#define timer_period   0x2DC6.

/* Timer_A0 Uptime配置参数*/
Timer_a_UpModeConfig upConfig0 ={
Timer_a_CLOCKSOURCE_SMCLK,                  // SMCLK时钟源
       Timer_a_CLOCKSOURCE_diverer_64,     // SMCLK/1 = 3MHz
       Timer_period,                       // 5000 tick period
       TIMER_A_TAIE_INTERRUST_DISABLE,     //禁用计时器中断
       TIMER_A_CCIE_CCR0_INTERRUCING_ENABLE // 启用CCR0中断
       TIMER_A_DO清除                    //清除值
       };

/* Timer_A1上行模式配置参数*/
Timer_a_UpModeConfig upConfig1 ={
Timer_a_CLOCKSOURCE_SMCLK,                  // SMCLK时钟源
       Timer_a_CLOCKSOURCE_diverer_64,     // SMCLK/1 = 3MHz
       Timer_period,                       // 5000 tick period
       TIMER_A_TAIE_INTERRUST_DISABLE,     //禁用计时器中断
       TIMER_A_CCIE_CCR0_INTERRUCING_ENABLE // 启用CCR0中断
       TIMER_A_DO清除                    //清除值
       };

挥发性布尔值按钮已显示,按钮已显示1,按钮已显示2;
易失性内部STS,高速;
volatile isLedOn1, isLedOn2;
浮子乘数,乘数1;
Int period,period1,periodOn,periodOff,periodOn1, 周期偏移1;

内部主(无效)

   /*停止监视程序*/
   MAP_WDT_A_HoldTimer();

   /*将WFP 1.0 配置为输出,将WFP 1.1 (开关)配置为输入*/
   MAP_GPIO_setAsOutputPin (GPIO端口P1,GPIO _PIN0);
   MAP_GPIO_setAsOutputPin (GPIO端口P2,GPIO _PIN2);
   MAP_GPIO_setOutputLowOnPin (GPIO端口P1,GPIO _PIN0);
   MAP_GPIO_setOutputLowOnPin (GPIO端口P2,GPIO _PIN2);

   /*将WFP 1.1 配置为输入并启用中断*/
   MAP_GPIO_setAsInputPinWithPullUp阻 器(GPIO_PORT_P1, GPIO_PIN1);
   MAP_GPIO_setAsInputPinWithPullUp阻 器(GPIO_PORT_P1, GPIO_PIN4);
   MAP_GPIO清除InterruptFlag (GPIO端口P1,GPIO PIN1);
   MAP_GPIO清除InterruptFlag (GPIO端口P1,GPIO PIN4);
   MAP_GPIO_enableInterrupt (GPIO端口_P1,GPIO _PIN1);
   MAP_GPIO_enableInterrupt (GPIO端口P1,GPIO_PIN4);
   MAP_Interrupt_enableInterrupt (INT_Port1);

   /*为UP模式配置Timer_A0和Timer_A1 */
   MAP_Timer_a_configureUpMode(Timer_A0_base,&upConfig0);
   MAP_Timer_a_configureUpMode(Timer_A1_base,&upConfig1);

   /*启用中断并启动计时器*/
   MAP_Interrupt_enableInterrupt (INT_TA1_0);
   MAP_Interrupt_enableInterrupt (INT_TA0_0);

   MAP_Timer_a_startCounter (TIMER_A1_BASE,TIMER_A_UP_MODE);
   MAP_Timer_a_startCounter (TIMER_A0_BASE,TIMER_A_UP_MODE);

   /*启用主中断*/
   MAP_Interrupt_enableMaster();

   /*启用SRAM Bank Retention */
   map_sysctl_enableSRAMBankRetention (sysctl_SRAM_Bank1);

   MAP_Interrupt_DisableSleepOnIsrExit();

   STS = 0;
   buttonPressed =假;
   buttonPresed1 =假;
   buttonPresed2 =假;
   isLedOn1 =假;
   isLedOn2 =假;
   /*转至LPM3 */
   同时(1)
   {
       IF (buttonPresed1 == true)
       {

           如果(STS = 0)
           {
               乘数= 0.01 ;
           }
           否则,如果(STS = 1)
           {
               乘数= 0.25 ;
           }

           否则,如果(STS = 2)
           {
               乘数= 0.5 ;
           }

           周期= 0x2DC6;
           PeriodOn = Period *乘数;
           periodOff = period - periodOn;
           isLedOn1 =真;

           /*为UP模式配置Timer_A1 */
           MAP_Timer_a_configureUpMode(Timer_A1_base,&upConfig1);

           /*启用中断并启动计时器*/
           MAP_Interrupt_enableInterrupt (INT_TA1_0);

           MAP_Timer_a_startCounter (TIMER_A1_BASE,TIMER_A_UP_MODE);

       }

       IF (buttonPresed2 == true)
       {

           如果(STS = 0)
           {
               乘数1 = 0.02 ;
           }
           否则,如果(STS = 1)
           {
               乘数1 = 0.35 ;
           }

           否则,如果(STS = 2)
           {
               乘数1 = 0.45 ;
           }

           PERIOD1 = 0x54D6;
           周期1 =周期1 *乘以1;
           周期偏移1 =周期1 -周期1;

           isLedOn2 =真;
           /*为UP模式配置Timer_A1 */
           MAP_Timer_a_configureUpMode(Timer_A0_base,&upConfig0);

           /*启用中断并启动计时器*/
           MAP_Interrupt_enableInterrupt (INT_TA0_0);

           MAP_Timer_a_startCounter (TIMER_A0_BASE,TIMER_A_UP_MODE);
       }

       while (buttonPressed == false || buttonPresed1 == false || buttonPresed2 == false)
       {
           MAP_PCM_GotoLPM0();
       }

       buttonPressed =假;
       buttonPresed1 =假;
       buttonPresed2 =假;
   }
}

/* GPIO ISR */
void Port1_IRQHandler(void)

   UINT32_t状态;

   MAP_Timer_a_stopTimer (TIMER_A1_BASE);
   MAP_Timer_a_clearCaptureCompareInterrupt (timer_A1_base,timer_a_CAPTURECOMPare_register_0);

   MAP_Timer_a_stopTimer (TIMER_A0_BASE);
   MAP_Timer_a_clearCaptureCompareInterrupt (timer_A0_base,timer_a_CAPTURECOMPare_register_0);

   MAP_Interrupt_enableInterrupt (INT_TA1_0);
   MAP_Interrupt_enableInterrupt (INT_TA0_0);
   MAP_Timer_a_startCounter (TIMER_A1_BASE,TIMER_A_UP_MODE);
   MAP_Timer_a_startCounter (TIMER_A0_BASE,TIMER_A_UP_MODE);

   状态= gPIO_getEnabledInterruptStatus(GPIO_PORT_P1);
   MAP_GPIO清除InterruptFlag (GPIO端口P1,状态);

   IF (状态和GPIO _PIN1)
   {
       buttonPresed1 =真;
   }

   IF (状态和GPIO _PIN4)
   {
       buttonPresed2 =真;
   }

   高速++;
   IF (高速% 2 == 0)
   {
       STS = 0;
   }
   否则,如果(高速% 2 == 1)
   {
       STS = 1;
   }

   IF (高速% 3 == 2)
   {
       STS = 2;
   }
   buttonPressed =真;
   buttonPresed1 =真;
   buttonPresed2 =真;

}

void TA1_0_IRQHandler (void)

   MAP_Timer_a_stopTimer (TIMER_A1_BASE);
   MAP_Timer_a_clearCaptureCompareInterrupt (timer_A1_base,timer_a_CAPTURECOMPare_register_0);

   IF (isLedOn1 == true)
   {
       upConfig1.timerPeriod =周期关;
       MAP_GPIO_setOutputLowOnPin (GPIO端口P1,GPIO _PIN0);
   }
   否则
   {
       upConfig1.timerPeriod =周期打开;
       MAP_GPIO_setOutputHighOnPin (GPIO端口P1,GPIO _PIN0);
   }
   isLedOn1 =!isLedOn1;

   /*为UP模式配置Timer_A1 */
   MAP_Timer_a_configureUpMode(Timer_A1_base,&upConfig1);

   /*启用中断并启动计时器*/
   MAP_Interrupt_enableInterrupt (INT_TA1_0);

   MAP_Timer_a_startCounter (TIMER_A1_BASE,TIMER_A_UP_MODE);
}

void TA0_0_IRQHandler (void)

   MAP_Timer_a_stopTimer (TIMER_A0_BASE);
   MAP_Timer_a_clearCaptureCompareInterrupt (timer_A0_base,timer_a_CAPTURECOMPare_register_0);

   IF (isLedOn2 == true)
   {
       upConfig0.timerPeriod =周期偏移1;
       MAP_GPIO_setOutputLowOnPin (GPIO端口P2,GPIO _PIN2);
   }
   否则
   {
       upConfig0.timerPeriod =周期On1;
       MAP_GPIO_setOutputHighOnPin (GPIO端口P2,GPIO _PIN2);
   }
   isLedOn2 =!isLedOn2;

   /*为UP模式配置Timer_A1 */
   MAP_Timer_a_configureUpMode(Timer_A0_base,&upConfig0);

   /*启用中断并启动计时器*/
   MAP_Interrupt_enableInterrupt (INT_TA0_0);

   MAP_Timer_a_startCounter (TIMER_A0_BASE,TIMER_A_UP_MODE);
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    有些评论是错误的。 这使得对代码进行反向工程极其困难;当您更改代码时,请调整批注或删除它们。

    在文章中插入代码时,请使用"插入代码"按钮("</>")以使其格式正确。

    如果不调用gPIO_REPORTEdgeSelect(),则不定义是在上升边缘还是下降边缘获得中断。

    在主循环结束时,您正在清除所有buttonPresedX变量,因此循环开始时的检查将不起作用。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,
    感谢您的回复和反馈。 您对支持已被支持是正确的。 我的计时器仍未激活,因此无法切换PIN。 可能是我没有使用的gPIO_interruptEdgeSelect()的问题。 问题还没有解决。
    最佳,
    Alda
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    对于每一个需要实现类似目标的人来说,问题在于更好地重新组织每个函数的行,并修复buttonPresedX的状态。