Linux学习_GPIO中断编程

这篇具有很好参考价值的文章主要介绍了Linux学习_GPIO中断编程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


linux用户态gpio中断,linux,学习,单片机

配置GPIO口为输入/中断

  1. 使能GPIO口(从CCM里面找)
  2. 将该口设置工作在GPIO功能下(从MUX里面找)
  3. 选择该口为输入/输出,中断需要其工作在中断/输入模式下。

配置GPIO作为中断的触发方式

芯片手册的GPIOx部分,可以设置其高电平/低电平/上升沿/下降沿/双边沿触发

清零中断状态

为防止先前留有其他的中断状态产生干扰,先对中断状态进行清除,置位ISR寄存器清除GPIO,并调用clear_gic_irq()函数清除GIC。

控制GPIO与GIC使能中断

  1. 需要在GPIO_IMR寄存器中设置使能,否则该使能位默认置0屏蔽。
  2. 需要利用gic_enable_irq函数使能gic使其工作在irq状态下。(函数输入的中断号从芯片手册找)

CPU中断使能

CPU的CPSR寄存器中有一位:I位,用来使能/禁止中断
可以使用以下汇编指令修改I位:

CPSIE I  ; //清除I位,使能中断
CPSID I  ; //设置I位,禁止中断

CPSIE I ;这一行加入start.s中,放在main函数调用前。

start.s函数改写

加入do_irq函数的定义

do_irq:
		/* 设置SP_irq */
		ldr sp, =STACK_BASE - STACK_SIZE - STACK_SIZE - STACK_SIZE
		
		/* 保存现场 */
		subs lr, lr, #4
		stmdb sp!, {R0-R3,R12,LR}
		
		/* 调用处理函数 */
		bl do_irq_c
		
		/* 恢复现场 */
		ldmia sp!, {R0-R3,R12,PC}^

在_start函数中加入:ldr PC, =do_irq;以将其加入调用文章来源地址https://www.toymoban.com/news/detail-687781.html

写处理函数

void do_irq_c(void)
{
	int irq;
	GPIO_Type *gpio4 = (GPIO_Type *)0x020A8000;
	/* 1. 分辨中断 */
	irq = get_gic_irq();
	/* 2. 调用处理函数 */
	if (irq == IRQ_GPIO4_0_15)
	{
		if (gpio4->DR & (1<<14)) puts("KEY2 pressed!\n\r");
		else puts("KEY2 released!\n\r");
		gpio4->ISR |= (1<<14);//清除中断源头GPIO
	}
	/* 3. 清除中断 */
	clear_gic_irq(irq);//清除中断控制器gic
}

到了这里,关于Linux学习_GPIO中断编程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux GPIO模块-RK3588 GPIO驱动分析

    GPIO是可编程的通用I/O外设。如下图所示,RK3588 GPIO控制器包含3个部分;APB接口模块和SoC内部的APB总线连接,负责与SoC交换数据,位宽为32位;I/O port接口模块管理外部的引脚,引脚的输入和输出都要经过该模块;中断探测模块负责GPIO控制器的中断上报与处理。 RK3588 GPIO控制器

    2023年04月15日
    浏览(39)
  • linux驱动-gpio

    最近处理es8336声卡问题,最后排查是spk_ctl_gpio和hp_det_gpio这两个gpio导致的,所以恶补了一下gpio相关的知识,现在总结一下。 源代码使用的是飞腾的gitee上开源的内核:https://gitee.com/phytium_embedded/phytium-linux-kernel.git 设备驱动层:定义了与硬件无关的GPIO API,包括GPIO的注册、卸载

    2024年02月13日
    浏览(54)
  • 嵌入式学习笔记——使用寄存器编程操作GPIO

    上一篇重点介绍了STM32 GPIO的输入输出模式,在整个框图中我们发现需要我们使用代码来控制GPIO的模式,本文的重点就是使用寄存器的编程方式,实现对于GPIO口的操作。 在这里首先需要做一个区分,我们常见的STM32的开发方式有两种,也就是寄存器开发与库函数开发。寄存器

    2023年04月09日
    浏览(45)
  • Linux驱动开发:gpio子系统

    目录 1、GPIO配置流程 2、GPIO子系统API 2.1 of_find_node_by_path 2.2 of_get_named_gpio 2.3 gpio_request 与 gpiod_get 与 gpiod_get_index 2.4 gpio_direction_input 与 gpiod_direction_input 2.5 gpio_direction_output 与 gpiod_direction_output 2.6 gpio_get_value 与 gpiod_get_value 2.7 gpio_set_value 与 gpiod_set_value 2.8  gpiod_get_from

    2024年02月12日
    浏览(45)
  • LINUX驱动之——GPIO的基本驱动

    楼主在网上找了很多相关LINUX驱动开发的相关例程。发现基本的驱动开发都是有框架或者多种开发手段的,我们可以使用不同的开发方式来降低开发难度。有文件系统的开发和LINUX系统自带的内核函数来开发。这两者有什么区别呢?就像是单片机的库函数开发和寄存器开发一样

    2024年02月05日
    浏览(144)
  • Linux下控制GPIO的三种方法

    https://blog.csdn.net/qq_41076734/article/details/124669908 1. 应用空间控制gpio 1.1简介 在/sys/class/gpio/下有个export文件,向export文件写入要操作的GPIO号,使得该GPIO的操作接口从内核空间暴露到用户空间,GPIO的操作接口包括direction和value等,direction控制GPIO输入或者输出模式,而value可控制

    2024年02月03日
    浏览(41)
  • 【Linux驱动开发】011 gpio子系统

    前面我们编写了基于设备树的 LED 驱动,但是驱动的本质还是没变,都是配置 LED 灯所使用的 GPIO 寄存器,驱动开发方式和裸机基本没啥区别。本章我们就来学习一下如何借助 pinctrl 和 gpio 子系统来简化 GPIO 驱动开发。   Linux 内核针对 PIN 的配置推出了 pinctrl 子系统,对于

    2024年02月03日
    浏览(46)
  • linux驱动_leds-gpio

    项目里面有几个通信通道,每个通道有个状态指示灯(LED)。预期断开是灭,已连接是亮,数据传输时闪烁。一开始使用通用sysfs文件系统控制GPIO的方式控制,例如用以下脚本控制GPIO: 在应用软件实现点灯逻辑,控制亮和灭都没问题,但是闪烁功能的实时性太差,只能考虑别的

    2024年02月11日
    浏览(41)
  • Linux 操作系统实战视频课 - GPIO 基础介绍

    沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇我们将讲解 GPIO 。 ARM 平台中的 GPIO(通用输入/输出)是用于与外部设备进行数字输入和输出通信的重要硬件接口。ARM 平台的 GPIO 特性可以根据具体的芯片和开发板而有所不同,但通常具有以下一般特性: 数字输入

    2024年02月10日
    浏览(37)
  • STM32的HAL库开发系列 - GPIO中断/外部中断EXTI

    STM32的HAL库开发系列 - GPIO中断/外部中断EXTI 中断它可以在GPIO口的电平发生变化时产生中断,从而使得STM32微控制器能够及时响应外部设备的变化。 STM32的GPIO中断/外部中断EXTI可以配置为上升沿中断、下降沿中断和双边沿中断三种类型,分别在GPIO口电平从低电平变为高电平、从

    2024年02月12日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包