Files
youled63d_bluetooth/project/example/driver/gpio/app/src/gpio.c
T
moyuhai 966451d245 V1.0
2026-06-11 13:04:09 +08:00

282 lines
7.4 KiB
C

/*!
* \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);
}
}