ARM平台FS6818/s5p6818开发板实验6 —— 按键中断实验

2023-05-16

按键中断实验:

实验内容:

通过简单事例说明s5p6818处理器的GIC中断处理的应用,设置key2按键连接的引脚为中断模式,当识别按键被按下时进入相应的中断处理函数

实验目的:

熟悉开发环境的使用

掌握s5p6818处理器的中断过程及编程。

实验平台:

FS_6818开发平台,Ubuntu,secureCRT。

实验6-按键中断实验

  1. 分析电路图

  1. 分析芯片手册

分析芯片手册的GPIO章节。

 

GPIOxOUTENB:GPIOx引脚输出使能寄存器

GPIOxDETMODE0/1:GPIOx引脚事件检查模式寄存器

               中断的触发方式:低电平,高电平,下降沿,上升沿

       GPIOxINTENB:GPIOx引脚中断使能寄存器

GPIOxDET:GPIOx引脚事件检测寄存器

GPIOxALTFN0/1:GPIOx引脚复用功能选择寄存器

GPIOxDETMODEEX:GPIOx引脚事件检查外部寄存器

GPIOxDETENB:GPIOx引脚检测使能寄存器

 

  1. GPIOB8引脚设置为GPIO功能   GPIOBALTFN0

  1. 设置GPIOB8引脚位输入功能    GPIOBOUTENB

3》 设置GPIOB8引脚的中断的触发方式(下降沿触发)

GPIOxDETMODE0/1 

GPIOxDETMODEEX

4》设置中断使能寄存器   GPIOxINTENB

5》事件检测寄存器:GPIOxDET

作用:中断挂起的标志位,当读GPIOx引脚对应的位为1,表示中断发生。

        在相应的位写1,可以清除中断挂起标志位,可以接收下一次中断。

 

6》使能GPIOx引脚检测使能寄存器  GPIOxDETENB

GIC章节分析:

1》GICD_CTRL:GICD全局使能寄存器

2》GICD_ISENABLER:中断设置使能寄存器

GIC支持16个SGI,16个PPI,128个SPI,总计160个中断信号。

而GICD_ISENABLERn寄存器中每一位管理着一个中断号,

一个寄存器最多管理32个中断号,所以需要5个这样的寄存器,

管理160个中断号。

我们需要找到86中断号对应着5个ISENABLERn寄存器中的

哪个寄存器,以及这个寄存器的哪1位。

GICD_ISENABLER2[22] = 0b1

86 / 32 = 2…22

3》GICD_IPRIORITYRn (n = 0 to 39)  中断信号优先级设置寄存器

而GICD_IPRIORITYRn寄存器中每8位管理着一个中断号,

一个寄存器最多管理4个中断号,所以需要40个这样的寄存器,

管理160个中断号。

我们需要找到86中断号对应着40个GICD_IPRIORITYRn寄存器中的哪个寄存器,

以及这个寄存器的哪8位。

GICD_IPRIORITYR21[23:16] = 86;

 

  1.  4 = 21…2

 

4GICD_ITARGETSRn中断目标分配寄存器

而GICD_ITARGETSRn寄存器中每8位管理着一个中断号,

一个寄存器最多管理4个中断号,所以需要40个这样的寄存器,

管理160个中断号。

我们需要找到86中断号对应着40个GICD_ITARGETSRn寄存器中的哪个寄存器,

以及这个寄存器的哪8位。

GICD_ITARGETSRn21[23:16] = 0x1;

86 / 4 = 21…2

5》GICD_ICPENDERn:中断挂起标志位清除寄存器

而GICD_ICPENDERn寄存器中每一位管理着一个中断号,

一个寄存器最多管理32个中断号,所以需要5个这样的寄存器,

管理160个中断号。

 

我们需要找到86中断号对应着5个GICD_ICPENDERn寄存器中的

哪个寄存器,以及这个寄存器的哪1位。

GICD_ICPENDER2[22] = 0b1

 

 

6》GICC_CTRL:GICC中断使能寄存器

7》GICC_PMR:中断优先级屏蔽寄存器

8》GICC_IAR:中断应答寄存器

9》GICC_EOIR:中断结束寄存器

  1. 编写代码

main.c


#include "led.h"
#include "pwm.h"
#include "delay.h"
#include "uart0.h"
#include "wdt.h"
#include "adc.h"
#include "key.h"
int main()
{
	hal_led_init();
	hal_uart_init();
	hal_gpio_init();
	hal_gic_init();
	Tri_String("KEY Interrupt Test\n");
	while(1)
	{
		// 按键中断到来,
		// 打断当前正在处理的程序
		// 进入中断处理程序
		// 需要了解:异常的处理过程。
	}
	return 0;
}

