论武天地论坛

 找回密码
 立即注册
搜索
查看: 3669|回复: 0

2.04-外设篇-GPIO中断检测

[复制链接]

58

主题

58

帖子

244

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
244
发表于 2020-10-27 19:04:43 | 显示全部楼层 |阅读模式




NONOS(2.2.0)NONOS(2.2.0)
NONOS(2.2.0)
1.直接上菜
819239-20200521015207134-1610112148.png



void gpio0_intr_handler()
{
    uint32 gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS);//读取GPIO状态寄存器,获取中断信息
    GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status);//清除中断信息
    if(gpio_status & (BIT(0)))//GPIO0产生的中断
    {
        if(!GPIO_INPUT_GET(0))//GPIO0是低电平    GPIO0确实是下降沿产生了中断
        {
            os_printf("GpioDown\r\n");
        }
    }
}


/******************************************************************************
* FunctionName : user_init
* Description  : entry of user application, init user function here
* Parameters   : none
* Returns      : none
*******************************************************************************/
void ICACHE_FLASH_ATTR
user_init(void)
{
    uart_init_2(BIT_RATE_115200,BIT_RATE_115200);
    os_printf("SDK version:%s\n", system_get_sdk_version());
    os_printf("hello_ai\n");


    /*配置中断引脚**********************************************/
    PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U , FUNC_GPIO0);
    GPIO_DIS_OUTPUT(0);//如果以前设置过GPIO为输出,则调用此函数关闭GPIO输出
    PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO0_U);//上拉输入
    //全局关闭GPIO中断
    ETS_GPIO_INTR_DISABLE();
    //设置中断函数
    ETS_GPIO_INTR_ATTACH(gpio0_intr_handler, NULL);
    //设置中断触发方式
    gpio_pin_intr_state_set(0, GPIO_PIN_INTR_NEGEDGE);//下降沿触发
    ETS_GPIO_INTR_ENABLE();
}


测试
按下按钮

819239-20191214012818567-378588875.png

819239-20200213234502723-1935723857.png

RTOS(2.2.0)RTOS(2.2.0)
RTOS(2.2.0)
1.直接上菜
819239-20200213234118515-1823411023.png



#include "gpio.h"
//设置GPIO0下降沿中断
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U , FUNC_GPIO0);//GPIO0做为普通IO使用
    GPIO_DIS_OUTPUT(0);//0:GPIO0    如果以前设置过GPIO为输出,则调用此函数关闭GPIO0输出
    PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO0_U);//GPIO0上拉输入


    _xt_isr_mask(1<<ETS_GPIO_INUM);    //关闭GPIO中断
    gpio_intr_handler_register(gpio0_intr_handler, NULL);//设置中断函数
    gpio_pin_intr_state_set(0, GPIO_PIN_INTR_NEGEDGE);//0:GPIO0        GPIO_PIN_INTR_NEGEDGE:下降沿触发
    _xt_isr_unmask(1 << ETS_GPIO_INUM); //使能GPIO中断


//GPIO0中断回调函数
void gpio0_intr_handler()
{
    uint32 gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS);//读取GPIO状态寄存器,获取中断信息
    GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status);//清除中断信息
    if(gpio_status & (BIT(0)))//GPIO0产生的中断
    {
        if(!GPIO_INPUT_GET(0))//GPIO0是低电平    GPIO0确实是下降沿产生了中断
        {
            printf("GpioDown\r\n");
        }
    }
}

如果使用的NONOS版本请查看文章最后的区别

测试
按下按钮




扩展:配置GPIO4
//设置GPIO4下降沿中断

PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U , FUNC_GPIO4);//GPIO4做为普通IO使用
    GPIO_DIS_OUTPUT(4);//4:GPIO4    如果以前设置过GPI4为输出,则调用此函数关闭GPIO4输出
    PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO4_U);//GPIO4上拉输入


    _xt_isr_mask(1<<ETS_GPIO_INUM);    //关闭GPIO中断
    gpio_intr_handler_register(gpio4_intr_handler, NULL);//设置中断函数
    gpio_pin_intr_state_set(4, GPIO_PIN_INTR_NEGEDGE);//4:GPIO4        GPIO_PIN_INTR_NEGEDGE:下降沿触发
    _xt_isr_unmask(1 << ETS_GPIO_INUM); //使能GPIO中断


//GPIO4中断回调函数

void gpio4_intr_handler()
{
    uint32 gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS);//读取GPIO状态寄存器,获取中断信息
    GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status);//清除中断信息
    if(gpio_status & (BIT(4)))//GPIO4产生的中断
    {
        if(!GPIO_INPUT_GET(4))//GPIO4是低电平    GPIO4确实是下降沿产生了中断
        {
            printf("GpioDown\r\n");
        }
    }
}



copycode.gif
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|论武天地论坛

GMT+8, 2024-3-29 21:42 , Processed in 0.080760 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表