中断没有触发。关于为什么的任何想法?

时间:2019-04-11 02:04:53

标签: c code-composer msp432

我正在使用Code Composer Studio v8.2.0在MSP432上用C编程。

现在,我正在编写一个中断,以使用4个不同的按钮来递增和递减变量。下面的代码切出了其中两个按钮,并且只是在每次按下这两个按钮之一时试图将变量(TEST)的值增加或减少2。

我已经为某些旋转编码器编写了一些中断,这些中断编码器工作正常。据我所知,我使用了完全相同的代码(除了为按钮而不是编码器所做的明显更改之外),但这没有用。

按钮位于P1.1(编辑:表示1.2)和P1.4上。这段代码不会引发任何错误,但是中断不会被任何一个按钮触发,因此,变量根本不会更改值。

我已经迷失了目前的尝试。现在已经困扰了我大约5个小时。

#include "msp.h"
#include "driverlib.h"
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "grlib.h"
#include "button.h"
#include "imageButton.h"
#include "radioButton.h"
#include "checkbox.h"
#include <LcdDriver/kitronix320x240x16_ssd2119_spi.h>
#include "images/images.h"

int TEST = 0;

int main(void)
{
    WDT_A->CTL = WDT_A_CTL_PW | WDT_A_CTL_HOLD;     // stop watchdog timer

        boardInit();
        clockInit();
        initializeOptionsMenuButtons();
        __enable_interrupt();

        //Navigation Testing IO
        __disable_irq();

        P1->SEL1 &= ~0x12;  // select io function: P1.2 & P1.4
        P1->SEL0 &= ~0x12;
        P1->DIR &= ~0x12;  // set inputs
        P1->REN |= 0x12;  // enable pull resistors for P1.2 & P1.4
        P1->OUT &= ~0x12;  // need to set P2.3-P2.6 to low so PULLDOWN resistor will be selected
        P1->IES &= ~0x12;  // select low to high transition for interrupt
        P1->IFG = 0;  // clear interrupt register
        P1->IE  |= 0x12;  // enable interrupt for  P1.2 & P1.4

        NVIC_SetPriority(PORT1_IRQn,3);
        NVIC_EnableIRQ(PORT1_IRQn);
        __enable_irq();

        for(;;){
        }
}

void PORT1_IRQHandler(void) {
    if( P1->IFG & 0x02 ) { // UP (2.3) triggers interrupt
        if ( 2 <= TEST <= 11 ) {
            TEST = TEST - 2;
        }
    }

    if( P1->IFG & 0x10 ) { // DOWN (2.4) triggers interrupt
        if ( TEST <= 9 ) {
            TEST = TEST + 2;
        }
    }
    P1->IFG &= ~0x12;
}

取决于按下哪个按钮,称为TEST的变量应递增2或递减2。正如我之前所说,这不会发生,因为我放置在其中的中断不会触发。

任何帮助将不胜感激。我没主意了。

2 个答案:

答案 0 :(得分:0)

您一次又一次地使用位掩码0x12,对于您的注释所引用的位,它似乎并不正确。

您有一个好的调试器供您使用。逐步检查代码,并验证所有寄存器的值是否正确。

运行代码,按按钮,然后暂停调试器以查看是否最终出现在错误处理程序中。

答案 1 :(得分:0)

我解决了这个问题,我相信我知道发生了什么。现在必须以完全不同的方式声明端口。我敢肯定,我已经有了SDK的更新版本,这就是发生此更改的地方。谢谢大家的帮助。

    MAP_GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P1, GPIO_PIN1 | GPIO_PIN4);
    MAP_GPIO_clearInterruptFlag(GPIO_PORT_P1, GPIO_PIN1 | GPIO_PIN4);
    MAP_GPIO_enableInterrupt(GPIO_PORT_P1, GPIO_PIN1 | GPIO_PIN4);
    MAP_Interrupt_enableInterrupt(INT_PORT1);

现在看起来像这样。