【目的】体验MCXA153的GPIO输入功能。
【实验步骤】
官方的SDK已经提供了按键中断的示例,这里直接导入他的工程,来体验。
1、点击导入SDK示例:
2、选择工程存放在的目录,选择driver_examples下面的gpio下的gpio_input_interrupt示例。
3、工程目录source下面的gpio_input_interrupt.c为用户主函数的文件。
4、函数中,先用宏对对应的PORT、PIN、中断进行了重新定义:
/******************************************************************************* * Definitions ******************************************************************************/ #define BOARD_LED_GPIO BOARD_LED_RED_GPIO #define BOARD_LED_GPIO_PIN BOARD_LED_RED_GPIO_PIN #define BOARD_SW_GPIO BOARD_SW2_GPIO #define BOARD_SW_GPIO_PIN BOARD_SW2_GPIO_PIN #define BOARD_SW_NAME BOARD_SW2_NAME #define BOARD_SW_IRQ BOARD_SW2_IRQ #define BOARD_SW_IRQ_HANDLER BOARD_SW2_IRQ_HANDLER
5、再定义了一个按健的标志位:
/* Whether the SW button is pressed */ volatile bool g_ButtonPress = false;
6、用户的中函数实现:
/*! * @brief Interrupt service fuction of switch. * * This function toggles the LED */ void BOARD_SW_IRQ_HANDLER(void) { /* Clear external interrupt flag. */ GPIO_GpioClearInterruptFlags(BOARD_SW_GPIO, 1U << BOARD_SW_GPIO_PIN); /* Change state of button. */ g_ButtonPress = true; SDK_ISR_EXIT_BARRIER; }
在中断回调中,先清除产生的标志位,然后把标志志为真。
7、main的代码如下:
/*! * @brief Main function */ int main(void) { /* Define the init structure for the input switch pin */ gpio_pin_config_t sw_config = { kGPIO_DigitalInput, 0, }; /* Define the init structure for the output LED pin */ gpio_pin_config_t led_config = { kGPIO_DigitalOutput, 0, }; CLOCK_EnableClock(kCLOCK_GateGPIO3); BOARD_InitPins(); BOARD_InitBootClocks(); BOARD_InitDebugConsole(); /* Print a note to terminal. */ PRINTF("\r\n GPIO Driver example\r\n"); PRINTF("\r\n Press %s to turn on/off a LED \r\n", BOARD_SW_NAME); /* Init input switch GPIO. */ GPIO_SetPinInterruptConfig(BOARD_SW_GPIO, BOARD_SW_GPIO_PIN, kGPIO_InterruptFallingEdge); EnableIRQ(BOARD_SW_IRQ); GPIO_PinInit(BOARD_SW_GPIO, BOARD_SW_GPIO_PIN, &sw_config); /* Init output LED GPIO. */ GPIO_PinInit(BOARD_LED_GPIO, BOARD_LED_GPIO_PIN, &led_config); while (1) { 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; } } }
主函数中,先定义了两个gpio结构体,一个为LED灯,一个为按键,分别定义为输出与输入。然后执行了板级的Init。
GPIO_SetPinInterruptConfig配置按键为下拉产生中断。
在while循环中,判断按键的标志,如果有按键按下,则进行LED的反转。
【实现效果】
按下按键后,在串口终端中提示按下,同时翻了LED灯。
GPIO Driver example
Press SW2 to turn on/off a LED
SW2 is pressed
SW2 is pressed
SW2 is pressed
SW2 is pressed
SW2 is pressed