key.c


#include "key.h"
void hal_gpio_init(void)
{
	// 1. 设置GPIOB8引脚为GPIO功能 GPIOBALTFN0
	GPIOB.ALTFN0 &= (~(0x3 << 16));
	// 2. 设置GPIOB8引脚为输入功能 GPIOBOUTENB
	GPIOB.OUTENB &= (~(0x1 << 8));
	// 3. 设置GPIOB8引脚的中断触发方式:下降沿触发
	// 		GPIOBDETMODE0  GPIOBDETMODEEX
	GPIOB.DETMODE0 &= (~(0x3 << 16));
	GPIOB.DETMODE0 |= (0x2 << 16);
	GPIOB.DETMODEEX &= (~(0x1 << 8));
	// 4. 设置GPIOB8引脚中断使能寄存器  GPIOBINTENB 
	GPIOB.INTENB |= (0x1 << 8);
	// 5. 设置GPIOB8引脚的检测使能寄存器  GPIOBDETENB
	GPIOB.DETENB |= (0x1 << 8);

	// 1. 设置GPIOB16引脚为GPIO功能 GPIOBALTFN1
	GPIOB.ALTFN1 &= (~(0x3 << 0));
	GPIOB.ALTFN1 |= (0x2 << 0);
	// 2. 设置GPIOB16引脚为输入功能 GPIOBOUTENB
	GPIOB.OUTENB &= (~(0x1 << 16));
	// 3. 设置GPIOB16引脚的中断触发方式:下降沿触发
	// 		GPIOBDETMODE1  GPIOBDETMODEEX
	GPIOB.DETMODE1 &= (~(0x3 << 0));
	GPIOB.DETMODE1 |= (0x2 << 0);
	GPIOB.DETMODEEX &= (~(0x1 << 16));
	// 4. 设置GPIOB16引脚中断使能寄存器  GPIOBINTENB 
	GPIOB.INTENB |= (0x1 << 16);
	// 5. 设置GPIOB16引脚的检测使能寄存器  GPIOBDETENB
	GPIOB.DETENB |= (0x1 << 16);
}
void hal_gic_init(void)
{
	// GICD
	// 1. 设置GICD层86号对应的中断使能寄存器 GICD_ISENABLER2[22]
	GICD_ISENABLER.ISENABLER2 |= (0x1 << 22);
	// 2. 设置中断优先级寄存器 GICD_IPRIORITYR21[23:16]
	GICD_IPRIORITYR.IPRIORITYR21 &= (~(0xFF << 16));
	GICD_IPRIORITYR.IPRIORITYR21 |= (86 << 16);
	// 3. 设置中断目标分配寄存器 GICD_ITARGETSR21[23:16]
	GICD_ITARGETSR.ITARGETSR21 &= (~(0xFF << 16));
	GICD_ITARGETSR.ITARGETSR21 |= (0x1 << 16);
	// 4. 设置GICD层全局中断使能寄存器 GICD_CTRL[0]
	GICD_CTRL |= (0x1);

	// GICC
	// 5. 设置GICC层中断全局使能寄存器 GICC_CTRL[0]
	GICC_CTRL |= (0x1);
	// 6. 设置GICC层中断屏蔽寄存器  GICC_PMR[7:0]
	GICC_PMR |= (0xFF);
}

do_irq.c

// irq类型中断处理程序的入口
#include "s5p6818.h"
#include "delay.h"
void do_irq(void) 
{
	int irq_num;
	// 获取中断号 GICC_IAR[9:0]
	irq_num = GICC_IAR & 0x3FF;	
	switch(irq_num) {
	case 86:
		//86号中断处理程序
		printf("KEY Interrupt Number = %d\n",irq_num);
		if (GPIOB.DET & (0x1 << 8)) {
			// 按键按下
			while(!(GPIOB.PAD & (1 << 8))) {
				delay_ms(10);  // 去抖动
				// 松手检测  
				while(!(GPIOB.PAD & (1 << 8))); 
				printf("KEY VOL+\n");
			}
			// 清除GPIO层中断挂起标志位 GPIOBDET
			GPIOB.DET |= (0x1 << 8);

		} else if (GPIOB.DET & (0x1 << 16)) {
			while(!(GPIOB.PAD & (1 << 16))) {
				delay_ms(10);
				while(!(GPIOB.PAD & (1 << 16)));
				printf("KEY VOL-\n");
			}
			// 清除GPIO层中断挂起标志位 GPIOBDET
			GPIOB.DET |= (0x1 << 16);
		}
		// 清除GICD层中断挂起标志位 GICD_ICPENDER2[22]
		GICD_ICPENDER.ICPENDER2 |= (0x1 << 22);
		break;
	case 87:		
		//87号中断处理程序
		break;
		// ....
	}
	// 清除GICC层中断号  GICC_EOIR[9:0]
	GICC_EOIR = (GICC_EOIR & (~0x3FF)) | irq_num;
}

