1

我开发了一个应用程序来使用 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。

4

0 回答 0