- 定义了LED和按钮对应的GPIO引脚。
- 声明了用于标记按钮按下状态的变量。
3.中断服务函数实现:
*!
* @brief Interrupt service fuction of switch.
*
* This function toggles the LED
*/
void BOARD_SW_IRQ_HANDLER(void)
{
if(GPIO_PinGetInterruptFlag(GPIO0,6))
{
#if (defined(FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && FSL_FEATURE_PORT_HAS_NO_INTERRUPT) || \
(!defined(FSL_FEATURE_SOC_PORT_COUNT))
/* Clear external interrupt flag. */
GPIO_GpioClearInterruptFlags(BOARD_SW_GPIO, 1U << BOARD_SW_GPIO_PIN);
#else
/* Clear external interrupt flag. */
GPIO_PortClearInterruptFlags(BOARD_SW_GPIO, 1U << BOARD_SW_GPIO_PIN);
#endif
/* Change state of button. */
g_ButtonPress = true;
}
if(GPIO_PinGetInterruptFlag(GPIO0,29))
{
#if (defined(FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && FSL_FEATURE_PORT_HAS_NO_INTERRUPT) || \
(!defined(FSL_FEATURE_SOC_PORT_COUNT))
/* Clear external interrupt flag. */
GPIO_GpioClearInterruptFlags(GPIO0, 1U << 29);
#else
/* Clear external interrupt flag. */
GPIO_PortClearInterruptFlags(BOARD_SW_GPIO, 1U << BOARD_SW_GPIO_PIN);
#endif
/* Change state of button. */
g_ButtonPress1 = true;
}
if(GPIO_PinGetInterruptFlag(GPIO1,23))
{
#if (defined(FSL_FEATURE_PORT_HAS_NO_INTERRUPT) && FSL_FEATURE_PORT_HAS_NO_INTERRUPT) || \
(!defined(FSL_FEATURE_SOC_PORT_COUNT))
/* Clear external interrupt flag. */
GPIO_GpioClearInterruptFlags(GPIO1, 1U << 23);
#else
/* Clear external interrupt flag. */
GPIO_PortClearInterruptFlags(BOARD_SW_GPIO, 1U << BOARD_SW_GPIO_PIN);
#endif
/* Change state of button. */
g_ButtonPress2 = true;
}
SDK_ISR_EXIT_BARRIER;
}
void GPIO10_IRQHandler(void)
{
if(GPIO_PinGetInterruptFlag(GPIO1,23))
{
/* Clear external interrupt flag. */
GPIO_GpioClearInterruptFlags(GPIO1, 1U << 23);
/* Change state of button. */
g_ButtonPress2 = true;
}
SDK_ISR_EXIT_BARRIER;
}
4.主函数实现:
/*!
* @brief Main function
*/
int main(void)
{
/* Define the init structure for the output LED pin*/
gpio_pin_config_t led_config = {
kGPIO_DigitalOutput,
0,
};
/* Define the init structure for the input switch pin */
gpio_pin_config_t sw_config = {
kGPIO_DigitalInput,
0,
};
/* Board pin, clock, debug console init */
/* attach FRO 12M to FLEXCOMM4 (debug console) */
CLOCK_SetClkDiv(kCLOCK_DivFlexcom4Clk, 1u);
CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);
/* enable clock for GPIO*/
CLOCK_EnableClock(kCLOCK_Gpio0);
CLOCK_EnableClock(kCLOCK_Gpio1);
BOARD_InitPins();
BOARD_InitBootClocks();
BOARD_InitDebugConsole();
/* Print a note to terminal. */
PRINTF("\r\n GPIO Driver example\r\n");
PRINTF("\r\n The LED is blinking.\r\n");
GPIO_SetPinInterruptConfig(BOARD_SW_GPIO, BOARD_SW_GPIO_PIN, kGPIO_InterruptFallingEdge);
GPIO_SetPinInterruptConfig(GPIO0, 29, kGPIO_InterruptFallingEdge);
GPIO_SetPinInterruptChannel(GPIO0, 29,kGPIO_InterruptOutput0);
GPIO_SetPinInterruptConfig(GPIO1, 23, kGPIO_InterruptFallingEdge);
GPIO_SetPinInterruptChannel(GPIO1, 23,kGPIO_InterruptOutput0);
EnableIRQ(BOARD_SW_IRQ);
EnableIRQ(GPIO10_IRQn);
GPIO_PinInit(BOARD_SW_GPIO, BOARD_SW_GPIO_PIN, &sw_config);
GPIO_PinInit(GPIO0, 29, &sw_config);
GPIO_PinInit(GPIO1, 23, &sw_config);
GPIO_PinInit(BOARD_LED_GPIO, BOARD_LED_GPIO_PIN, &led_config);
GPIO_PinInit(GPIO0, 25, &led_config);
GPIO_PinInit(GPIO0, 26, &led_config);
while (1)
{
// delay();
// GPIO_PortToggle(BOARD_LED_GPIO, 1u << BOARD_LED_GPIO_PIN);
// GPIO_PortToggle(GPIO0, 1u << 25);
// GPIO_PortToggle(GPIO0, 1u << 26);
if (g_ButtonPress)
{
PRINTF(" %s is pressed \r\n", BOARD_SW_NAME);
/* Toggle LED. */
GPIO_PortToggle(BOARD_LED_GPIO, 1U << BOARD_LED_GPIO_PIN);
/* Reset state of button. */
g_ButtonPress = false;
}
if (g_ButtonPress1)
{
PRINTF(" %s is pressed \r\n", "GPIO0_29");
/* Toggle LED. */
GPIO_PortToggle(GPIO0, 1u << 25);
/* Reset state of button. */
g_ButtonPress1 = false;
}
if (g_ButtonPress2)
{
PRINTF(" %s is pressed \r\n", "GPIO0_23");
/* Toggle LED. */
GPIO_PortToggle(GPIO0, 1u << 26);
/* Reset state of button. */
g_ButtonPress2 = false;
}
}
}