当前位置: 首页 > news >正文

linuxARM裸机学习笔记(4)----GPIO中断以及定时器中断实验

1.中断向量表

这个表里面存放的都是中断向量,中断服务程序的入口地址或存放中断服务程序的首地址成为中断向量。中断向量表是一系列中断服务程序入口地址组成的表,当某个中断触发的时候会自动跳转到中断向量表对应的中断服务程序的入口。

2.NVIC(内嵌向量中断控制器)

在IMU6U的中断管理机构叫做GIC。GIC接受到外部中断汇报给ARM内核,ARM内核提供了四个信号给GIC来回报中断情况。

中断源分为三个部分:

SPI(Shared Peripheral Interrupt), 共享中断,顾名思义,所有 Core 共享的中断,这个是最
常见的,那些外部中断都属于 SPI 中断 ( 注意!不是 SPI 总线那个中断 ) 。比如按键中断、串口
中断等等,这些中断所有的 Core 都可以处理,不限定特定 Core
PPI(Private Peripheral Interrupt) ,私有中断,我们说了 GIC 是支持多核的,每个核肯定
有自己独有的中断。这些独有的中断肯定是要指定的核心处理,因此这些中断就叫做私有中断。
SGI(Software-generated Interrupt) ,软件中断,由软件触发引起的中断,通过向寄存器
GICD_SGIR 写入数据来触发,系统会使用 SGI 中断来完成多核之间的通信。
ID0~ID15 :这 16 ID 分配给 SGI
ID16~ID31 :这 16 ID 分配给 PPI
ID32~ID1019 :这 988 ID 分配给 SPI。

GIC逻辑模块:

Distributor【分发器端】 和 CPU Interface【CPU接口端】

 中断使能

IRQ和FIQ分别是外部中断和快速中断的总开关

中断使能

GIC 寄存器 GICD_ISENABLERn 和 GICD_ ICENABLERn 用来完成外部中断的使能和禁
止,对于 Cortex-A7 内核来说中断 ID 只使用了 512 个。一个 bit 控制一个中断 ID 的使能,那么
就需要 512/32=16 个 GICD_ISENABLER 寄存器来完成中断的使能。同理,也需要 16 个
GICD_ICENABLER 寄存器来完成中断的禁止。其中 GICD_ISENABLER0 的 bit[15:0]对应
ID15~0 的 SGI 中断,GICD_ISENABLER0 的 bit[31:16]对应 ID31~16 的 PPI 中断。剩下的
GICD_ISENABLER1~GICD_ISENABLER15 就是控制 SPI 中断的

中断优先级设置

中断优先级也可以分为抢占优先级和子优先级,根据GICC_PMR的低八位来控制优先级级数的范围, GIC 控制器最多可以支持 256 个优先级,数字越小,优先级越高

 I.MX6U Cortex-A7 内核,所以支持 32 个优先级,因此 GICC_PMR 要设置为 0b11111000

抢占优先级和子优先级位数设置

I.MX6U 的优先级
位数为 5(32 个优先级 ) ,所以可以设置 Binary point 2 ,表示 5 个优先级位全部为抢占优先级。

这里解释一下:优先级位数如果是5,则代表的是2的5次方即32个不同的优先级级别,,所以才选择了Binary Point为2。全部为抢占优先级。

 优先级设置

1.设置寄存器 GICC_PMR ,配置优先级个数,比如 I.MX6U 支持 32 级优先级。
2.设置抢占优先级和子优先级位数,一般为了简单起见,会将所有的位数都设置为抢占
优先级。
3.设置指定中断 ID 的优先级,也就是设置外设优先级。

代码段

