我开发了一个使用lpc1769定时器生成脉冲(pwm)的应用程序。脉冲周期为10毫秒,脉冲宽度可根据需要变化。根据参考信号产生脉冲宽度,该参考信号是10毫秒的方波(开启周期为7.2毫秒,关闭周期为2.8毫秒)。每当有该信号的上升沿时,PWM脉冲应该开始。现在这个工作正常。为了检测上升沿,我使用GPIO中断和外部中断3,ISR如下:
1)如果GPIO引脚上的上升沿(P2.11)
2)清除引脚上的上升沿状态。
3)然后将计时器设置为几毫秒
和计时器ISR 1)清除任何未决的定时器IRQ 2)将GPIO引脚置为高电平,产生PWM脉冲(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。但在这种情况下不会发生这种情况。我不明白这种行为。 ////////////////////////////////////////////////// ////////////////////////////////////////////////// / 这是我的代码,这是外部中断3的ISR
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并启用外部中断。