在上篇GPIO驱动LED的基础上,测试下GPIO外部中断测试,通过LED灯的状态来查看是否进入中断。
一、硬件部分
1.1、使用开发板上的KEY1和KEY2按键来作为GPIO中断输入端。
1.2、电路图部分
电路上使用了,KEY1 -> PA11, KEY2 -> PA12。
1.3、LED使用上篇的RGB LED灯。
二、软件部分
KEY2上升沿触发,KEY1下降沿触发中断。
2.1、eint.c
//eint.c
#include "board_config.h"
#include "drv/gpio_pin.h"
#include <drv/pin.h>
#include <aos/aos.h>
#include "led.h"
#define GPIO_PA11_MASK ( 1 << PA11 )
#define GPIO_PA12_MASK ( 1 << PA12 )
static csi_gpio_pin_t pin_pa11;
static csi_gpio_pin_t pin_pa12;
static void gpio_pin_pa11_interrupt_handler(csi_gpio_pin_t *pin, void *arg)
{
ledr_tog();
}
static void gpio_pin_pa12_interrupt_handler(csi_gpio_pin_t *pin, void *arg)
{
ledg_tog();
}
void eint_init(void)
{
csi_gpio_pin_init(&pin_pa11, PA11);
csi_gpio_pin_attach_callback(&pin_pa11, gpio_pin_pa11_interrupt_handler, NULL);
csi_gpio_pin_mode(&pin_pa11, GPIO_MODE_PULLUP);
csi_gpio_pin_dir(&pin_pa11, GPIO_DIRECTION_INPUT);
csi_gpio_pin_irq_mode(&pin_pa11, GPIO_IRQ_MODE_FALLING_EDGE);
csi_gpio_pin_irq_enable(&pin_pa11, true);
csi_gpio_pin_init(&pin_pa12, PA12);
csi_gpio_pin_attach_callback(&pin_pa12, gpio_pin_pa12_interrupt_handler, NULL);
csi_gpio_pin_mode(&pin_pa12, GPIO_MODE_PULLUP);
csi_gpio_pin_dir(&pin_pa12, GPIO_DIRECTION_INPUT);
csi_gpio_pin_irq_mode(&pin_pa12, GPIO_IRQ_MODE_RISING_EDGE);
csi_gpio_pin_irq_enable(&pin_pa12, true);
}
2.2、eint.h
#define EINT_H
void eint_init(void);
#endif
2.3、main.c
/*
* Copyright (C) 2019-2020 Alibaba Group Holding Limited
*/
#include <stdlib.h>
#include <string.h>
#include <aos/aos.h>
#include "aos/cli.h"
#include "main.h"
#include "app_init.h"
#include "oled.h"
#include "led.h"
#include "eint.h"
#define TAG "app"
int main(void)
{
board_yoc_init();
LOGD(TAG, "%s\n", aos_get_app_version());
oled_init();
led_init();
eint_init();
while (1) {
//LOGD(TAG, "Hello world! YoC");
//aos_msleep(1000);
//led_test();
}
return 0;
}
三、运行结果