GPIO demo

- 对于输入模式,每个GPIO并不同时支持上拉和下拉,仅支持上拉或下拉中的其中一种状态。在XY1100芯片中,GPIO10/11/12仅支持下拉,其余的GPIO仅支持上拉; - GPIO的中断触发方式,支持下降沿触发,双边沿触发,高电平触发,不支持上升沿触发。如果外部输入信号并不平稳,需要外部增加消抖电路,推荐电容大小为0.1uF; - 使用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