一、实验原理分析

实验板: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. RTB中的cookie mapping理解
  2. c语言中continue语句的作用是什么
  3. go语言查询某个值是否在数组中_go语言中的数组
  4. 067:【Django数据库】ORM查询条件详解-range
  5. 借助 Pod 删除事件的传播实现 Pod 摘流
  6. SSM框架笔记10:Spring AOP基础
  7. 重磅!华为方舟编译器招募 2000 程序员!
  8. BUG Error:Execution failed for task ':app:dexDebug'.
  9. Java模拟http上传文件请求(HttpURLConnection,HttpClient4.4,RestTemplate)
  10. 分布式锁与实现(二)——基于ZooKeeper实现
  11. java实现模拟考试系统_基于JAVA SWING考试模拟系统.doc
  12. 计算机病毒的危害评价,计算机病毒危害评析
  13. WPS的标题样式如何保存成默认
  14. linux的DRM应用程序,Linux中的DRM
  15. 怎样写一个解释器——王垠
  16. Set接口介绍、HashSet源码简要分析
  17. 从虚拟走向现实!数字孪生迎来崛起
  18. Bootstrap 一篇就够 快速入门使用(中文文档)
  19. Qomo OpenProject Field Test 3发布!
  20. homeassistant智能家居

热门文章

  1. CRM下午茶(16)-SNS就是朋友关系管理
  2. Ryan二号的控制界面
  3. python json文件对比方法
  4. solr搭建和测试 windows版
  5. 图像scale与相机参数_Camera 图像处理原理分析
  6. Python——库docx(六:分页符、分节符)1.4
  7. Javascript个人所得税计算公式
  8. 4412驱动-sixth_drv 同步互斥按键驱动
  9. 矢量化图形工具VTracer
  10. Diazo Biotin-PEG3-DBCO,二苯并环辛炔PEG3重氮生物素,无铜 Click Chemistry