101-SLM130(NB-IOT)C-SDK(OpenCPU)学习开发-GPIO输入检测,中断

2022-04-29 17:10:33 浏览数 (1)

说明(一定要看完上一节)

1,BOOT按键连接了GPIO1, 咱就用这个引脚做测试

配置GPIO1为输入模式

代码语言:javascript复制
#include <stdio.h>
#include "app.h"
#include "bsp.h"
#include "bsp_custom.h"
#include "pad_ec616.h"
#include "gpio_ec616.h"

#define GPIO_PIN_NUMBER    (1) //GPIO编号

#define GPIO_PORT          (GPIO_PIN_NUMBER/16) //在哪个端口上(P0 / P1 / P2)
#define GPIO_PIN           (GPIO_PIN_NUMBER) //在端口上的编号

#define GPIO_PAD_INDEX     (12) //引脚对应的PAD地址, 这个看手册哈
#define GPIO_PAD_ALT_FUNC  (PAD_MuxAlt0) //使用其第几功能

void gpio_init(void)
{
    /*配置GPIO的功能*/
    pad_config_t padConfig;
    PAD_GetDefaultConfig(&padConfig);

    padConfig.mux = GPIO_PAD_ALT_FUNC;//设置使用其第几功能
    PAD_SetPinConfig(GPIO_PAD_INDEX, &padConfig);//配置PAD
    PAD_SetPinPullConfig(GPIO_PAD_INDEX, PAD_InternalPullUp);//设置内部上下拉

    /*配置GPIO的输入输出初始化*/
    gpio_pin_config_t config;
    config.pinDirection = GPIO_DirectionInput;//输入模式

    GPIO_PinConfig(GPIO_PORT, GPIO_PIN, &config);//配置
}

uint32_t value=0;
void main_entry(void)
{
    BSP_CommonInit();//官方底层初始化函数,默认写上就可以
    BSP_CustomInit();//配置串口打印
    gpio_init();
    while (1)
    {
        value  = value 1;
        if (value>1000000)//延时一会,避免疯狂打印
        {
            value=0;
            printf("leven=%drn",GPIO_PinRead(GPIO_PORT,GPIO_PIN));//打印引脚电平
        }
    }
}

配置GPIO1为中断模式(下降沿触发)

代码语言:javascript复制
#include <stdio.h>
#include "app.h"
#include "bsp.h"
#include "bsp_custom.h"
#include "pad_ec616.h"
#include "gpio_ec616.h"

#define GPIO_PIN_NUMBER    (1) //GPIO编号

#define GPIO_PORT          (GPIO_PIN_NUMBER/16) //在哪个端口上(P0 / P1 / P2)
#define GPIO_PIN           (GPIO_PIN_NUMBER) //在端口上的编号

#define GPIO_PAD_INDEX     (12) //引脚对应的PAD地址, 这个看手册哈
#define GPIO_PAD_ALT_FUNC  (PAD_MuxAlt0) //使用其第几功能

void gpio_init_interrupt(void)
{
    /*配置GPIO的功能*/
    pad_config_t padConfig;
    PAD_GetDefaultConfig(&padConfig);
    padConfig.mux = GPIO_PAD_ALT_FUNC;//设置使用其第几功能
    PAD_SetPinConfig(GPIO_PAD_INDEX, &padConfig);//配置PAD
    PAD_SetPinPullConfig(GPIO_PAD_INDEX, PAD_InternalPullUp);//设置内部上下拉

    /*配置GPIO的输入输出初始化*/
    gpio_pin_config_t config;
    config.pinDirection = GPIO_DirectionInput;//输入模式
    config.misc.interruptConfig = GPIO_InterruptFallingEdge;//设置为下降沿中断
    GPIO_PinConfig(GPIO_PORT, GPIO_PIN, &config);//配置
}

uint8_t gpio_interrupt_flag =0;
void gpio_interrupt_fun()
{
    uint16_t portIrqMask = GPIO_SaveAndSetIRQMask(GPIO_PORT);//禁止端口中断防止中断溢出
    if (GPIO_GetInterruptFlags(GPIO_PORT) & (1 << GPIO_PIN))//引脚产生中断
    {
        gpio_interrupt_flag=1;
        GPIO_ClearInterruptFlags(GPIO_PORT, 1 << GPIO_PIN);//清除引脚中断标志
    }
    GPIO_RestoreIRQMask(GPIO_PORT, portIrqMask);//恢复端口中断
}

void main_entry(void)
{
    BSP_CommonInit();//官方底层初始化函数,默认写上就可以
    BSP_CustomInit();//配置串口打印
    gpio_init_interrupt();
    //使能GPIO中断(所有的引脚共用一个中断函数)
    XIC_SetVector(PXIC_Gpio_IRQn, gpio_interrupt_fun);//配置GPIO中断函数
    XIC_EnableIRQ(PXIC_Gpio_IRQn);//使能
    while (1)
    {
        if (gpio_interrupt_flag==1)//检测到中断
        {
            gpio_interrupt_flag=0;
            printf("gpio_interrupt_flagrn");
        }
    }
}

每次按下按键就会打印下

程序说明

1,初始引脚的时候设置为下降沿中断

2,设置GPIO中断函数, 检测到中断,打印

0 人点赞