Input Interrupt

该示例使用 GPIO 中断功能,检测 GPIO 的输入信号。

需要将 GPIO 配置为输入模式并启用中断功能。当输入信号发生变化时,会触发 GPIO 的中断,在中断服务处理函数内打印输入电平信息。

用户可以通过不同的宏配置来修改引脚信息。具体宏配置详见 配置选项

环境需求

该示例的环境需求,可参考 环境需求

硬件连线

连接 P4_0 和外部输入信号。

配置选项

  1. 可配置如下宏修改引脚定义。

    #define INPUT_PIN           P4_0
    

编译和下载

该示例的编译和下载流程,可参考 编译和下载

测试验证

  1. 当 EVB 启动后,在 Debug Analyzer 工具内观察 log。

    Start input interrupt test!
    
  2. 控制外部输入信号从高电平变为低电平,P4_0 检测到下降沿信号触发中断,中断处理函数 GPIO_Input_Handler 中显示如下 log。

    enter GPIO_Pin_Handler success
    

代码介绍

该章节主要介绍示例中的初始化和相应功能实现的代码和流程说明。

源码路径

工程文件和源码路径如下:

  • 工程路径: sdk\samples\peripheral\gpio\input_interrupt\proj

  • 源码路径: sdk\samples\peripheral\gpio\input_interrupt\src

初始化

外设的初始化流程可参考 General Introduction 中的 初始化流程 部分。

  1. 调用 Pad_Config()Pinmux_Config(),配置对应引脚的 PAD 和 PINMUX 。

    void board_gpio_init(void)
    {
        Pad_Config(INPUT_PIN, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_UP, PAD_OUT_ENABLE, PAD_OUT_HIGH);
    
        Pinmux_Config(INPUT_PIN, DWGPIO);
    }
    
  2. 调用 RCC_PeriphClockCmd() ,开启 GPIO 时钟。

  3. 对 GPIO 外设进行初始化:

    1. 定义 GPIO_InitTypeDef 类型 GPIO_InitStruct ,调用 GPIO_StructInit()GPIO_InitStruct 预填默认值。

    2. 根据需求修改 GPIO_InitStruct 参数,GPIO 的初始化参数配置如下表。调用 GPIO_Init(),初始化 GPIO 外设。

GPIO 初始化参数

GPIO Hardware Parameters

Setting in the GPIO_InitStruct

GPIO

GPIO pin

GPIO_InitTypeDef::GPIO_Pin

GPIO_PIN

GPIO direction

GPIO_InitTypeDef::GPIO_Dir

GPIO_DIR_IN

GPIO interrupt

GPIO_InitTypeDef::GPIO_ITCmd

ENABLE

GPIO interrupt trigger

GPIO_InitTypeDef::GPIO_ITTrigger

GPIO_INT_Trigger_EDGE

GPIO interrupt polarity

GPIO_InitTypeDef::GPIO_ITPolarity

GPIO_INT_POLARITY_ACTIVE_LOW

Debounce function

GPIO_InitTypeDef::GPIO_ITDebounce

GPIO_INT_DEBOUNCE_ENABLE

Debounce clock source

GPIO_InitTypeDef::GPIO_DebounceClkSource

GPIO_DEBOUNCE_32K

Debounce clock divide

GPIO_InitTypeDef::GPIO_DebounceClkDiv

GPIO_DEBOUNCE_DIVIDER_1

Debounce Limit

GPIO_InitTypeDef::GPIO_DebounceCntLimit

31

功能实现

当 P4_0 检测到外部有下降沿信号输入时,进入中断服务处理函数 GPIO_Pin_Handler 。打印中断信息。

在中断处理函数中需要先关闭并屏蔽中断,退出中断函数时清除中断标志位、取消屏蔽和重新使能中断。

/* Mask and disable interrupt */
GPIO_INTConfig(GPIO_PORT, GPIO_PIN, DISABLE);
GPIO_MaskINTConfig(GPIO_PORT, GPIO_PIN, ENABLE);

DBG_DIRECT("enter GPIO_Pin_Handler success");

/* Clear int flag, unmask and enable interrupt */
GPIO_ClearINTPendingBit(GPIO_PORT, GPIO_PIN);
GPIO_MaskINTConfig(GPIO_PORT, GPIO_PIN, DISABLE);
GPIO_INTConfig(GPIO_PORT, GPIO_PIN, ENABLE);