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

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

22f67fd5f18946ebabd2a786b7de8fe8.png

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

#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 中断。

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

目录
相关文章
|
2月前
|
缓存 监控 Linux
Linux系统清理缓存(buff/cache)的有效方法。
总结而言,在大多数情形下你不必担心Linux中buffer与cache占用过多内存在影响到其他程序运行;因为当程序请求更多内存在没有足够可用资源时,Linux会自行调整其占有量。只有当你明确知道当前环境与需求并希望立即回收这部分资源给即将运行重负载任务之前才考虑上述方法去主动干预。
774 10
|
2月前
|
安全 Linux 数据安全/隐私保护
为Linux系统的普通账户授予sudo访问权限的过程
完成上述步骤后,你提升的用户就能够使用 `sudo`命令来执行管理员级别的操作,而无需切换到root用户。这是一种更加安全和便捷的权限管理方式,因为它能够留下完整的权限使用记录,并以最小权限的方式工作。需要注意的是,随意授予sudo权限可能会使系统暴露在风险之中,尤其是在用户不了解其所执行命令可能带来的后果的情况下。所以在配置sudo权限时,必须谨慎行事。
324 0
|
2月前
|
Ubuntu Linux 开发者
国产 Linux 发行版再添新成员,CutefishOS 系统简单体验
当然,系统生态构建过程并不简单,不过为了帮助国产操作系统优化生态圈,部分企业也开始用国产操作系统替代 Windows,我们相信肯定会有越来越多的精品软件登录 Linux 平台。
120 0
|
2月前
|
Ubuntu 安全 Linux
Linux系统入门指南:从零开始学习Linux
Shell脚本是一种强大的自动化工具,可以帮助您简化重复的任务或创建复杂的脚本程序。了解Shell脚本的基本语法和常用命令,以及编写和运行Shell脚本的步骤,将使您更高效地处理日常任务。
210 0
|
28天前
|
Unix Linux 程序员
Linux文本搜索工具grep命令使用指南
以上就是对Linux环境下强大工具 `grep` 的基础到进阶功能介绍。它不仅能够执行简单文字查询任务还能够处理复杂文字处理任务,并且支持强大而灵活地正则表达规范来增加查询精度与效率。无论您是程序员、数据分析师还是系统管理员,在日常工作中熟练运用该命令都将极大提升您处理和分析数据效率。
104 16
|
20天前
|
Linux
linux命令—stat
`stat` 是 Linux 系统中用于查看文件或文件系统详细状态信息的命令。相比 `ls -l`,它提供更全面的信息,包括文件大小、权限、所有者、时间戳(最后访问、修改、状态变更时间)、inode 号、设备信息等。其常用选项包括 `-f` 查看文件系统状态、`-t` 以简洁格式输出、`-L` 跟踪符号链接,以及 `-c` 或 `--format` 自定义输出格式。通过这些选项,用户可以灵活获取所需信息,适用于系统调试、权限检查、磁盘管理等场景。
|
3月前
|
监控 Linux 网络安全
Linux命令大全:从入门到精通
日常使用的linux命令整理
669 13
|
4月前
|
Linux 网络安全 数据安全/隐私保护
使用Linux系统的mount命令挂载远程服务器的文件夹。
如此一来,你就完成了一次从你的Linux发车站到远程服务器文件夹的有趣旅行。在这个技术之旅中,你既探索了新地方,也学到了如何桥接不同系统之间的距离。
558 21
|
4月前
|
JSON 自然语言处理 Linux
linux命令—tree
tree是一款强大的Linux命令行工具,用于以树状结构递归展示目录和文件,直观呈现层级关系。支持多种功能,如过滤、排序、权限显示及格式化输出等。安装方法因系统而异常用场景包括:基础用法(显示当前或指定目录结构)、核心参数应用(如层级控制-L、隐藏文件显示-a、完整路径输出-f)以及进阶操作(如磁盘空间分析--du、结合grep过滤内容、生成JSON格式列表-J等)。此外,还可生成网站目录结构图并导出为HTML文件。注意事项:使用Tab键补全路径避免错误;超大目录建议限制遍历层数;脚本中推荐禁用统计信息以优化性能。更多详情可查阅手册mantree。
linux命令—tree
|
2月前
|
Linux 网络安全 开发工具
技术栈:这50条最常用的 Linux 命令你一定要会!
建议多在终端中实践,遇到不懂的命令就用 man 或 --help 了解详情!
398 0