/***************************************************************
Copyright © zuozhongkai Co., Ltd. 1998-2019. All rights reserved.
文件名	: 	 bsp_exit.c
作者	   : 左忠凯
版本	   : V1.0
描述	   : 外部中断驱动。
其他	   : 配置按键对应的GPIP为中断模式
论坛 	   : www.wtmembed.com
日志	   : 初版V1.0 2019/1/4 左忠凯创建
***************************************************************/
#include "bsp_exit.h"
#include "bsp_gpio.h"
#include "bsp_int.h"
#include "bsp_delay.h"
#include "bsp_beep.h"/** @description			: 初始化外部中断* @param				: 无* @return 				: 无*/
void exit_init(void)
{gpio_pin_config_t key_config;/* 1、设置IO复用 */IOMUXC_SetPinMux(IOMUXC_UART1_CTS_B_GPIO1_IO18,0);			/* 复用为GPIO1_IO18 */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);GIC_EnableIRQ(GPIO1_Combined_16_31_IRQn);				/* 使能GIC中对应的中断 */system_register_irqhandler(GPIO1_Combined_16_31_IRQn, (system_irq_handler_t)gpio1_io18_irqhandler, NULL);	/* 注册中断服务函数 */gpio_enableint(GPIO1, 18);								/* 使能GPIO1_IO18的中断功能 */
}/** @description			: GPIO1_IO18最终的中断处理函数* @param				: 无* @return 				: 无*/
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); /* 清除中断标志位 */
}

复用IO口,设置中断触发方式。使能GIC以及GPIO中断

EPIT 定时器实验
EPIT定时器:完成 周期性的中断定时方式【仅此一个功能!!!】,32位寄存器, EPIT 是一个 向下计数器

EPIT 定时器有两种工作模式:set-and-forget free-running 

set-and-forget 模式 :EPITx_CR(x=1, 2) 寄存器的 RLD 位置 1 的时候 EPIT 工作在此模式
下,在此模式下 EPIT 的计数器从加载寄存器 EPITx_LR 中获取初始值,不能直接向计数器寄存
器写入数据。不管什么时候,只要计数器计数到 0 ,那么就会从加载寄存器 EPITx_LR 中重新
加载数据到计数器中,周而复始。
free-running 模式 EPITx_CR 寄存器的 RLD 位清零的时候 EPIT 工作在此模式下,当计数
器计数到 0 以后会重新从 0XFFFFFFFF 开始计数,并不是从加载寄存器 EPITx_LR 中获取数据。

/***************************************************************
Copyright © zuozhongkai Co., Ltd. 1998-2019. All rights reserved.
文件名	: 	 bsp_epittimer.c
作者	   : 左忠凯
版本	   : V1.0
描述	   : EPIT定时器驱动文件。
其他	   : 配置EPIT定时器,实现EPIT定时器中断处理函数
论坛 	   : www.wtmembed.com
日志	   : 初版V1.0 2019/1/5 左忠凯创建
***************************************************************/
#include "bsp_epittimer.h"
#include "bsp_int.h"
#include "bsp_led.h"/** @description		: 初始化EPIT定时器.*					  EPIT定时器是32位向下计数器,时钟源使用ipg=66Mhz		 * @param - frac	: 分频值,范围为0~4095,分别对应1~4096分频。* @param - value	: 倒计数值。* @return 			: 无*/
void epit1_init(unsigned int frac, unsigned int value)
{if(frac > 0XFFF)frac = 0XFFF;EPIT1->CR = 0;	/* 先清零CR寄存器 *//** CR寄存器:* bit25:24 01 时钟源选择Peripheral clock=66MHz* bit15:4  frac 分频值* bit3:	1  当计数器到0的话从LR重新加载数值* bit2:	1  比较中断使能* bit1:    1  初始计数值来源于LR寄存器值* bit0:    0  先关闭EPIT1*/EPIT1->CR = (1<<24 | frac << 4 | 1<<3 | 1<<2 | 1<<1);EPIT1->LR = value;	/* 倒计数值 */EPIT1->CMPR	= 0;	/* 比较寄存器,当计数器值和此寄存器值相等的话就会产生中断 *//* 使能GIC中对应的中断 			*/GIC_EnableIRQ(EPIT1_IRQn);/* 注册中断服务函数 			*/system_register_irqhandler(EPIT1_IRQn, (system_irq_handler_t)epit1_irqhandler, NULL);	EPIT1->CR |= 1<<0;	/* 使能EPIT1 */ 
}/** @description			: EPIT中断处理函数* @param				: 无* @return 				: 无*/
void epit1_irqhandler(void)
{ static unsigned char state = 0;state = !state;if(EPIT1->SR & (1<<0)) 			/* 判断比较事件发生 */{led_switch(LED0, state); 	/* 定时器周期到,反转LED */}EPIT1->SR |= 1<<0; 				/* 清除中断标志位 */
}

