Linux系统中裸机按键中断的驱动方法

news2024/11/19 3:48:00

     大家好,今天主要和大家聊一聊,如何实现按键中断的驱动​方法。

     

目录

​第一:外部中断头文件实现

​第二:外部中断源文件的具体实现

​第三:编写对应的main.c函数


      

​第一:外部中断头文件实现

#ifndef  _BSP_EXIT_H#define  _BSP_EXIT_H//函数声明void exit_init(void);   //中断初始化void gpio1_irqhandler(void);  //中断处理函数#endif

​第二:外部中断源文件的具体实现

#include "bsp_exit.h"#include "bsp_gpio.h"void exit_init(void){    gpio_pin_config_t key_config;    //设置IO复用    IOMUXC_SetPinMux(IOMUXC_UART1_CTS_B_GPIO1_IO18,0);    IOMUXC_SetPinConfig(IOMUXC_UART1_CTS_B_GPIO1_IO18,0xF080);    /* 2、初始化 GPIO 为中断模式 */    key_config.direction = kGPIO_DigitalInput;    key_config.interruptMode = kGPIO_IntFallingEdge;    key_config.outputLogic = 1;    gpio_init(GPIO1, 18, &key_config);   /* 3、使能 GIC 中断、注册中断服务函数、使能 GPIO 中断 */    GIC_EnableIRQ(GPIO1_Combined_16_31_IRQn);     system_register_irqhandler(GPIO1_Combined_16_31_IRQn,(system_irq_handler_t)gpio1_io18_irqhandler,NULL);     gpio_enableint(GPIO1, 18);}//中断处理函数void gpio1_io18_irqhandler(void){   static unsigned char state = 0;     /*   *采用延时消抖,中断服务函数中禁止使用延时函数!因为中断服务需要   *快进快出!!这里为了演示所以采用了延时函数进行消抖,后面我们会讲解   *定时器中断消抖法!!!   */    delay(10);  if(gpio_pinread(GPIO1, 18) == 0) /* 按键按下了 */  {   state = !state;   beep_switch(state);  }    gpio_clearintflags(GPIO1, 18); /* 清除中断标志位 */}

      ​分析:两个函数进行中断初始化,然后配置为下降沿触发中断​。

调用函数 GIC_EnableIRQ来使能 GPIO_IO18 所对应的中断总开关,I.MX6U 中 GPIO1_IO16~IO31 这 16 个 IO 共用 ID99。调用函数 system_register_irqhandler 注册 ID99 所对应的中断处理函数,GPIO1_IO16~IO31。这 16 个 IO 共用一个中断处理函数,至于具体是哪个 IO 引起的中断,那就需要在中断处理函数中判断了。通过函数 gpio_enableint 使能 GPIO1_IO18 这个 IO 对应的中断。

​第三:编写对应的main.c函数

​     主函数的具体代码实现如下:

#include "bsp_exit.h"#include "bsp_init.h"int main(void){    unsigned char state = OFF;    int_init();     imx6u_clkinit(); /* 初始化系统时钟 */   clk_enable(); /* 使能所有的时钟 */   led_init(); /* 初始化 led */   beep_init(); /* 初始化 beep */   key_init(); /* 初始化 key */   exit_init(); /* 初始化按键中断 */   while(1)   {       state = !state;       led_switch(LED0, state);       delay(500);   }      return 0;}   

main.c 很简单,重点是调用函数 int_init 来初始化中断系统,调用函数exit_init 来初始化按键 KEY 对应的 GPIO 中断。

总结:硬件中断的配置,熟悉其中的实现方法对后面的底层控制实现具有​重要意义。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/69971.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于keras平台CNN神经网络模型的服装识别分析

在许多介绍图像识别任务的介绍中,通常使用着名的MNIST数据集。 最近我们被客户要求撰写关于图像识别的研究报告,包括一些图形和统计输出。但是,这些数据存在一些问题: 1.太简单了。例如,一个简单的MLP模型可以达到99…

Java搭建宝塔部署实战毕设项目springboot客户管理系统源码

大家好啊,我是测评君,欢迎来到web测评。 本期给大家带来一套Java开发的毕业设计项目,springboot客户管理系统源码,感兴趣的朋友可以自行下载搭建测试。 技术架构 技术框架:SpringBoot MySQL5.7 mybatis shiro Lay…

DDR4时序标准规范(一)

DDR4时序标准规范引脚描述DDR4 SDRAM寻址DDR4架构的模块描述功能描述简化状态机基本功能复位和初始化程序上电和初始化顺序电压稳定后的复位初始化顺序无控制的下电顺序引脚描述 标志类型功能CK_t, CK_c输入Clock: CK_t和CK_c是差分时钟输入。所有的地址和控制输入信号在CK_t的…

主成分分析(PCA)原理及R语言实现及分析实例

主成分分析(PCA)是一种数据降维技巧,它能将大量相关变量转化为一组很少的不相关变量,这些无关变量称为主成分。最近我们被客户要求撰写关于主成分分析(PCA)的研究报告,包括一些图形和统计输出。…

Vagrant搭建Centos

1.下载安装vagrant 01访问Vagrant官网 ​ https://www.vagrantup.com/ 02 点击Download ​ Windows,MacOS,Linux等 03 选择对应的版本 04 傻瓜式安装 05 命令行输入vagrant,测试是否安装成功,显示如下: 2.下载安装virtua…

半解析快速傅里叶变换

我们提出了一种处理傅里叶变换的方法,其并不需要二次多项式相位项的抽样,而是用解析的方法处理。我们提出该理论的同时也给出了几个例子证明其潜力。 1.简介 物理光学建模需要频繁地从空间转换到角频域,反之亦然。这可以由电场和磁场分…

