ARM接口实验—中断实验
一、实验原理分析
实验板:stm32mp157a-fsmp1a
本次中断是检测按键的下降沿信号,接收到信号进入异常处理,进行相应的异常处理流程
二、电路分析
分析三个按键对应的GPIO接口:
KEY1----->PF9
KEY2----->PF7
KEY3----->PF8
三、框图分析
由上图可知需要分析芯片手册四个章节
RCC章节:使能GPIO控制器
GPIO章节:设置引脚为输入模式
EXTI章节:检测中断的触发方式
GIC章节:设置GPIOF引脚对应的中断号
四、工作流程图
流程分解:
1,按键按下
2,GPIO输入(MODER)
3,EXT检测中断触发
3.1 中断选择(EXTI_EXTICR3)功能:GPIO控制器和EXTI控制器进行连接
3.2 事件检测(下降沿)(EXTI_FTSR1)
3.3 事件屏蔽(不屏蔽)(EXTI_IMR1)
3.4 清除中断挂起标志位(EXTI_FPR1)
4,GIC设置GPIOF引脚对应的中断号
4.1 GICD层:分配器层
4.1.1 使能GICD层(GICD_CTLR)
4.1.2 中断设置使能 GICD_ISENABLERx
4.1.3 中断优先级设置 GICD_IPRIORITYRx(数字越低优先级越高)
4.1.4 选择CPU(GICD_ITARGETSRx)
4.1.5 清除中断挂起标志位 GICD_ICPENDRx
4.2 GICC层:CPU接口层
4.2.1 使能GICC层 (GICC_CTLR)
4.2.2 优先级设置 (GICC_PMR)需要比GICD层设计的中断优先级的值要大
4.2.3 获取中断号 GICC_IAR
4.2.4 清除按键中断号 GICC_EOIR
五、代码实现
按键按下,打印按键信息
key.h
#ifndef __KEY5_H__
#define __KEY5_H__#include "./stm32mp1xx_exti.h"
#include "./stm32mp1xx_gpio.h"
#include "./stm32mp1xx_rcc.h"
#include "./stm32mp1xx_gic.h"//初始化EITI层
void pf9_exti_init();//初始化GICD层
void pf9_gicd_init();//初始化GICC层
void pf9_dicc_init();//初始化GPIO层
void gpio_init();#endif
key.c
#include "key5.h"//初始化gpio层
void gpio_init()
{//rcc使能GPIOF寄存器RCC->MP_AHB4ENSETR |= (0X1 << 5);RCC->MP_AHB4ENSETR |= (0X1 << 4);/*****设置GPIOF系列寄存器****///设置GPIOE 8,10,GPIOF 10为输出模式GPIOE->MODER &= (~(0x3 <<16));GPIOE->MODER |= (0X1<<16);GPIOE->MODER &= (~(0x3 <<20));GPIOE->MODER |= (0x1 <<20);GPIOF->MODER &= (~(0x3 <<20));GPIOF->MODER |= (0x1 <<20);//设置GPIOF,7,8,9模式为输入模式GPIOF->MODER &= (~(0X3 << 18));GPIOF->MODER &= (~(0X3 << 16));GPIOF->MODER &= (~(0X3 << 14));//设置GPIOE 8,10,GPIOF 10的输出类型GPIOE->OTYPER &= (~(0x1 <<8));GPIOE->OTYPER &= (~(0x1 <<10));GPIOF->OTYPER &= (~(0x1 <<10));//设置GPIOE 8,10,GPIOF 10的输出速度GPIOE->OSPEEDR &= (~(0X3 <<16)); GPIOE->OSPEEDR &= (~(0X3 <<20)); GPIOF->OSPEEDR &= (~(0X3 <<20)); //设置GPIOE 8,10,GPIOF 10上下拉GPIOE->PUPDR &= (~(0X3 <<16));GPIOE->PUPDR &= (~(0X3 <<20));GPIOF->PUPDR &= (~(0X3 <<20));
}//初始化EITI层
void pf9_exti_init()
{/****设置EXTI系列寄存器*****///1.中断寄存器与GPIO连接EXTI->EXTICR3 &= (~(0xff << 8));EXTI->EXTICR3 |= (0X05 << 8);EXTI->EXTICR3 &= (~(0xff << 0));EXTI->EXTICR3 |= (0X05 << 0);EXTI->EXTICR2 &= (~(0xff << 24));EXTI->EXTICR2 |= (0X05 << 24);//2.检测事件为下降沿EXTI->FTSR1 |= (0X1 <<7);EXTI->FTSR1 |= (0X1 <<8);EXTI->FTSR1 |= (0X1 <<9);//3.设置中断屏蔽寄存器为不屏蔽EXTI->C1IMR1 |= (0X1 <<7);EXTI->C1IMR1 |= (0X1 <<8);EXTI->C1IMR1 |= (0X1 <<9);}//初始化GICD层
void pf9_gicd_init()
{/*****设置GICD系列寄存器*****///使能GICD(全局)GICD->CTRL |= (0X1 <<0);//中断设置使能(对应中断号)GICD->ISENABLER[3] |= (0X1 <<3);GICD->ISENABLER[3] |= (0X1 <<1);GICD->ISENABLER[3] |= (0X1 <<2);//中断优先级设置GICD->IPRIORITYR[24] &= (~(0X1F <<11));GICD->IPRIORITYR[24] |= (0X1 <<11);GICD->IPRIORITYR[24] &= (~(0X1F <<19));GICD->IPRIORITYR[24] |= (0X1 <<19);GICD->IPRIORITYR[24] &= (~(0X1F <<27));GICD->IPRIORITYR[24] |= (0X1 <<27);//选择CPU,0号,设置中断目标分配GICD->ITARGETSR[24] &= (~(0X3 <<8));GICD->ITARGETSR[24] |= (0X1 <<8);GICD->ITARGETSR[24] &= (~(0X3 <<16));GICD->ITARGETSR[24] |= (0X1 <<16);GICD->ITARGETSR[24] &= (~(0X3 <<24));GICD->ITARGETSR[24] |= (0X1 <<24);}//初始化GICC层
void pf9_dicc_init()
{/*****设置GICC系列寄存器*****///使能GICCGICC->CTRL |= (0X1 <<0);//输入中断优先级GICC->PMR &= (~(0X1F <<3));GICC->PMR |= (0XF <<3);
}
main.c
#include "key5.h"
extern void printf(const char *fmt, ...);
void delay_ms(int ms)
{int i,j;for(i = 0; i < ms;i++)for (j = 0; j < 1800; j++);
}int main()
{//调用初始化函数gpio_init();pf9_exti_init();pf9_gicd_init();pf9_dicc_init();while(1){}return 0;
}
do_irq.c(异常处理函数)
#include "key5.h"extern void printf(const char *fmt, ...);
extern void delay_ms(int ms);
unsigned int i = 0;
void do_irq(void)
{unsigned int num =0;//获取中断号num=GICC->IAR & 0X1FF;switch(num){case 97:{delay_ms(500);printf("key2######\n");//清除EXTI层挂起标志位EXTI->FPR1 |= (0x1 <<7);EXTI->FPR1 |= (0x1 <<8);EXTI->FPR1 |= (0x1 <<9);//清除GICD层挂起标志位GICD->ICPENDR[3] |= (0X1 <<3);GICD->ICPENDR[3] |= (0X1 <<1);GICD->ICPENDR[3] |= (0X1 <<2);}break;case 98:{delay_ms(500);printf("key3######\n");//清除EXTI层挂起标志位EXTI->FPR1 |= (0x1 <<7);EXTI->FPR1 |= (0x1 <<8);EXTI->FPR1 |= (0x1 <<9);//清除GICD层挂起标志位GICD->ICPENDR[3] |= (0X1 <<3);GICD->ICPENDR[3] |= (0X1 <<1);GICD->ICPENDR[3] |= (0X1 <<2); }break;case 99:{delay_ms(500);printf("key1######\n");//清除EXTI层挂起标志位EXTI->FPR1 |= (0x1 <<7);EXTI->FPR1 |= (0x1 <<8);EXTI->FPR1 |= (0x1 <<9);//清除GICD层挂起标志位GICD->ICPENDR[3] |= (0X1 <<3);GICD->ICPENDR[3] |= (0X1 <<1);GICD->ICPENDR[3] |= (0X1 <<2);}break;}//清除中断号GICC->EOIR &= (~(0X1FF));GICC->EOIR |= num;
}
实验现象:
ARM接口实验—中断实验相关推荐
- 中断实验计算机组成原理,计算机组成原理 中断实验 实验五
<计算机组成原理 中断实验 实验五>由会员分享,可在线阅读,更多相关<计算机组成原理 中断实验 实验五(6页珍藏版)>请在技术文库上搜索. 1.深深 圳圳 大大 学学 实实 验 ...
- ARM:嵌入式系统之WDT中断实验
WDT中断实验 提示:几乎每种处理器都支持特定的异常处理,中断也是异常的一种. 提示:本次实验我们需要做的是一个关于WDT中断实验,由于我缺少相关理论部分,就对理论不展开过多的解释. 文章目录 WDT ...
- 一起学mini2440裸机开发(十)--mini2440外部中断实验
我今天一整天都在试着将TQ2440的那种处理中断的方法(即安装中断向量表)移植到MDK中的mini2440,但是一直没成功,这种方法一直没成功,后来又想,还是先从最简单的开始吧,就是不利用中断向量表, ...
- [Keil][Verilog][微机原理] 流水灯、存储器、外部中断实验_北京邮电大学计算机原理与应用课程实验报告
计算机原理与应用实验-流水灯.存储器.外部中断实验 1 实验一 流水灯实验 1.1 实验目的 掌握ARM开发工具的使用. 掌握基本IO的使用. 1.2 实验原理及内容 电路结构图 实现流水灯的电路结构 ...
- 【ZYNQ Ultrascale+ MPSOC FPGA教程】第二十章 PS端RTC中断实验
原创声明: 本原创教程由芯驿电子科技(上海)有限公司(ALINX)创作,版权归本公司所有,如需转载,需授权并注明出处. 适用于板卡型号: AXU2CGA/AXU2CGB/AXU3EG/AXU4EV-E ...
- 32 串口波特率_「正点原子FPGA连载」第五章串口中断实验
1)实验平台:正点原子达芬奇FPGA开发板 2) 摘自[正点原子]达芬奇之Microblaze 开发指南 3)购买链接:https://detail.tmall.com/item.htm?id=624 ...
- 模电数电微机接口微机应用实验设备QY-MS535F
一.设备简介 QY-MS535F模电数电微机接口微机应用实验设备适用于86系列微机原理课程,增加了系统的开发能力和灵活性,提供了开放的实验平台并新增加了微机控制实验,数字电路.模拟电子技术实验线路.实 ...
- c语言p1口亮灯,单片机实验开发与微机原理接口技术综合实验装置,上海求育
原标题:单片机实验开发与微机原理接口技术综合实验装置,上海求育 上海求育QY-JXSY43单片机微机开发实验箱 上海求育QY-JXSY43单片机微机开发实验箱是集51.8088二大系列CPU于一体的二 ...
- 综合能力训练:在树莓派上动手写一个小OS(5):实验16-4:中断实验
本文节选自<实验指导手册>第二版第16.6章 实验指导手册是奔跑吧Linux内核入门篇第二版配套实验书,pdf版本已经release,可以免费下载和自由打印! 下载方法: 登陆" ...
最新文章
- ubuntu 安装qt5
- golang 生成 解析 json
- Ixia张林辉:测试系统让SDN更“迷人”
- CODEVS——T 1049 棋盘染色
- 腾讯TBS加载网页无法自适应记录
- Jodd 工具包之StringUtil
- Bailian2885 计算反序数【进制】
- hdu 1003 Max Sum 简单动态规划
- systemctl start named失败的解决方法_有关平安银行的提额方法和提额失败的解决方法...
- c语言中负数参与除法,C语言中负数除法与右移取整问题
- Day771.Redis好用的运维工具 -Redis 核心技术与实战
- 触摸屏控制变频器程序 触摸屏控制变频器程序
- 花生壳域名SSH登录不上的问题
- 波士顿大学 计算机专业,波士顿大学计算机科学专业波士顿大学计算机科学专业.pdf...
- 动态规划-最短路径问题
- 第三章 变量和数据类型_C语言中的小数(float,double)
- 学编程遇到的数学知识
- java实现远程控制
- 异构网络中基于元图的推荐——FMG
- 我的世界服务器修改高度放水,我的世界:水不够用?学会这4种方法,教你一桶水造无限水...