使用示例
## 使用示例
```language
/**
* @file gpio_int_demo.c
* @ingroup peripheral
* @brief GPIO初始化Demo
* @attention
-# 对于输入模式,每个GPIO并不同时支持上拉和下拉,仅支持上拉或下拉中的其中一种状态。在XY1100芯片中,GPIO10/11/12仅支持下拉,其余的GPIO仅支持上拉;
-# GPIO的中断触发方式,支持下降沿触发,双边沿触发,高电平触发,不支持上升沿触发。如果外部输入信号并不平稳,需要外部增加消抖电路,推荐电容大小为0.1uF;
-# Analog模式目前尚未支持;
-# Open Drain(开漏输出)模式目前尚未支持;
-# 使用xy_GPIO_SetIOMode设置GPIO模式时,如果设置为普通GPIO模式,参数需配置成GPIO_MODE_GPIO_为前缀的选项,如果有外设映射到GPIO上,参数需要配置成GPIO_MODE_HW_为前缀的选项,其中,GPIO_MODE_HW_PER为硬件自动设置GPIO模式,配置成合适的模式,其他的为手动指定映射外设情况下的GPIO模式。
*
***********************************************************************************/
#include "softap_api.h"
#if DEMO_TEST
#include "xy_peripheral.h"
#define GPIO_INT_PIN GPIO_PIN_NUM_7
#define GPIO_INT_TASK_PRIORITY 10
#define GPIO_INT_STACK_SIZE 500
UINT32 g_gpio_int_TskHandle = -1;
UINT32 g_gpio_int_sem = -1;
void user_hook_gpio_int_handler(void)
{
}
void gpio_int_handler(void) __attribute__((section(".ramtext")));
/**
* @brief 这个是GPIO的中断服务函数
* @note 需要清理中断标志位
*/
void gpio_int_handler(void)
{
xy_GPIO_ReadAndClearIntFlag(GPIO_INT_PIN);
xy_Semaphore_Give(&g_gpio_int_sem);
}
/**
* @brief 这个函数是GPIO初始化函数
* @note 在配置IO前需要清空配置寄存器并开启外设时钟、
*
* @code
* xy_PRCM_ClockCmd(PRCM_CKG_CTL_GPIO, ENABLE);
xy_GPIO_ClearConfig(GPIO_INT_PIN);
xy_GPIO_SetIOMode(GPIO_INT_PIN, GPIO_MODE_GPIO_IN_PU);
xy_GPIO_IntTrigMode(GPIO_INT_PIN, GPIO_INT_TRIG_EDGE_FALL);
xy_NVIC_IntRegister(GPIO_IRQn, 1, gpio_int_handler);
xy_GPIO_IntCtl(GPIO_INT_PIN, ENABLE);
* @endcode
*/
void gpio_int_init(void)
{
xy_PRCM_ClockCmd(PRCM_CKG_CTL_GPIO, ENABLE);
xy_GPIO_ClearConfig(GPIO_INT_PIN);
xy_GPIO_SetIOMode(GPIO_INT_PIN, GPIO_MODE_GPIO_IN_PU);
xy_GPIO_IntTrigMode(GPIO_INT_PIN, GPIO_INT_TRIG_EDGE_FALL);
xy_Semaphore_Create(&g_gpio_int_sem);
xy_NVIC_IntRegister(GPIO_IRQn, 1, gpio_int_handler);
xy_GPIO_IntCtl(GPIO_INT_PIN, ENABLE);
}
/**
* @brief 这是GPIO工作线程
*
*/
void gpio_int_work_task(void)
{
while(1)
{
if( RET_OK == xy_Semaphore_Take(&g_gpio_int_sem, K_FOREVER) )
{
user_hook_gpio_int_handler();
}
}
}
/**
* @brief 这个函数为GPIOdemo提供了一个工作线程
*
* @return unsigned int
*/
unsigned int gpio_int_work_task_init(void)
{
UINT32 uwRet = LOS_NOK;
uwRet = xy_TaskCreate((TaskFunc_t)gpio_int_work_task, "gpio_int_work_task", GPIO_INT_STACK_SIZE, NULL, GPIO_INT_TASK_PRIORITY, &g_gpio_int_TskHandle);
return uwRet;
}
#endif
```