K210基础实验——独立按键中断

2024-04-21 12:36

本文主要是介绍K210基础实验——独立按键中断,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

学习K210开发板的独立按键中断功能

一、涉及到的外设资源是K210开发板上的BOOT按键RGB灯

在这里插入图片描述

二、BOOT按键按下,MCU上连接BOOT的IO口变为低电平,松开后为高电平

三、引脚对应关系

BOOT :

IO16

RGB灯:

R:IO6
G:IO7
B:IO8
在这里插入图片描述

四、在src目录下新建文件夹,名字叫做button_my

在这里插入图片描述

五、在button_my目录下新建两个文件,分别是main.cpin_config.h

在这里插入图片描述

六、在main.c文件中写入如下代码

/**
* @par  Copyright (C): 2016-2022, Shenzhen Yahboom Tech
* @file         main.c
* @author       Gengyue
* @version      V1.0
* @date         2020.05.27
* @brief        按键控制RGB灯
* @details      
* @par History  见如下说明
*                 
* version:	V1.0: 每次按下按键RGB灯亮红色,松开则熄灭。
*/
#include "pin_config.h"
#include "sleep.h"
#include "gpiohs.h"
#include "sysctl.h"
#include "plic.h"uint32_t g_count;/**
* Function       hardware_init
* @author        Gengyue
* @date          2020.05.27
* @brief         硬件初始化,绑定GPIO口
* @param[in]     void
* @param[out]    void
* @retval        void
* @par History   无
*/
void hardware_init(void)
{// fpioa映射fpioa_set_function(PIN_RGB_R, FUNC_RGB_R);fpioa_set_function(PIN_RGB_G, FUNC_RGB_G);fpioa_set_function(PIN_RGB_B, FUNC_RGB_B);fpioa_set_function(PIN_KEY, FUNC_KEY);
}/**
* Function       hardware_init
* @author        Gengyue
* @date          2020.05.27
* @brief         RGB灯灭
* @param[in]     void
* @param[out]    void
* @retval        void
* @par History   无
*/
void rgb_all_off(void)
{gpiohs_set_pin(RGB_R_GPIONUM, GPIO_PV_HIGH);gpiohs_set_pin(RGB_G_GPIONUM, GPIO_PV_HIGH);gpiohs_set_pin(RGB_B_GPIONUM, GPIO_PV_HIGH);
}/**
* Function       init_rgb
* @author        Gengyue
* @date          2020.05.27
* @brief         初始化RGB灯
* @param[in]     void
* @param[out]    void
* @retval        void
* @par History   无
*/
void init_rgb(void)
{/* 设置RGB灯的GPIO模式为输出 */gpiohs_set_drive_mode(RGB_R_GPIONUM, GPIO_DM_OUTPUT);gpiohs_set_drive_mode(RGB_G_GPIONUM, GPIO_DM_OUTPUT);gpiohs_set_drive_mode(RGB_B_GPIONUM, GPIO_DM_OUTPUT);/* 关闭RGB灯 */rgb_all_off();
}/**
* Function       key_irq_cb
* @author        Gengyue
* @date          2020.05.27
* @brief         按键key中断回调函数
* @param[in]     ctx 回调参数
* @param[out]    void
* @retval        0
* @par History   无
*/
int key_irq_cb(void* ctx)
{gpio_pin_value_t key_state = gpiohs_get_pin(KEY_GPIONUM);/* 这里只是为了测试才在中断回调打印数据,正常情况下是不建议这么做的。*/printf("IRQ The PIN is %d\n", key_state);uint32_t *tmp = (uint32_t *)(ctx);printf("count is %d\n", (*tmp)++);if (!key_state)gpiohs_set_pin(RGB_R_GPIONUM, GPIO_PV_LOW);elsegpiohs_set_pin(RGB_R_GPIONUM, GPIO_PV_HIGH);return 0;
}/**
* Function       init_key
* @author        Gengyue
* @date          2020.05.27
* @brief         初始化按键key
* @param[in]     void
* @param[out]    void
* @retval        void
* @par History   无
*/
void init_key(void)
{/* 设置按键的GPIO模式为上拉输入 */gpiohs_set_drive_mode(KEY_GPIONUM, GPIO_DM_INPUT_PULL_UP);/* 设置按键的GPIO电平触发模式为上升沿和下降沿 */gpiohs_set_pin_edge(KEY_GPIONUM, GPIO_PE_BOTH);/* 设置按键GPIO口的中断回调 */gpiohs_irq_register(KEY_GPIONUM, 1, key_irq_cb, &g_count);
}/**
* Function       main
* @author        Gengyue
* @date          2020.05.27
* @brief         主函数,程序的入口
* @param[in]     void
* @param[out]    void
* @retval        0
* @par History   无
*/
int main(void)
{// 硬件引脚初始化hardware_init();/* 外部中断初始化 */plic_init();/* 使能全局中断 */sysctl_enable_irq();// 初始化RGB灯init_rgb();// 初始化按键keyinit_key();while (1);return 0;
}

