RK3568外部IO中断示例

发表时间:2023-11-03 11:32

1. 外部IO中断介绍

本篇文章以万象奥科HD-RK3568-IOT评估板中GPIO30为例,介绍Linux内核中断的注册方法,使用中断的方式检测GPIO30是否出现上升沿信号。中断在linux、设备驱动开发里使用的都非常多,可以更加实时的检测GPIO30的状态。

Linux内核提供了中断的注册接口:

1)     注册中断

头文件                        include\linux\interrupt.h

定义文件                    include\linux\interrupt.h

函数原型                    int request_irq(unsigned int irq,   /* 做实参传递给中断服务函数第1个参数 */

                                            Irq_handler_thandler,   /* 中断服务函数指针 */

                                            unsignedlong flags,

                                            constchar *name,

void*dev_id);            /* 做实参传递给中断服务函数第2个参数 */   

函数功能:             向内核注册一个中断服务函数;

当发生中断号为irq的中断时,会执行handler指针函数。


函数参数:             

irq:    中断编号(每个中断有唯一的编号)

handler:     中断服务函数指针。

                  原型typedef irqreturn_t(*irq_handler_t)(int,void *)

flag:           中断的标志,用来描述本中断的基本特征的。

                  有固定的值,由中断源的特征决定;

                  比如外中断有:   上升沿,下降沿触发中断这类标志。

name:        中断名字,注册后会出现cat /proc/interrupts

dev_id:      这个参数是传递给中断服务函数。

                  对共享中断来说,这个参数一定有要;

                  当注销共享中断中的其中一个时,用这个标识要注销哪一个。

                  对于有唯一入口的中断,可以传递NULL;

                           但是一般来说都会传递一个有意义指针,在中断程序中使用,以方便编程。

         返回值      0       标识成功

         -EINVAL            (无效参数22) 表示中断号无效。

         -EBUSY             (设备或者资源忙16) 表示中断已经被占用。

2)    注销中断

void   free_irq(unsigned int irq, void *dev_id)

irq:    要注销的中断号

dev_id:      其实就是注册时需要使用的dev参数,在共享中断必不可少,不能传递NULL

注意:为防止在注销时同时发生中断,调用时候,先禁掉中断。

3中断开启与关闭

       禁止中断:

voiddisable_irq_nosync(unsigned int irq);

voiddisable_irq(unsigned int irq);

参数: irq,要禁止的中断对应的编号。

注意:在中断服务程序中不能使用disable_irq这个函数,否则内核崩溃,可以使用disable_irq_nosync,

disable_irq: 函数调用后,函数不会马上返回,而等待中断程序执行完成才返回,在中断调用会导致死锁。

使能中断:

         void enable_irq(unsigned int irq);

       参数: irq, 要使能的中断对应的编号。

4)    获取irq中断号

         Int gpio_to_irq(unsigned int irq);

       参数: irq,要使能的中断对应的编号

2. 外部IO中断驱动编写

2.1       IO原理图

1.png

2.1 GPIO0_D6

         GPIO0_D6=0*32+(4-1)-8+6=30

2.2       驱动示例代码

#include<linux/init.h>

#include<linux/module.h>

#include<linux/gpio.h>

#include<linux/interrupt.h>

#include<linux/timer.h>


#defineGPIO_PIN 30   // 替换为你的GPIO引脚


staticunsigned int irq_number;


//GPIO中断处理函数

staticirqreturn_t gpio_irq_handler(int irq, void *dev_id) {

    printk("GPIO中断触发!\n");

    return IRQ_HANDLED;

}

staticint __init mymodule_init(void) {

    int ret;

    // 请求GPIO

    ret = gpio_request(GPIO_PIN,"my_gpio");

    if (ret) {

        printk("无法请求GPIO %d\n",GPIO_PIN);

        return ret;

    }


    // 配置GPIO引脚为输入

    ret = gpio_direction_input(GPIO_PIN);

    if (ret) {

        printk("无法配置GPIO %d 为输入\n", GPIO_PIN);

        gpio_free(GPIO_PIN);

        return ret;

    }


    // 请求GPIO中断

    irq_number = gpio_to_irq(GPIO_PIN);           

ret = request_irq(irq_number, gpio_irq_handler,IRQF_TRIGGER_RISING, "my_gpio_irq", NULL);

/* IRQF_TRIGGER_RISING   上升沿有效 */

    if (ret) {     

        printk("无法请求GPIO中断 %d\n",irq_number);

        gpio_free(GPIO_PIN);

        return ret;

    }

    printk("模块加载成功\n");

    return 0;

}

staticvoid __exit mymodule_exit(void) {

    // 释放GPIO中断

    free_irq(irq_number, NULL);

         

    // 释放GPIO

    gpio_free(GPIO_PIN);


    printk("模块卸载成功\n");

}