key.h

#ifndef __KEY_H__
#define __KEY_H__
#include "s5p6818.h"
void hal_gpio_init(void);
void hal_gic_init(void);

#endif //__KEY_H__

 

  1. 下载调试

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ARM平台FS6818/s5p6818开发板实验6 —— 按键中断实验 的相关文章

  • 跳表的动态演示

    跳表的动态演示 插入操作 删除操作 xff1a 查询操作 xff1a
  • [模拟/模拟/有技巧的搜索] csp第一次模拟

    目录 题目一 咕咕东的奇遇题意样例思路总结代码 题目二 咕咕东想吃饭题意样例思路总结代码 题目三 可怕的宇宙射线题意样例思路总结代码 题目一 咕咕东的奇遇 题意 有一个如图所示的圆环 xff0c 初始时指针指在a处 给定一个字符串 xff0
  • [单调栈/差分/尺取/单调队列]Exercise Week5 A最大矩形+B魔法猫+C平衡字符串+D滑动窗口

    目录 A 单调栈 最大矩形题意样例思路总结代码 B 差分 TT 39 s Magic Cat题意样例思路总结代码 C 尺取 平衡字符串题意样例思路总结代码 D 单调队列 滑动窗口题意样例思路总结代码 A 单调栈 最大矩形 题意 给一个直方图
  • [树的直径/并查集/最小生成树/最小瓶颈生成树]Exercise Week6 A+B+C+D

    目录 A 树的直径 氪金带东题意样例思路总结代码 B 并查集 戴好口罩 xff01 题意样例思路总结代码 C 最小生成树 掌握魔法 东东题意样例思路总结代码 D 最小瓶颈生成树 数据中心题意样例思路总结代码 A 树的直径 氪金带东 题意 实
  • [差分约束/拓扑排序/kosaraju缩点]Exercise Week8 A+B+C

    目录 A 差分约束 区间选点 题意样例样例输入 xff1a 样例输出 思路总结代码 B 拓扑排序 猫猫向前冲题意样例样例输入 xff1a 样例输出 xff1a 思路总结代码 C SCC缩点 区间选点 题意样例样例输入 xff1a 样例输出
  • [大模拟]Test Week8 二阶魔方

    目录 大模拟 东东玩二阶魔方题意d样例样例输入 xff1a 样例输出 思路总结代码 B 模拟 ST串题意样例样例输入 xff1a 样例输出 xff1a 思路总结代码 大模拟 东东玩二阶魔方 题意d 东东有一个二阶魔方 xff0c 即2 2
  • [大模拟]Test Week14 猫睡觉问题

    目录 大模拟 猫睡觉问题题意样例样例输入 xff1a 样例输出 思路总结代码 大模拟 猫睡觉问题 题意 众所周知 xff0c TT家里有一只魔法喵 这只喵十分嗜睡 一睡就没有白天黑夜 喵喵一天可以睡多次 xff01 xff01 每次想睡多久
  • [区间DP/状压DP]Exercise Week12 A~E

    目录 A 水 找数题意样例样例输入 xff1a 样例输出 思路总结代码 B BFS 逃离题意样例样例输入 xff1a 样例输出 xff1a 思路总结代码 C DP 扫楼题意样例样例输入 xff1a 样例输出 思路总结代码 D 区间DP 最长
  • 新的开始( [USACO08OCT]打井Watering Hole)

    新的开始 newstart pas c cpp 题目描述 话说小 FF 在经历了上次 寻找古代王族遗产 的探险后 xff0c 成为了世界上最伟大的探险 家并拥有了一大笔财富 当然他不能坐吃山空 xff0c 必须创造财富 xff01 xff0
  • UOS配置本地APT源和外部软件包

    root 64 skill PC mount dev sr0 mnt mount mnt WARNING device write protected mounted read only root 64 skill PC vi etc ap
  • [二分答案] 洛谷P1873 砍树

    目录 题意样例样例输入 xff1a 样例输出 思路总结代码 题意 伐木工人米尔科需要砍倒M米长的木材 这是一个对米尔科来说很容易的工作 xff0c 因为他有一个漂亮的新伐木机 xff0c 可以像野火一样砍倒森林 不过 xff0c 米尔科只被
  • [区间DP]洛谷P1063 能量项链

    目录 题意样例样例输入 xff1a 样例输出 思路总结代码 题意 样例 样例输入 xff1a 4 2 3 5 10 样例输出 710 思路 1 经典区间DP题 算是合并石子的变种 只不过由一个点变成了一个区间 不过我们也可以用结构体存储 当
  • Linux命令行初接触-1 操作文件和目录

    操作文件 amp 目录 1 通配符含义常用通配符常用字符类类型匹配范例 2 mkdir 创建目录3 cp 复制文件和目录工作方式常用选项 4 mv 移动和重命名文件工作方式常用选项 5 rm 删除文件和目录工作方式常用选项注意事项 6 ln
  • 机器学习入入入入门(1)机器学习基本概念、引出深度学习

    机器学习入入入入门 xff08 1 xff09 0 前言1 基本步骤2 基本概念2 1 Hyperparameters2 2 local minima 3 linear model3 1 基础概念 4 piecewise linear cu
  • 深度学习蒟蒻入门——从0安装pytorch(CPU版)

    从0安装pytorch 1 检查自己的电脑有没有GPU2 安装CPU版的pytorch3 测试pytorch 1 检查自己的电脑有没有GPU 首先打开任务管理器 xff0c 选择性能栏 然后滑到最下 xff0c 看是否有GPU一项 xff0
  • 系统学习iOS动画 —— Stroke和路径动画

    这是要完成的动画 xff1a 先添加需要的代码 xff0c 这里需要将storyboard的ViewController换成TableViewController xff0c 将Under Top Bars 和 Under Bottom B
  • 不知道这些网站还做什么程序员呀!

    今天我就来总结一些程序员必备的网站 xff0c 囊括开源项目 解决bug 技术分享 一线资源和自我提升的网站 xff0c 希望能对广大程序猿有所帮助 xff0c 赶紧给我收藏起来 xff0c 下次刷不到了可别说我没提醒你 我们首先来看一下国
  • (音视频开发)WebRTC进阶流媒体服务器开发-多人互动架构

    一 xff1a 多人互动架构方案 xff08 一 xff09 WebRTC回顾 xff0c 两层含义 xff1a 1 WebRTC是google开源的流媒体客户端 xff0c 可以进行实时通讯 xff0c 主要应用于浏览器之间进行实时通讯
  • 10种linux下磁盘快照方式恢复系统

    导读大家都知道windows系统有一个磁盘快照的功能 xff0c 在windows2003中系统恢复开始依赖于一个叫做硬盘快照服务 Volume Snapshot Service 的服务 xff0c 他能够自动创建系统快照 包括正在使用的文
  • ubuntu安装go开发环境

    一 为ubuntu20 04更新源 给root用户设置密码 xff1a 命令 xff1a sudo passwd root 备份原来的源 xff0c 命令 xff1a sudo cp etc apt sources list etc apt