七、在pin_config.h文件中下入如下代码

/**
* @par  Copyright (C): 2016-2022, Shenzhen Yahboom Tech
* @file         pin_config.c
* @author       Gengyue
* @version      V1.0
* @date         2020.05.27
* @brief        硬件引脚与软件GPIO的宏定义
* @details      
* @par History  见如下说明
*                 
* version:	由于K210使用fpioa现场可编程IO阵列,允许用户将255个内部功能映射到芯片外围的48个自由IO上
*           所以把硬件IO和软件GPIO功能抽出来单独设置,这样更容易理解。
*/
#ifndef _PIN_CONFIG_H_
#define _PIN_CONFIG_H_
/*****************************HEAR-FILE************************************/
#include "fpioa.h"/*****************************HARDWARE-PIN*********************************/
// 硬件IO口,与原理图对应
#define PIN_RGB_R             (6)
#define PIN_RGB_G             (7)
#define PIN_RGB_B             (8)#define PIN_KEY               (16)/*****************************SOFTWARE-GPIO********************************/
// 软件GPIO口,与程序对应
#define RGB_R_GPIONUM          (0)
#define RGB_G_GPIONUM          (1)
#define RGB_B_GPIONUM          (2)#define KEY_GPIONUM            (3)/*****************************FUNC-GPIO************************************/
// GPIO口的功能,绑定到硬件IO口
#define FUNC_RGB_R             (FUNC_GPIOHS0 + RGB_R_GPIONUM)
#define FUNC_RGB_G             (FUNC_GPIOHS0 + RGB_G_GPIONUM)
#define FUNC_RGB_B             (FUNC_GPIOHS0 + RGB_B_GPIONUM)#define FUNC_KEY               (FUNC_GPIOHS0 + KEY_GPIONUM)#endif /* _PIN_CONFIG_H_ */

八、在build路径下输入cmake … -DPROJ=button_my -G “MinGW Makefiles” 后回车

在这里插入图片描述

九、再输入make进行编译,编译之前记得Ctrl+S进行保存,不然会编译不成功

在这里插入图片描述

十、编译成功

在这里插入图片描述

十一、编译成功后会在build目录下生成.bin文件

在这里插入图片描述

十二、连接好开发板,使用K210官方提供的烧录软件进行烧录

在这里插入图片描述

十三、实验现象,按下BOOT按键,亮红灯。在串口助手中可以查看到按键按下的次数以及IO引脚中断状态

在这里插入图片描述
在这里插入图片描述

这篇关于K210基础实验——独立按键中断的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/923096

相关文章

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

poj 2594 二分图最大独立集

题意: 求一张图的最大独立集,这题不同的地方在于,间接相邻的点也可以有一条边,所以用floyd来把间接相邻的边也连起来。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <sta

poj 3692 二分图最大独立集

题意: 幼儿园里,有G个女生和B个男生。 他们中间有女生和女生认识,男生男生认识,也有男生和女生认识的。 现在要选出一些人,使得这里面的人都认识,问最多能选多少人。 解析: 反过来建边,将不认识的男生和女生相连,然后求一个二分图的最大独立集就行了。 下图很直观: 点击打开链接 原图: 现图: 、 代码: #pragma comment(

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

最大流=最小割=最小点权覆盖集=sum-最大点权独立集

二分图最小点覆盖和最大独立集都可以转化为最大匹配求解。 在这个基础上,把每个点赋予一个非负的权值,这两个问题就转化为:二分图最小点权覆盖和二分图最大点权独立集。   二分图最小点权覆盖     从x或者y集合中选取一些点,使这些点覆盖所有的边,并且选出来的点的权值尽可能小。 建模:     原二分图中的边(u,v)替换为容量为INF的有向边(u,v),设立源点s和汇点t

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

C++操作符重载实例(独立函数)

C++操作符重载实例,我们把坐标值CVector的加法进行重载,计算c3=c1+c2时,也就是计算x3=x1+x2,y3=y1+y2,今天我们以独立函数的方式重载操作符+(加号),以下是C++代码: c1802.cpp源代码: D:\YcjWork\CppTour>vim c1802.cpp #include <iostream>using namespace std;/*** 以独立函数

线性因子模型 - 独立分量分析(ICA)篇

序言 线性因子模型是数据分析与机器学习中的一类重要模型,它们通过引入潜变量( latent variables \text{latent variables} latent variables)来更好地表征数据。其中,独立分量分析( ICA \text{ICA} ICA)作为线性因子模型的一种,以其独特的视角和广泛的应用领域而备受关注。 ICA \text{ICA} ICA旨在将观察到的复杂信号

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显