网络编程(用于不同电脑之间的信息交互):UDP、TCP

网络编程: 在网络通信写一下,不同计算机运行的程序,可以进行数据传输 IP地址:设备(手机、电脑等)在网络中的地址,是唯一的标识 端口:应用程序在设备中唯一的表示 协议&#xff1a…

数据结构学习——表、查找

定义 设记录表L(R1 R2…其中Ri(L<i<n)为记录&#xff0c; 对给定的某个值k&#xff0c; 在表L中确定key k的记录的过程&#xff0c;称为查找。若表Lz中存在记录Ri de key k,记为Ri.key,则查找成功&#xff0c;返回该记录在表L中的序号i&#xff08;或Ri的地址&#xff…

优秀的 Verilog/FPGA开源项目介绍(二十)- 张量处理单元(TPU)

介绍张量处理单元( Tensor Processing Unit, TPU ) 是谷歌专门为神经网络机器学习开发的人工智能加速器 专用集成电路(ASIC) &#xff0c;特别是使用谷歌自己的TensorFlow软件。谷歌于 2015 年开始在内部使用 TPU&#xff0c;并于 2018 年将它们作为其云基础设施的一部分并通过…

Zabbix6.0使用教程 (三)—zabbix6.0的安装要求

接上篇&#xff0c;我们继续为大家详细介绍zabbix6.0的使用教程之zabbix6.0的安装部署。接下来我们将从zabbix部署要求到四种不同的安装方式逐一详细的为大家介绍。本篇讲的是部署zabbix6.0的要求。 zabbix6.0安装要求 硬件&#xff1a;内存和磁盘 Zabbix6.0安装 运行需要物…

算法精品讲解(2)——DP问题入门(适合零基础者,一看就会)

目录 前言 DP问题它是什么&#xff08;了解&#xff09; 从中学的例题谈起 再来说一下&#xff0c;DP问题的核心思想&#xff08;理解&#xff09; DP问题的解决方法 先说方法论&#xff1a; 再说具体的例子 例一&#xff1a; 例二&#xff1a; 例三&#xff1a; DP和…

kotlin之range范围表达式

Kotlin 中的 Range 有 CharRange、LongRange、IntRange range 范围 CharRange、LongRange、IntRange 范围区间 var a:IntRange 50..100for (i in a){ //遍历50~100的分数分别在什么位置print("成绩&#xff1a;$i")if(i in 1..59){ //1~59 范围println("…

Leica Infinity三维映射环境数据

Leica Infinity三维映射环境数据 Leica Infinity是软件工程师和该领域专家的名字&#xff0c;以及您的工作计划信息。该软件被设计和呈现为一个强大的产品&#xff0c;并且来自六边形组。Leica Infinity产品的居民试图用新的眼光创造新的数据处理。使用此软件&#xff0c;您可以…

和ChatGPT 比一比谁更懂Kubernetes?

有时&#xff0c;很难得到关于云原生世界中棘手话题的明确答案。哪个是最好的服务网格&#xff1f;平台工程只是devops的另一个标签吗&#xff1f;多云是一种风险吗&#xff1f; 如果你无法从一个人那里得到直截了当的答案——为什么不问一台机器呢&#xff1f; 因此&#xf…

net6自动注册到Consul 代码实例

简单理解: 服务多的时候&#xff0c;服务地址都是写固定&#xff0c;增加一个地址&#xff0c;配置一次&#xff0c;配置nginx或者其他配置&#xff0c;麻烦 有了这个就可以通过应用服务上报服务名servicename和访问地址&#xff0c;同一个服务名servicename可以有多个节点&a…

【教学类-15-05】20221207《八款字体的描字帖-2*4格》(中班大班)

成品样式&#xff1a; 80号字&#xff08;适应2-3个名字的大小&#xff09; 68号字&#xff08;适应4个名字大小&#xff08;2-3个名字也可以用&#xff0c;字会很小&#xff09;&#xff09; 打印样式&#xff1a; 背景需求&#xff1a; 前期进行多次的Python学具教学活动&a…

能跟CAD、BIM软件联合使用的地图神器,比奥维谷歌地图还方便!

是的&#xff0c;今天王工推荐的跟之前的地图工具不一样&#xff0c;百度、谷歌、MAPBOX那些称之为地图工具&#xff0c;这个简直就是地图的浏览器&#xff01;而且它还可以与CAD、BIM软件联合使用&#xff01; 实在是比奥维地图“香”。 海量图源任意浏览 ▲ 任意切换各种地…

OpUtils的网络扫描

什么是网络扫描程序 网络扫描程序只需扫描整个网络基础架构&#xff0c;即可获取和记录网络资源的可用性、性能和利用率指标。它执行 Ping 扫描和 SNMP 扫描&#xff0c;以识别网络中运行的实时主机和服务。网络扫描程序可以执行网络扫描以显示详细信息&#xff0c;例如当前登…

第十四届蓝桥杯集训——JavaC组首篇——环境搭建(win11)

还有9天就截止报名了&#xff0c;我们也算正式开始培训了&#xff0c;今年希望能取得更好的成绩。 今年的蓝桥杯从环境开始——本博客为win10电脑的Java_JDK环境搭建&#xff1a; 学生机环境-Java编程环境&#xff08;第十四届大赛&#xff09; 链接: https://pan.baidu.com…

Servlet 目录(pom.xml内容) 和 打包的两种方法

目录 一、webApp目录结构 web.xml里的内容 代码放置位置 后端代码&#xff1a;放到 src/main/java目录下 前端代码&#xff1a;放到webapp目录下 二、打包程序 一、webApp目录结构 web.xml里的内容 <!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web…