#include "ti_msp_dl_config.h"
unsigned long count_timer = 0;
extern volatile uint32_t interruptVectors[];
int main(void)
{
SYSCFG_DL_init();
DL_SYSCTL_enableSleepOnExit();
NVIC_EnableIRQ(GPIO_SWITCHES_INT_IRQN);
NVIC_EnableIRQ(COMPARE_0_INST_INT_IRQN);
NVIC_EnableIRQ(TIMER_0_INST_INT_IRQN);
count_timer = 1500;
while (1) {
__WFI();
}
}
void GROUP1_IRQHandler(void)
{
uint32_t gpioA = DL_GPIO_getEnabledInterruptStatus
(GPIO_SWITCHES_PIN_18_PIN);
if ((gpioA & GPIO_SWITCHES_PIN_18_PIN) ==
GPIO_SWITCHES_PIN_18_PIN)
{
if (DL_GPIO_readPins(GPIO_SWITCHES_PORT, GPIO_SWITCHES_PIN_18_PIN ))
{
DL_TimerG_startCounter(COMPARE_0_INST);
DL_GPIO_setPins(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_1_PIN);
DL_GPIO_disableInterrupt(GPIOA, GPIO_SWITCHES_PIN_18_PIN);
}
DL_GPIO_clearInterruptStatus(GPIOA, GPIO_SWITCHES_PIN_18_PIN);
}
}
void COMPARE_0_INST_IRQHandler(void)
{
switch (DL_TimerG_getPendingInterrupt(COMPARE_0_INST)) {
case DL_TIMER_IIDX_ZERO:
if(count_timer>0)
{
count_timer = count_timer-1;
}
DL_TimerG_stopCounter(COMPARE_0_INST);
if (count_timer == 0)
{
DL_GPIO_clearPins(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_1_PIN);
DL_GPIO_enableInterrupt(GPIOA, GPIO_SWITCHES_PIN_18_PIN);
count_timer = 1500;
}else if (count_timer > 0)
{
DL_TimerG_startCounter(COMPARE_0_INST);
}
break;
default:
break;
}
}
代码的目的是在检测到 GPIO 中断后启动计时器并针对设置值"COUNT_TIMER"重复计时器操作。
当"COUNT_TIMER"达到0时、LED 会亮起。 但现在我想在重复计时器操作的同时禁用 GPIO 中断。
不过、以上代码在某些情况下无法正常工作。
在计时器开始工作之后(此时、引脚18为低电平)、在"COUNT_TIMER"达到0之前、再次将引脚18的输入设置为高电平。
如果您继续将其设置为高电平、直到"COUNT_TIMER"达到0、"COUNT_TIMER"在它变为0且进入 DL_GPIO_enableInterrupt ()的那一刻、将出现另一个中断、定时器将开始工作。
似乎当 DL_GPIO_enableInterrupt()运行时,进入挂起的 GPIO 中断,同时进入计时器中断。
当从禁用中断更改为启用中断时、如何防止暂挂中断运行并在启用中断后检测到中断触发?
除了 DL_GPIO_disableInterrupt ()和 DL_GPIO_enableInterrupt ()外,是否需要任何其他设置?