/*! * \file gpio.c * * \brief Target gpio implementation * * \copyright Revised BSD License, see section \ref LICENSE. * * \code * * _ __ _ ________ _ * | |/ /(_)___ / ____/ /_ (_)___ * | // / __ \/ / / __ \/ / __ \ * / |/ / / / / /___/ / / / / /_/ / * /_/|_/_/_/ /_/\____/_/ /_/_/ .___/ * /_/ * (C) 2022-2025 XinChip * * \endcode * * \author ( XinChip ) Alex-J * * \author ( XinChip ) */ /*----------------------------------------------------------------------------------- INCLUDE HEADE FILES ------------------------------------------------------------------------------------*/ #include "gpio.h" #include "xc_drv_gpio.h" /*------------------------------------------------------------------------------------ Macros -------------------------------------------------------------------------------------*/ #define LED1_PIN GPIO_25 #define LED2_PIN GPIO_24 #define KEY1_PIN GPIO_33 #define KEY2_PIN GPIO_8 /*------------------------------------------------------------------------------------ Global Variables -------------------------------------------------------------------------------------*/ uint8_t gpio_intr_flag = false; uint64_t intr_val = 0; /*------------------------------------------------------------------------------------ Func Prototype -------------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------------ Functions -------------------------------------------------------------------------------------*/ /** * @brief gpio_demo * @details * @param void * @retval void */ void gpio_demo(void) { DEBUG("__GPIO_DEMO__\r"); GPIO_InitCfg_t GPIO_InitCfg = { 0 }; GPIO_InitCfg.Mux = GPIO_Mux0; GPIO_InitCfg.FunSel = GPIO_Dx; GPIO_InitCfg.Pull = GPIO_PULLUP; // Board Led1 Initialization GPIO_InitCfg.Dir = GPIO_DIR_OUTPUT; GPIO_InitCfg.Int = NOT_INT; GPIO_InitCfg.Pin = LED1_PIN; xc_gpio_init(&GPIO_InitCfg); // Board Led2 Initialization GPIO_InitCfg.Pin = LED2_PIN; xc_gpio_init(&GPIO_InitCfg); // Board Key1 Initialization GPIO_InitCfg.Dir = GPIO_DIR_INPUT; GPIO_InitCfg.Int = FAIL_EDGE_INT; GPIO_InitCfg.Pin = KEY1_PIN; xc_gpio_init(&GPIO_InitCfg); // Board Key2 Initialization GPIO_InitCfg.Pin = KEY2_PIN; xc_gpio_init(&GPIO_InitCfg); // Gpio NVIC Enable NVIC_EnableIRQ(GPIO_IRQn); xc_gpio_write_pin(LED1_PIN, GPIO_PIN_SET); xc_gpio_write_pin(LED2_PIN, GPIO_PIN_SET); while(1) { if(gpio_intr_flag == true) { DEBUG("Intr Status Val: 0x%016llx\n", intr_val); gpio_intr_flag = false; } delay_ms(100); xc_gpio_toggle_pin(LED1_PIN); } } /** * @brief gpio_intr_callback * @details Gpio interrupt callback function * @param void * @retval void */ __RAM_CODE void gpio_intr_callback(uint64_t intr_sta) { intr_val = intr_sta; gpio_intr_flag = true; // Determine the interrupt of Key1 if((intr_sta & ((uint64_t)1 << KEY1_PIN)) != 0) { xc_gpio_toggle_pin(LED1_PIN); } // Determine the interrupt of Key=2 if((intr_sta & (1 << KEY2_PIN)) != 0) { xc_gpio_toggle_pin(LED2_PIN); } } void gpio_pulldown_input_test(void) { //input test GPIO_InitCfg_t GPIO_InitCfg = { 0 }; GPIO_InitCfg.Mux = GPIO_Mux0; GPIO_InitCfg.FunSel = GPIO_Dx; GPIO_InitCfg.Dir = GPIO_DIR_INPUT; GPIO_InitCfg.Int = NOT_INT; GPIO_InitCfg.Pull = GPIO_PULLDOWN; for(uint8_t i = 0;i < 8; i++) { GPIO_InitCfg.Pin = i; xc_gpio_init(&GPIO_InitCfg); } while(1) { for(uint8_t i = 0;i < 8; i++) { DEBUG("gaio [%d] Val: %d\r\n", i,xc_gpio_read_pin(i)); for(int i=0;i<0x45500;i++); } } } void gpio_pullup_input_test(void) { //input test GPIO_InitCfg_t GPIO_InitCfg = { 0 }; GPIO_InitCfg.Mux = GPIO_Mux0; GPIO_InitCfg.FunSel = GPIO_Dx; GPIO_InitCfg.Dir = GPIO_DIR_INPUT; GPIO_InitCfg.Int = NOT_INT; GPIO_InitCfg.Pull = GPIO_PULLUP; for(uint8_t i = 0;i < 8; i++) { GPIO_InitCfg.Pin = i; xc_gpio_init(&GPIO_InitCfg); } while(1) { for(uint8_t i = 0;i < 8; i++) { DEBUG("gaio [%d] Val: %d\r\n", i,xc_gpio_read_pin(i)); for(int i=0;i<0x45500;i++); } } } void gpio_nopull_input_test(void) { //input test GPIO_InitCfg_t GPIO_InitCfg = { 0 }; GPIO_InitCfg.Mux = GPIO_Mux0; GPIO_InitCfg.FunSel = GPIO_Dx; GPIO_InitCfg.Dir = GPIO_DIR_INPUT; GPIO_InitCfg.Int = NOT_INT; GPIO_InitCfg.Pull = GPIO_NOPULL; for(uint8_t i = 0;i < 8; i++) { GPIO_InitCfg.Pin = i; xc_gpio_init(&GPIO_InitCfg); } while(1) { for(uint8_t i = 0;i < 8; i++) { DEBUG("gaio [%d] Val: %d\r\n", i,xc_gpio_read_pin(i)); for(int i=0;i<0x45500;i++); } } } void gpio_pulldown_input_inter_test(void) { //input test GPIO_InitCfg_t GPIO_InitCfg = { 0 }; GPIO_InitCfg.Mux = GPIO_Mux0; GPIO_InitCfg.FunSel = GPIO_Dx; GPIO_InitCfg.Dir = GPIO_DIR_INPUT; GPIO_InitCfg.Int = RIS_EDGE_INT; GPIO_InitCfg.Pull = GPIO_PULLDOWN; for(uint8_t i = 0;i < 8; i++) { GPIO_InitCfg.Pin = i; xc_gpio_init(&GPIO_InitCfg); } // Gpio NVIC Enable NVIC_EnableIRQ(GPIO_IRQn); while(1) { if(gpio_intr_flag == true) { DEBUG("Intr Status Val: 0x%016llx\n", intr_val); gpio_intr_flag = false; } } } void gpio_pullup_input_inter_test(void) { //input test GPIO_InitCfg_t GPIO_InitCfg = { 0 }; GPIO_InitCfg.Mux = GPIO_Mux0; GPIO_InitCfg.FunSel = GPIO_Dx; GPIO_InitCfg.Dir = GPIO_DIR_INPUT; GPIO_InitCfg.Int = FAIL_EDGE_INT; GPIO_InitCfg.Pull = GPIO_PULLUP; for(uint8_t i = 0;i < 8; i++) { GPIO_InitCfg.Pin = i; xc_gpio_init(&GPIO_InitCfg); } // Gpio NVIC Enable NVIC_EnableIRQ(GPIO_IRQn); while(1) { if(gpio_intr_flag == true) { DEBUG("Intr Status Val: 0x%016llx\n", intr_val); gpio_intr_flag = false; } } } void gpio_output_test(void) { GPIO_InitCfg_t GPIO_InitCfg = { 0 }; GPIO_InitCfg.Mux = GPIO_Mux0; GPIO_InitCfg.FunSel = GPIO_Dx; GPIO_InitCfg.Pull = GPIO_PULLDOWN; GPIO_InitCfg.Dir = GPIO_DIR_OUTPUT; GPIO_InitCfg.Int = NOT_INT; for(uint8_t i = 0;i < 8; i++) { GPIO_InitCfg.Pin = i; xc_gpio_init(&GPIO_InitCfg); xc_gpio_write_pin(i,GPIO_PIN_RESET); } for(int i=0;i<0x455000;i++); for(uint8_t i = 0;i < 8; i++) { xc_gpio_write_pin(i,GPIO_PIN_SET); } for(int i=0;i<0x455000;i++); for(uint8_t i = 0;i < 8; i++) { GPIO_InitCfg.Pin = i; xc_gpio_init(&GPIO_InitCfg); xc_gpio_write_pin(i,GPIO_PIN_RESET); } }