Прерывание не запускается.Есть идеи, почему это так? - PullRequest
0 голосов
/ 11 апреля 2019

Я программирую на C на MSP432, используя Code Composer Studio v8.2.0.

Теперь я пишу прерывание, чтобы использовать 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 ]

0 голосов
/ 12 апреля 2019

Я решил проблему, и я думаю, что знаю, что случилось. Порты теперь должны быть объявлены совершенно другим способом. Я почти уверен, что у меня есть обновленная версия 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);

Теперь это выглядит так.

0 голосов
/ 11 апреля 2019

Вы используете битовую маску 0x12 снова и снова, и она не подходит для битов, на которые ссылаются ваши комментарии.

В вашем распоряжении хороший отладчик.Пройдите по коду и убедитесь, что у вас есть правильные значения для всех ваших регистров.

Запустите код, нажмите кнопки, а затем приостановите отладчик, чтобы проверить, не попали ли вы в обработчик ошибок.

...