/* * Copyright (c) 2015, Freescale Semiconductor, Inc. * Copyright 2016-2017 NXP * All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ #include "board.h" #include "fsl_debug_console.h" #include "fsl_gpio.h" #include "fsl_common.h" #include "pin_mux.h" #include "clock_config.h" /******************************************************************************* * Definitions ******************************************************************************/ #define EXAMPLE_LED_GPIO BOARD_USER_LED_GPIO #define EXAMPLE_LED_GPIO_PIN BOARD_USER_LED_GPIO_PIN #define EXAMPLE_DELAY_COUNT 8000000 #define EXAMPLE_SW_GPIO BOARD_USER_BUTTON_GPIO #define EXAMPLE_SW_GPIO_PIN BOARD_USER_BUTTON_GPIO_PIN #define EXAMPLE_SW_IRQ BOARD_USER_BUTTON_IRQ #define EXAMPLE_GPIO_IRQHandler BOARD_USER_BUTTON_IRQ_HANDLER #define EXAMPLE_SW_NAME BOARD_USER_BUTTON_NAME /******************************************************************************* * Prototypes ******************************************************************************/ /*! * @brief delay a while. */ void delay(void); volatile bool g_InputSignal = true; /******************************************************************************* * Variables ******************************************************************************/ /* The PIN status */ volatile bool g_pinSet = false; /******************************************************************************* * Code ******************************************************************************/ void delay(void) { volatile uint32_t i = 0; for (i = 0; i < 1000000; ++i) { __asm("NOP"); /* delay */ } } /*! * @brief Main function */ void EXAMPLE_GPIO_IRQHandler(void) { PRINTF("inside IRQ handler...\r\n"); /* clear the interrupt status */ GPIO_PortClearInterruptFlags(EXAMPLE_SW_GPIO, 1U << EXAMPLE_SW_GPIO_PIN); /* Change state of switch. */ g_InputSignal = true; /* Add for ARM errata 838869, affects Cortex-M4, Cortex-M4F Store immediate overlapping exception return operation might vector to incorrect interrupt */ #if defined __CORTEX_M && (__CORTEX_M == 4U) __DSB(); #endif } int main(void) { /* Define the init structure for the input switch pin */ gpio_pin_config_t sw_config = { kGPIO_DigitalInput, 0, kGPIO_IntRisingEdge, }; /* hardware initialiize, include IOMUX, Uart debug initialize */ BOARD_ConfigMPU(); BOARD_InitPins(); BOARD_BootClockRUN(); BOARD_InitDebugConsole(); PRINTF("GPIO Driver example.\r\n"); /* Init input switch GPIO. */ EnableIRQ(EXAMPLE_SW_IRQ); GPIO_PinInit(EXAMPLE_SW_GPIO, EXAMPLE_SW_GPIO_PIN, &sw_config); /* Enable GPIO pin interrupt */ GPIO_PortEnableInterrupts(EXAMPLE_SW_GPIO, 1U << EXAMPLE_SW_GPIO_PIN); while (1) { if (g_InputSignal) { delay(); if (1 == GPIO_PinRead(EXAMPLE_SW_GPIO, EXAMPLE_SW_GPIO_PIN)) { PRINTF("%s is turned on.\r\n", EXAMPLE_SW_NAME); } /* Reset state of switch. */ g_InputSignal = false; } } }