LPC55S69外部中断PINT例子解决重复问题并增加含义
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;
}
下载地址
用户评论