一、实验原理分析

实验板: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接口实验—中断实验相关推荐

  1. 中断实验计算机组成原理,计算机组成原理 中断实验 实验五

    <计算机组成原理 中断实验 实验五>由会员分享,可在线阅读,更多相关<计算机组成原理 中断实验 实验五(6页珍藏版)>请在技术文库上搜索. 1.深深 圳圳 大大 学学 实实 验 ...

  2. ARM:嵌入式系统之WDT中断实验

    WDT中断实验 提示:几乎每种处理器都支持特定的异常处理,中断也是异常的一种. 提示:本次实验我们需要做的是一个关于WDT中断实验,由于我缺少相关理论部分,就对理论不展开过多的解释. 文章目录 WDT ...

  3. 一起学mini2440裸机开发(十)--mini2440外部中断实验

    我今天一整天都在试着将TQ2440的那种处理中断的方法(即安装中断向量表)移植到MDK中的mini2440,但是一直没成功,这种方法一直没成功,后来又想,还是先从最简单的开始吧,就是不利用中断向量表, ...

  4. [Keil][Verilog][微机原理] 流水灯、存储器、外部中断实验_北京邮电大学计算机原理与应用课程实验报告

    计算机原理与应用实验-流水灯.存储器.外部中断实验 1 实验一 流水灯实验 1.1 实验目的 掌握ARM开发工具的使用. 掌握基本IO的使用. 1.2 实验原理及内容 电路结构图 实现流水灯的电路结构 ...

  5. 【ZYNQ Ultrascale+ MPSOC FPGA教程】第二十章 PS端RTC中断实验

    原创声明: 本原创教程由芯驿电子科技(上海)有限公司(ALINX)创作,版权归本公司所有,如需转载,需授权并注明出处. 适用于板卡型号: AXU2CGA/AXU2CGB/AXU3EG/AXU4EV-E ...

  6. 32 串口波特率_「正点原子FPGA连载」第五章串口中断实验

    1)实验平台:正点原子达芬奇FPGA开发板 2) 摘自[正点原子]达芬奇之Microblaze 开发指南 3)购买链接:https://detail.tmall.com/item.htm?id=624 ...

  7. 模电数电微机接口微机应用实验设备QY-MS535F

    一.设备简介 QY-MS535F模电数电微机接口微机应用实验设备适用于86系列微机原理课程,增加了系统的开发能力和灵活性,提供了开放的实验平台并新增加了微机控制实验,数字电路.模拟电子技术实验线路.实 ...

  8. c语言p1口亮灯,单片机实验开发与微机原理接口技术综合实验装置,上海求育

    原标题:单片机实验开发与微机原理接口技术综合实验装置,上海求育 上海求育QY-JXSY43单片机微机开发实验箱 上海求育QY-JXSY43单片机微机开发实验箱是集51.8088二大系列CPU于一体的二 ...

  9. 综合能力训练:在树莓派上动手写一个小OS(5):实验16-4:中断实验

    本文节选自<实验指导手册>第二版第16.6章 实验指导手册是奔跑吧Linux内核入门篇第二版配套实验书,pdf版本已经release,可以免费下载和自由打印! 下载方法: 登陆" ...

最新文章

  1. ubuntu 安装qt5
  2. golang 生成 解析 json
  3. Ixia张林辉:测试系统让SDN更“迷人”
  4. CODEVS——T 1049 棋盘染色
  5. 腾讯TBS加载网页无法自适应记录
  6. Jodd 工具包之StringUtil
  7. Bailian2885 计算反序数【进制】
  8. hdu 1003 Max Sum 简单动态规划
  9. systemctl start named失败的解决方法_有关平安银行的提额方法和提额失败的解决方法...
  10. c语言中负数参与除法,C语言中负数除法与右移取整问题
  11. Day771.Redis好用的运维工具 -Redis 核心技术与实战
  12. 触摸屏控制变频器程序 触摸屏控制变频器程序
  13. 花生壳域名SSH登录不上的问题
  14. 波士顿大学 计算机专业,波士顿大学计算机科学专业波士顿大学计算机科学专业.pdf...
  15. 动态规划-最短路径问题
  16. 第三章 变量和数据类型_C语言中的小数(float,double)
  17. 学编程遇到的数学知识
  18. java实现远程控制
  19. 异构网络中基于元图的推荐——FMG
  20. 我的世界服务器修改高度放水,我的世界:水不够用?学会这4种方法,教你一桶水造无限水...

热门文章

  1. python实现Rot古典密码加解密
  2. 通知单的长文本和合作伙伴功能获得
  3. 删除程序时弹出没有权限
  4. idea栏目字体过大,不能恢复,影响设置的解决方法
  5. 手机上怎么打开python文件_如何使用一行Python命令来实现让手机读取电脑文件!...
  6. 本博开始交换链接,衷心希望各位博友赏脸
  7. 互联网广告请求链路_生产环境的全链路压测应该怎么做?答案都在这里了
  8. 计算机系logo设计大赛,计算机应用技术系LOGO大赛措施
  9. 国际期货投机有什么风险?目前正大怎么样?
  10. 【已解决】笔记本电脑关闭盖子后出现死机