1. 首页
  2. 编程语言
  3. C
  4. LPC55S69外部中断PINT例子解决重复问题并增加含义

LPC55S69外部中断PINT例子解决重复问题并增加含义

上传者: 2023-03-11 07:29:31上传 ZIP文件 5.04MB 热度 14次
LPC55S69通过上升沿触发ISP按键,实现按一下亮蓝灯,再按一下灭灯的操作。在本例子中,我们使用外部中断PINT来实现按键的检测。使用PINT的好处在于,不需要轮询检测按键状态,可以大大提高检测效率,降低功耗。具体的实现流程和代码解释,可以参考下面的内容。

代码示例:

#include "fsl_common.h"
#include "fsl_gpio.h"
#include "fsl_pint.h"

#define EXAMPLE_PINT_PIN_INT         (kPINT_PinInt0)
#define EXAMPLE_SW_GPIO              GPIO
#define EXAMPLE_SW_GPIO_PORT         1U
#define EXAMPLE_SW_GPIO_PIN          11U
#define EXAMPLE_LED_GPIO             GPIO
#define EXAMPLE_LED_GPIO_PORT        0U
#define EXAMPLE_LED_GPIO_PIN         29U
#define EXAMPLE_PINT_PIN_IRQ_HANDLER PINT_PinInterruptHandler
#define EXAMPLE_PINT_IRQn            PIN_INT0_IRQn

static volatile bool s_PinInterruptDetected = false;

void EXAMPLE_PINT_PIN_IRQ_HANDLER(void)
{
    /* Clear external interrupt flag. */
    PINT_ClearExternalInterruptFlags(EXAMPLE_PINT_PIN_INT);

    /* Set Pin Interrupt flag. */
    s_PinInterruptDetected = true;
}

void EXTI_Init(void)
{
    /* Initialize PINT */
    PINT_Init(PINT);

    /* Setup Pin Interrupts */
    PINT_PinInterruptConfig_t pinInterruptCfg;
    pinInterruptCfg.enablePullResistor = kPINT_PullResistorDisabled;
    pinInterruptCfg.hysteresis = kPINT_HysteresisDisabled;
    pinInterruptCfg.filterRefEnable = kPINT_FilterPwmEnabled;
    pinInterruptCfg.filterEnable = kPINT_FilterEnabled;
    pinInterruptCfg.interruptMode = kPINT_InterruptFallingEdge;
    PINT_PinInterruptConfig(EXAMPLE_PINT_PIN_INT, &pinInterruptCfg);

    /* Enable Interrupts */
    EnableIRQ(EXAMPLE_PINT_IRQn);
}

void LPC_GPIO_Init(void)
{
    /* Initialize GPIO */
    GPIO_PortInit(EXAMPLE_SW_GPIO, EXAMPLE_SW_GPIO_PORT);
    GPIO_PortInit(EXAMPLE_LED_GPIO, EXAMPLE_LED_GPIO_PORT);

    /* Configure switch pin */
    gpio_pin_config_t sw_config = {
        kGPIO_DigitalInput,
        0,
        kGPIO_IntRisingOrFallingEdge,
    };
    GPIO_PinInit(EXAMPLE_SW_GPIO, EXAMPLE_SW_GPIO_PIN, &sw_config);

    /* Configure LED pin */
    gpio_pin_config_t led_config = {
        kGPIO_DigitalOutput,
        1,
        kGPIO_NoIntmode,
    };
    GPIO_PinInit(EXAMPLE_LED_GPIO, EXAMPLE_LED_GPIO_PIN, &led_config);
}

void LPC_GPIO_Toggle(void)
{
    /* Toggle LED pin */
    GPIO_PortToggle(EXAMPLE_LED_GPIO, 1u << EXAMPLE_LED_GPIO_PIN);
}

void LPC_GPIO_EnableIRQ(void)
{
    /* Setup External Interrupts */
    EXTI_Init();
}

void LPC_GPIO_DisableIRQ(void)
{
    /* Disable all external interrupts */
    PINT_PinInterruptConfig(EXAMPLE_PINT_PIN_INT, NULL);
}

void LPC_GPIO_Main(void)
{
    if (s_PinInterruptDetected)
    {
        /* Clear Pin Interrupt flag. */
        s_PinInterruptDetected = false;

        /* Toggle LED */
        LPC_GPIO_Toggle();
    }
}

int main(void)
{
    /* Initialize GPIO */
    LPC_GPIO_Init();

    /* Enable Interrupts */
    LPC_GPIO_EnableIRQ();

    while (1)
    {
        /* Main function to handle GPIO events */
        LPC_GPIO_Main();
    }

    return 0;
}

下载地址
用户评论