module_init(mymodule_init);

module_exit(mymodule_exit);


MODULE_LICENSE("GPL");

MODULE_AUTHOR("zou");

MODULE_DESCRIPTION("SampleGPIO and Timer Interrupt Kernel Module");

3. 外部IO中断验证

将驱动编译成模块,insmod加载模块后。由于驱动检测GPIO0_D6上升沿有效,当给该引脚提供高电平时,会触发中断执行中断处理函数。


2.png

3.1触发IO中断


文章列表
RK3506 AMP简介及万象奥科AMP方案介绍RK3506是瑞芯微公司推出的一款高性能处理器,该芯片采用三核Cortex-A7与单核Cortex-M0的异构设计,A7核主频可达1.5GHz,M0核可达200MHz,支持在物理隔离的核心上部署不同操作系统:A7可运行Linux系统处理复杂应用,M0核则运行RT-Thread实时系统或MCU-HAL层驱动,实现计算资源与实时性的最优配置。这种混...
样品信息产品名称:HD-RK3506G-IOT评估板(基于RK3506核心板)产品厂商:武汉万象奥科电子有限公司1. 概述1.1     试验仪器试验项目型号规格设备名称厂商校准有效期EFTEFT61004TA-2216脉冲群发生器Prima2025-10-14ESDESD61002TA静电放电发生器Prima2025-10-14EATGT-TH-S-225Z恒温恒湿试验箱高天2025-10...
RK3506,运行Linux系统,上电开机到显示界面启动完成到底有多快?基于万象奥科HD-RK3506-IoT评估板,一起看一下实测数据!测试准备:HD-RK3506-IoT评估板一套RGB接口5寸显示屏一套电源(带开关)一套上电准备,设置好录像与计时。上电开机,启动观察。启动完成!不到2秒完成界面启动!武汉万象基于瑞芯微RK3506G处理器的核心板(35mm*35mm)震撼上市,首件特价2...
工业网关(Industrial Gateway)是工业物联网(IIoT)的核心枢纽,负责连接现场设备(如PLC、传感器、仪器仪表)与云端管理系统,实现数据采集、协议转换、边缘计算等功能。瑞芯微推出的RK3506处理器,凭借多核异构架构、工业级可靠性、丰富外设接口,成为新一代工业网关的理想计算平台。本文将解析RK3506如何解决工业网关的关键需求,并探讨其典型应用场景。  一、工业网关的核心挑...
在工业自动化领域,HMI+PLC一体机正成为越来越多设备制造商的选择。这种将人机界面(HMI)和可编程逻辑控制器(PLC)集成在一起的设备,不仅节省了空间,还简化了系统架构。而要实现这样的集成设计,处理器的选择尤为关键。一、HMI+PLC一体机的核心需求现代工业设备对HMI+PLC一体机提出了更高要求:1. 实时控制能力:PLC部分需要确保控制周期在1ms以内2. 流畅的人机交互:HMI界面...
在电力自动化领域,DTU(配电终端单元)和FTU(馈线终端单元)是配电网智能化升级的核心设备。它们负责实时监测电力运行状态、快速隔离故障、优化电能分配,是保障电网稳定运行的“神经末梢”。  然而,随着智能电网的发展,传统单片机方案已难以满足多任务并行处理、高精度数据采集、低延迟通信等需求。此时,瑞芯微RK3506凭借多核异构架构、工业级可靠性、丰富外设接口,成为新一代DTU/FTU的理想计算...
这款“单片机”有些特殊!硬件资源集成了:ü   1.5GHz超高主频ü   1Gb内存、2Gb Flashü   支持2路百兆网口ü   6路串口、2路CAN FDü   MIPI与LCDü   USB、SPI、IIC、PWM、SAI、IO…软件资源支持:ü   RT-Threadü   Linuxü   RT-Thread + Linux混合部署还有一大特点:ü   支持在Windows下...
1、RK3506 CAN总线测试概述使用USBCANFD-200U测试HD-RK3506-EG1200网关的CAN接口性能与稳定性。HD-RK3506-EG1200 的CAN接口同时支持CAN2.0和CANFD模式。所以分别进行测试。2、RK3506 CAN总线测试步骤HD-RK3506-EG1200网关的CAN接口支持CAN2.0和CANFD硬件传输协议,分开测试两种硬件接口协议的收发功能...
武汉万象奥科电子有限公司
服务热线:027-59218026
销售邮箱:sales@vanxoak.com
主营产品:ARM核心板、ARM工控板
工业网关、软硬件定制设计
地址:武汉东湖新技术开发区大学园路长城园路8号海容基孵化园B5

扫描二维码
关注公众号
产品及方案咨询
专业专注   合作共赢
移动电话:181 2058 0511 (湖北)
移动电话:175 7010 9551 (华南、华中)
移动电话:133 0386 9667 (华东、华北)