K210_kendryte IDE_GPIO_中断
本实验使用kendryte SDK实现GPIO外部中断。使用按键触发中断动作。使用按键来控制LED。
一、实验环境
1、软件环境:
macOS 11.4
kendryte IDE
Kendryte Standalone SDK
2、硬件环境
SIPEED M1 AI MODULE
二、详细程序
1、FPIOA引脚绑定
需要使用GPIO来控制LED。由于K210的GPIO没有中断的功能,因此需要使用GPIOHS来实现外部中断的功能。如图所示pin24设置为GPIOHS0,pin12、13、14设置为GPIO0、1、2。
2、GPIO初始化
分别将GPIO0、1、2初始化为输出,默认高电平。
详细函数用法可参考链接: link.
void GPIO_init(void) {
gpio_init(); // enable the gpio clock
gpio_set_drive_mode(0, GPIO_DM_OUTPUT);
gpio_set_drive_mode(1, GPIO_DM_OUTPUT);
gpio_set_drive_mode(2, GPIO_DM_OUTPUT);
gpio_set_pin(0, GPIO_PV_HIGH);
gpio_set_pin(1, GPIO_PV_HIGH);
gpio_set_pin(2, GPIO_PV_HIGH);
}
3、GPIOHS中断初始化
将GPIOHS0初始化为输入,并且开启内部上拉电阻,保持默认高电平输入。设置GPIOHS0为下降沿触发(因为要使用按键触发中断,按键按下时为低电平),中断优先级1,回调函数为GPIOHS0_int_callback。
void GPIOHS_init(void) {
gpiohs_set_drive_mode(0, GPIO_DM_INPUT_PULL_UP); // input pull up
gpiohs_set_pin_edge(0, GPIO_PE_FALLING);
gpiohs_irq_register(0, 1, GPIOHS0_int_callback, NULL);
}
函数原型
void gpiohs_set_drive_mode(uint8_t pin, gpio_drive_mode_t mode)
参数
参数名称 | 描述 | 输入输出 |
---|---|---|
pin | GPIO管脚 | 输入 |
mode | GPIO驱动模式 | 输入 |
mode成员:
成员名称 | 描述 |
---|---|
GPIO_DM_INPUT | 输入 |
GPIO_DM_INPUT_PULL_DOWN | 输入下拉 |
GPIO_DM_INPUT_PULL_UP | 输入上拉 |
GPIO_DM_OUTPUT | 输出 |
函数原型
void gpiohs_set_pin_edge(uint8_t pin, gpio_pin_edge_t edge)
参数
参数名称 | 描述 | 输入输出 |
---|---|---|
pin | GPIO管脚 | 输入 |
edge | 中断触发方式 | 输入 |
触发方式成员:
成员名称 | 描述 |
---|---|
GPIO_PE_NONE | 不触发 |
GPIO_PE_FALLING | 下降沿触发 |
GPIO_PE_RISING | 上升沿触发 |
GPIO_PE_BOTH | 双沿触发 |
GPIO_PE_LOW | 低电平触发 |
GPIO_PE_HIGH | 高电平触发 |
函数原型
void gpiohs_irq_register(uint8_t pin, uint32_t priority, plic_irq_callback_t callback, void *ctx)
参数
参数名称 | 描述 | 输入输出 |
---|---|---|
pin | GPIO管脚 | 输入 |
priority | 中断优先级 | 输入 |
plic_irq_callback_t | 中断回调函数 | 输入 |
ctx | 回调函数参数 | 输入 |
4、全部代码
#include <gpio.h>
#include <gpiohs.h>
#include <plic.h>
#include <sleep.h>
#include <stdio.h>
#include <sysctl.h>
void GPIO_init(void);
void GPIOHS_init(void);
int GPIOHS0_int_callback(void *ctx);
int main(void) {
plic_init(); // enable PLIC external interrupt
GPIO_init();
GPIOHS_init();
sysctl_enable_irq(); // enable interrupt
while (1) {
gpio_set_pin(1, GPIO_PV_LOW); /* code */
gpio_set_pin(2, GPIO_PV_LOW);
msleep(1000);
gpio_set_pin(1, GPIO_PV_HIGH);
gpio_set_pin(2, GPIO_PV_HIGH);
msleep(1000);
}
}
void GPIO_init(void) {
gpio_init(); // enable the gpio clock
gpio_set_drive_mode(0, GPIO_DM_OUTPUT);
gpio_set_drive_mode(1, GPIO_DM_OUTPUT);
gpio_set_drive_mode(2, GPIO_DM_OUTPUT);
gpio_set_pin(0, GPIO_PV_HIGH);
gpio_set_pin(1, GPIO_PV_HIGH);
gpio_set_pin(2, GPIO_PV_HIGH);
}
void GPIOHS_init(void) {
gpiohs_set_drive_mode(0, GPIO_DM_INPUT_PULL_UP); // input pull up
gpiohs_set_pin_edge(0, GPIO_PE_FALLING);
gpiohs_irq_register(0, 1, GPIOHS0_int_callback, NULL);
}
int GPIOHS0_int_callback(void *ctx) {
gpio_set_pin(0, GPIO_PV_LOW);
msleep(500);
gpio_set_pin(0, GPIO_PV_HIGH);
}
三、程序效果
开发板上电以后LED1、2一起持续闪烁。每当按下按键时LED0闪烁一次,LED1、2依旧持续闪烁。