相关文章:

linuxARM裸机学习笔记(4)----GPIO中断以及定时器中断实验

1.中断向量表 这个表里面存放的都是中断向量&#xff0c;中断服务程序的入口地址或存放中断服务程序的首地址成为中断向量。中断向量表是一系列中断服务程序入口地址组成的表&#xff0c;当某个中断触发的时候会自动跳转到中断向量表对应的中断服务程序的入口。 2.NVIC(内嵌向…...

第十二次CCF计算机软件能力认证

第一题&#xff1a;最小差值 给定 n 个数&#xff0c;请找出其中相差&#xff08;差的绝对值&#xff09;最小的两个数&#xff0c;输出它们的差值的绝对值。 输入格式 输入第一行包含一个整数 n。 第二行包含 n 个正整数&#xff0c;相邻整数之间使用一个空格分隔。 输出格式 …...

ceph pg inconsistent修复(unexpected clone)

问题概述&#xff1a; ceph -s 显示pg 10.17 inconsistent 且命令ceph pg repair 10.17无法修复&#xff0c;/var/log/ceph/cep-osd.3.log报错内容如下&#xff1a; pg 10.17 osd [3,4] 权威副本osd&#xff1a;3 repair 10.17 10:e889b16a:::rbd_data.88033092ad95.00000000…...

供求重构是产业互联网的核心 个体崛起是产业互联网的终点

文章开头提到的网约车市场缘何会出现这样的困境&#xff1f;其中一个很重要的原因在于&#xff0c;建构于互联网模式之下的供求关系业已走到了尽头&#xff0c;仅仅只是依靠撮合和中介&#xff0c;仅仅只是凭借平台和中心开始无法破解供求两端的矛盾和问题。如何解决这一问题&a…...

torchvision.datasets数据加载失败

torchvision.datasets数据加载失败 如何使用torchvision.datasets进行自动下载数据失败&#xff0c;可以使用手动下载数据 Ctrl点击可以进入相关包文件&#xff0c;查找下载地址&#xff1a;https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz 手动下载之后解压&#x…...

【UEC++学习】UE网络 - Replication、RPC

1. UE网络架构 &#xff08;1&#xff09;UE的网络架构是SC&#xff08;Server - Client&#xff09;的模式&#xff0c;这种模式的优势&#xff1a;这种模式让所有客户端都在服务器端进行安全验证&#xff0c;这样可以有效的防止客户端上的作弊问题。 &#xff08;2&#xff…...

C语言案例 按序输出三个整数-02

题目&#xff1a;输入三个整数a,b,c,按从小到大的顺序输出 步骤一&#xff1a;定义程序的目标 编写一个C程序&#xff0c;随机输入三个整数&#xff0c;按照从小到大的顺序输出。 步骤二&#xff1a;程序设计 整个程序由三个模块组成&#xff0c;第一个为scanf输入函数模块&a…...

区块链实验室(16) - FISCO BCOS实验环境

经过多次重复&#xff0c;建立一个FISCO BCOS实验环境。该环境是一个VMWare虚拟机&#xff0c;能够启动FISCO BCOS自创建的4节点区块链&#xff0c;不必下载依赖包即可编译Fisco Bcos目标文件&#xff0c;安装有VsCode1.81版本。 启动4节点的Fisco Bcos区块链 启动控制台 编译…...

Java事件监听机制

这里写目录标题 先进行专栏介绍再插一句 开始喽事件监听机制分析观察者模式观察者模式由以下几个角色组成&#xff1a;观察者模式的工作流程如下&#xff1a;观察者模式的优点包括&#xff1a;观察者模式适用于以下场景&#xff1a;总结 事件监听机制的工作流程如下&#xff1a…...

记一次ubuntu16误删libc.so.6操作的恢复过程

背景 操作系统&#xff1a;ubuntu16 glibc版本&#xff1a;2.23 修改原因&#xff1a; 经过一系列报错和手工构建之后&#xff0c;vulkansdk成功安装&#xff08;起码运行./vulkansdu成功&#xff09;&#xff0c;在进行./vulkaninfo进行验证时&#xff0c;报错&#xff1a…...