随机推荐

  • 如何修复Ubuntu中包缓存文件被毁问题

    导读今天 xff0c 我尝试更新我的 Ubuntu 18 04 LTS 的仓库列表 xff0c 但收到了一条错误消息 xff1a E The package cache file is corrupted it has the wrong
  • 1002 A+B for Polynomials (25分) 详解+易错点

    注意点 xff1a 系数为0 xff0c 则不输出 xff0c 例 xff1a 其中 1和1相加为0 xff0c 则在输出时避免这一项 xff0c 而且要注意结果的K值 xff0c 不要包括这一项 xff0c 思路 xff0c 利用结构体存
  • Linux远程桌面的选择

    Linux的远程桌面主要分两个部分 xff1a Linux客户机连Linux服务器和Windows客户机连Linux服务器 xff0c 还有现在用平板电脑连远程桌面 Linux客户机连Windows服务器比较简单没啥可说的 xff0c rd
  • Kali Linux mdk3WiFi洪水攻击 攻击路由器 生成虚假WiFi WiFi身份验证攻击可使连接WiFi的手机掉线重连抓包

    将无线网卡转换为监听模式 airmon ng start wlan0 查找附近无线网络 airodump ng wlan0mon Authentication DoS xff1a xff08 洪水攻击 xff0c 又叫做身份验证攻击 xff
  • 大一java程序设计的某次作业题解

    题目描述 xff1a 设计程序实现输入日期及机票张数 xff0c 计算出应付金额 假设北京至上海的机票全价为 1200 元 张 xff0c 以 2017 年为例进行程序编写 xff0c 所有的法定假日 xff0c 机票无折扣 xff1b 除
  • D. Make It Round(1759D)

    要求n k后缀0数量最多 xff08 k lt 61 m xff09 xff0c 且n k尽可能大 比赛时思路 xff08 错误 xff09 xff1a 10是由2和5组成 xff0c 故先统计n的因子包含2的个数num2 包含5的个数nu
  • Codeforces Round #841 (Div. 2)

    B Kill Demodogs 分析 显然要选择和两斜线的元素相加 所以答案可以表示为 xff1a 即 xff1a 根据公式 得答案为 但答案不能直接得这个 因为n的范围为1e9 xff0c 而ull的范围为1e20 xff0c 答案的第一
  • Educational Codeforces Round 141 Editorial C~D

    1783C Yet Another Tournament 分析 正解思路是贪心 开始自己也想的贪心 xff1a 首先显然打败的人数越多越好 xff0c 然后选择权值最小的人打败 这个思路前半部分没问题 xff0c 后半部分过不了样例的第二个
  • Codeforces Round #844 (Div. 1 + Div. 2, based on VK Cup 2022 - Elimination Round) D

    1781D Many Perfect Squares 分析 对于每组 xff0c 若和均为完全平方数 xff0c 则存在 xff1a 所以枚举所有 xff0c 对于每个 xff0c 枚举其所有 双因子对 xff0c 若两个因子之差为偶数 x
  • 匹配已有字符串

    生活小妙招 通过set和substr函数 xff0c 方便快捷地写出匹配已有字符串的代码 前置芝士 xff1a set使用详解 题目 xff1a G Perfect Word 代码实现 通过set 43 string的substr的使用快速
  • 在vue中使用rules的定义和校验规则

    表单内容里面定义属性 lt Form ref 61 34 rulesForm 34 model 61 34 rulesForm 34 label width 61 34 100 34 rules 61 34 rules 34 gt lt F
  • Codeforces Raif Round 1 (Div. 1 + Div. 2) D

    D Bouncing Boomerangs 分析 一个stack用于存只有一个的物品的行的物品位置 xff0c 一个queue用于存有两个物品的行的左边物品位置 xff08 其实这两个容器用stack还是queue无所谓 xff0c 只是这
  • 使用django服务的前置操作

    注意 xff1a 这是一个用于小组作业说明的内部文章 xff0c 如果你在寻找部署django服务的完整流程 xff0c 请退出此文章 python版本 xff1a 3 7 输入命令 xff0c 安装django工具 xff1a pip i
  • Codeforces Round #853 (Div. 2) C题

    CF1789C Serval and Toxel 39 s Arrays 学弟的思路 思路清晰 xff0c 代码简洁明了 xff0c 吊打目前80 以上题解 分析 记录每个数字在多少个数组中出现过 xff0c 即记录每个数字出现的次数 然后
  • E. Carrots for Rabbits(一种神奇的数列维护技巧)

    题目 E Carrots for Rabbits 分析 将每个物品都放到大根堆里 xff0c 但每个物品有两个信息 xff1a 长度len 当前被切了几段part 根据这个物品当前状态的贡献 作为在堆里位置的依据 贡献由cal函数算出 注意
  • Codeforces Round 857 (Div. 1 + Div. 2) 2A - 2D

    A Likes 分析 首先数据保证了一定合法 xff0c 那只需要统计有几个负数 最大的策略是先把所有正数用完 xff0c 然后把所有负数用完 xff0c 可知答案一定是1 2 3 4 5 4 3这种形式 xff1b 最小策略是加一个就直接
  • Struts2校验框架<validators>配置报错

    问题 xff1a 新建了Actionname validation xml文件写校验 xff0c 发现 lt validators gt 及其子标签爆红 解决 1 找到部署Struts2时在官网下载的一堆 jar包 如图 xff1a 解压圈
  • 树莓派操作系统

    树莓派操作系统 树莓派操作系统 介绍更新和升级树莓派操作系统 使用 APT使用 rpi 更新播放音频和视频 OMXPlayer 应用程序如何播放音频如何播放视频播放期间的选项在后台播放使用 USB 网络摄像头 基本用法自动化图像捕获延时拍摄
  • KVM虚拟机的多种启动方式

    KVM 全称是基于内核的虚拟机 xff08 Kernel based Virtual Machine xff09 xff0c 它是一个 Linux的一个内核模块 xff0c 该内核模块使得 Linux变成了一个Hypervisor xff1
  • ARM平台FS6818/s5p6818开发板实验6 —— 按键中断实验

    按键中断实验 xff1a 实验内容 xff1a 通过简单事例说明s5p6818处理器的GIC中断处理的应用 xff0c 设置key2按键连接的引脚为中断模式 xff0c 当识别按键被按下时进入相应的中断处理函数 实验目的 xff1a 熟悉开