我开发了一个应用程序来使用 lpc1769 的定时器生成脉冲(pwm)。脉冲周期为10毫秒,脉冲宽度可根据需要变化。脉冲宽度是根据参考信号产生的,参考信号是 10 毫秒的方波(开启周期为 7.2 毫秒,关闭周期为 2.8 毫秒)。只要有这个信号的上升沿,PWM 脉冲就应该启动。现在这工作正常。为了检测上升沿,我使用了带有外部中断 3 的 GPIO 中断,ISR 如下:
1) 如果 GPIO 引脚上的上升沿(P2.11)
2) 清除引脚上的上升沿状态。
3)然后将计时器设置为几毫秒
并在定时器 ISR 中 1)清除任何挂起的定时器 IRQ 2)使产生 PWM 脉冲的 GPIO 引脚为高电平(P2.6) 3)将定时器设置为几毫秒,然后清除引脚(P2.6)(相同的定时器在两个 ISR 中都使用) 4)禁用定时器并重新启用 GPIO 引脚(P2.11)上的上升沿中断,因此在参考信号的上升沿再次提供外部中断 3 的 ISR,并继续如上。
现在我在开发应用程序的代码中遇到了问题,
1) 如果上升沿禁用中断并将定时器设置为 8 毫秒延迟。
2) 在定时器 ISR 产生 10 个 pwm 周期后,重新启用外部中断。(两个 ISR 使用相同的计时器)。
3)所以我的输出应该是相对于参考信号的上升沿延迟 8 毫秒,然后是 10 个 pwm 周期(都具有 10ms 的时间段),再是相对于参考信号的上升沿和 10 个 pwm 周期的 8ms 延迟。
但是在 10 个周期后,当我重新启用外部中断时,无论参考信号的上升沿如何,都会增加 8ms 的延迟。每当最后 10 个周期完成时,我都会再次启用中断,所以从这一点开始,它只会增加 8ms 的延迟。我的问题是,如果为参考信号的上升沿启用中断,那么它应该只为上升沿提供 ISR。但在这种情况下不会发生这种情况。我不理解这种行为。///////////////////////////////////////// ///////////////////////////////////////// / 这是我的代码,这是外部中断的 ISR3
void GPIO_IRQ_HANDLER(void)
{
uit32_t i;
if(((Chip_GPIOINT_GetStatusRising(LPC_GPIOINT, GPIO_INTERRUPT1_PORT) >> GPIO_INTERRUPT1_PIN) & 0x01) != 0) /*Group 1*/
{
count1 = 0;
start_timer1((HALF_WAVE_PERIOD - DELAY) * timerTick);
NVIC_ClearPendingIRQ(GPIO_INTERRUPT_NVIC_NAME);
NVIC_DisableIRQ(GPIO_INTERRUPT_NVIC_NAME);
}
}
Timer1 ISR 是
void TIMER1_IRQHandler(void)
{
if (Chip_TIMER_MatchPending(LPC_TIMER1, 1) == 0)
{
return;
}
Chip_TIMER_ClearMatch(LPC_TIMER1, 1);
if(count1 > 10)
{
LPC_GPIO1->PIN = (LPC_GPIO1->PIN & ~(1 << 19));
stop_timer1();
}
else
{
switch(state1)
{
case 1:
state1 = 2;
LPC_GPIO1->PIN = (LPC_GPIO1->PIN | (1 << 19));
set_timer1(2000 * timerTick);
break;
case 2:
state1 = 1;
LPC_GPIO1->PIN = (LPC_GPIO1->PIN & ~(1 << 19));
count1++;
set_timer1((HALF_WAVE_PERIOD - DELAY) * timerTick);
break;
default:
break;
}
}
}
where,
HALF_WAVE_PERIOD = 10000 microseconds
DELAY = 2800 microseconds
GPIO_INTERRUPT1_PORT= PORT2
GPIO_INTERRUPT1_PIN = P2.12
GPIO_INTERRUPT_NVIC_NAME = EINT3_IRQn
GPIO_IRQ_HANDLER = EINT3_IRQHandler
和函数 start_timer1 用于初始化 timer1 并将 timer1 设置为给定数量的滴答声和匹配中断。set_timer1 :为给定的滴答声和中断设置 timer1。stop_timer1 :禁用 timer1 并启用外部中断 3。