K210_kendryte IDE_GPIO_中断

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)
参数
参数名称描述输入输出
pinGPIO管脚输入
modeGPIO驱动模式输入

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)
参数
参数名称描述输入输出
pinGPIO管脚输入
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)
参数
参数名称描述输入输出
pinGPIO管脚输入
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依旧持续闪烁。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值