Прерывание не запускается. Есть идеи, почему это так?
Я программирую на 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 ответа
Вы используете битовую маску 0x12 снова и снова, и она не подходит для битов, на которые ссылаются ваши комментарии.
В вашем распоряжении хороший отладчик. Просмотрите ваш код и убедитесь, что у вас есть правильные значения для всех ваших регистров.
Запустите код, нажмите кнопки, а затем приостановите отладчик, чтобы проверить, не попали ли вы в обработчик ошибок.
Я решил проблему, и я верю, что знаю, что случилось. Порты теперь должны быть объявлены совершенно другим способом. Я почти уверен, что у меня есть обновленная версия 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);
Теперь это выглядит так.