MAVLINK—C语言demoWindows版本

mavlink/examples/c/udp_example.c 在学习mavlink时准备学习一下官网的C语言example&#xff0c;发现是unix系统的&#xff0c;打算在Windows系统下尝试&#xff0c;于是将示例修改了一下。 #include <stdio.h> #include <errno.h> #include <string.h> #in…...

区块链实验室(15) - 编译FISCO BCOS的过程监测

首次编译开源项目&#xff0c;一般需要下载很多依赖包&#xff0c;尤其是从github、sourceforge等下载依赖包时&#xff0c;速度很慢&#xff0c;编译进度似乎没有一点反应&#xff0c;似乎陷入死循环&#xff0c;似乎陷入一个没有结果的等待。本文提供一种监测方法&#xff0c…...

java_IO其它架包使用

文章目录 apache-common包的使用 apache-common包的使用 IO技术开发中&#xff0c;代码量很大&#xff0c;而且代码的重复率较高&#xff0c;为此Apache软件基金会&#xff0c;开发了IO技术的工具类commonsIO&#xff0c;大大简化了IO开发。 Apahce软件基金会属于第三方&…...

一、7.协同式任务切换与抢占式任务切换

使用TSS来在任务切换时保护现场和恢复现场 内核任务&#xff1a;单纯由内核组成的任务&#xff0c;和其他用户程序组成其他任务 内核任务的创建 ;为内核任务创建任务控制块TCB mov ecx, 0x46 call sys_routine_seg_sel:allocate_memory call append_to_tcb_link ;将此TCB添加…...

JavaScript实践:用Canvas开发一个可配置的大转盘抽奖功能

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f3c6;本文已…...

yay无法更新问题解决

背景 更新yay后&#xff0c;yay安装软件捞出问题&#xff0c;查的github上的都不靠谱。因此需要把yay的版本固定下&#xff0c;正常的11版本是可用的 解决方案 sudo pacman -S --needed git base-devel git clone https://aur.archlinux.org/yay.git cd yay makepkg -si # 注…...

C语言 — 动态内存管理(动态内存函数)

前言 本期分为三篇介绍动态内存管理相关内容&#xff0c;关注博主了解更多 博主博客链接&#xff1a;https://blog.csdn.net/m0_74014525 本期介绍动态内存函数&#xff0c;函数如何使用、函数格式、在使用在所需要的注意点及C/C程序的内存开辟区域 系列文章 第一篇&#xff…...

Visual ChatGPT:Microsoft ChatGPT 和 VFM 相结合

推荐&#xff1a;使用 NSDT场景编辑器助你快速搭建可二次编辑的3D应用场景 什么是Visual ChatGPT&#xff1f; Visual ChatGPT 是一个包含 Visual Foundation 模型 &#xff08;VFM&#xff09; 的系统&#xff0c;可帮助 ChatGPT 更好地理解、生成和编辑视觉信息。VFM 能够指…...

基于java理发店预约系统微信小程序设计与实现

摘要 多姿多彩的世界带来了美好的生活&#xff0c;行业的发展也是形形色色的离不开技术的发展。作为时代进步的发展方面&#xff0c;信息技术至始至终都是成就行业发展的重要秘密。不论何种行业&#xff0c;大到国家、企业&#xff0c;小到团体、个人都在多方位的结合信息化技术…...

【软件测试】大厂测工都是这样学习的,你get到了吗?

有不少的软件测试工程师站在“十字路口”迷茫、无助&#xff0c;找不到自己的方向。一切的迷茫都是因为想得太多而做的太少&#xff01;每位软件测试行业从业者都能意识到目前自己面临的窘境&#xff0c;但能及时作出改变&#xff0c;顺应时代变化的人还是太少。多数人明明“泰…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

省略号和可变参数模板

本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...

Linux部署私有文件管理系统MinIO

最近需要用到一个文件管理服务&#xff0c;但是又不想花钱&#xff0c;所以就想着自己搭建一个&#xff0c;刚好我们用的一个开源框架已经集成了MinIO&#xff0c;所以就选了这个 我这边对文件服务性能要求不是太高&#xff0c;单机版就可以 安装非常简单&#xff0c;几个命令就…...