K210入门-裸机开发(四)之按键中断

开发板:K210 AIRV R3版 widora

开发环境:kendryte IDE 官方的

必须的参考文档:Standalone SDK编程指南v0.5.0,以及widora的原理图

(一) 新建文件夹04my_code_keyIRQ

礼物 -> 地球

实例 搜索 gpio 选择button那个 选择develop开发版本 然后下载到刚才新建的文件夹中

安装依赖

清理 + 构建

环境搭建完毕  下面开始改代码

(二) 看原理图

按键为 IO19,20 ; LED为IO17,18

中断在 第六章, 第四章

有个举例 等下抄一抄就行

编写代码

先配置 KEY 和LED端口

因为要用到中断,所以要将KEY配置到GPIOHS高速端口

LED随便 用回之前的就好 也可以配置高速口

配置LED为输入端口 (低速用第五章,高速用第六章)

我这里用的低速的

因为用到低速GPIO 所以1)添加头文件 然后 2)安装依赖 再3)清理 4)构建

熄灯

设置 按键为浮空输入(高速模式才有中断,所以用高速,浮空是因为开发板有上拉电阻了,你也可以自己改为上拉输入GPIO_DM_INPUT_PULL_UP)

配置 中断触发方式

这里选择 下降沿触发(按键有上拉,平时为高电平, 当按下的时候,会被拉低 出现 1->0 即下降沿)

按键2设置为上升沿 作为对比(下面代码注释错了,falling是掉落 为下降沿的)

注册中断函数 以及绑定按键

使能中断

(三) 编写中断服务函数

KEY1中断函数

KEY2中断函数

一条龙 清理+构建+下载

没连开发板的 先刷新,选择COM口,然后再下载

效果

按住的时候没有反应,松开才执行(LED翻转),证明是上升沿(0->1)

这个按键 按下的瞬间就有反应了(LED翻转) 并且串口打印 count数值+1

按键学习中断完毕, 下次再见

代码

#include <fpioa.h>

#include <gpiohs.h>

#include <stdio.h>

#include <sysctl.h>

#include <unistd.h>

#include "gpio.h"

uint32_t g_count; //给中断1用的,也可以不用

int key1_zhongduan(void *ctx) {

static uint8_t flag = 0; // 注意用static保存

uint32_t *tmp = (uint32_t *)(ctx);

uint8_t val = 0;

printf("count is %d\n", (*tmp)++); //统计进来的次数

if (flag)

val = GPIO_PV_LOW;

else

val = GPIO_PV_HIGH;

gpio_set_pin(0, val); // LED1

flag = !flag; //下一次来中断就是翻转LED状态

return 0;

}

int key2_zhongduan(void) {

static uint8_t flag = 0; // 注意用static保存

uint8_t val = 0;

if (flag)

val = GPIO_PV_LOW;

else

val = GPIO_PV_HIGH;

gpio_set_pin(1, val); // LED2

flag = !flag; //下一次来中断就是翻转LED状态

return 0;

}

int main(void) {

plic_init(); // 初始化外部中断

fpioa_set_function(17, FUNC_GPIO0); // LED

fpioa_set_function(18, FUNC_GPIO1);

fpioa_set_function(19, FUNC_GPIOHS0); // KEY

fpioa_set_function(20, FUNC_GPIOHS1);

gpio_set_drive_mode(0, GPIO_DM_OUTPUT); //配置低速的LED输出

gpio_set_drive_mode(1, GPIO_DM_OUTPUT);

gpio_set_pin(0, GPIO_PV_LOW); // 先让两个灯熄灭

gpio_set_pin(1, GPIO_PV_LOW);

gpiohs_set_drive_mode(0, GPIO_DM_INPUT);

gpiohs_set_drive_mode(1, GPIO_DM_INPUT);

gpiohs_set_pin_edge(0, GPIO_PE_FALLING); //下降沿

gpiohs_set_pin_edge(1, GPIO_PE_RISING); //上升沿

// 参数1 按键0(绑定了IO19),参数2中断优先级,3中断回调函数,4回调函数的形参

gpiohs_irq_register(0, 1, key1_zhongduan, &g_count);

gpiohs_irq_register(1, 1, key2_zhongduan, NULL);

sysctl_enable_irq(); //使能系统中断,如果使用中断一定要开启系统中断

while (1) //等中断

;

}

猜你喜欢

转载自blog.csdn.net/jwdeng1995/article/details/108031035