猪百岁 发表于 2021-3-9 10:07:41

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

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

**开发板:K210 AIRV R3版 widora**

**开发环境:kendryte IDE 官方的**

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

### 1.新建文件夹04my_code_keyIRQ



礼物 -> 地球


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



安装依赖



清理 + 构建



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

### 2.看原理图



按键为 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是掉落 为下降沿的)



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





使能中断





### 3.编写中断服务函数

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) //等中断

;

}
```

---

版权声明:本文为CSDN博主「jwdeng1995」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jwdeng1995/article/details/108031035
页: [1]
查看完整版本: K210入门-裸机开发(四)之按键中断