为LPC1769写入GPIO中断

时间:2016-01-21 04:30:01

标签: c embedded lpc nxp-microcontroller

我开发了一个使用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并启用外部中断。

0 个答案:

没有答案