1、key.h——头文件的包络和函数的声明

#ifndef __KEY_H__
#define __KEY_H__#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_exti.h"
#include "stm32mp1xx_gic.h"
#include "stm32mp1xx_gpio.h"//初始化EXTI层——key1
void pf9_exti_init();//初始化GICD层——key1
void pf9_gicd_init();//初始化GICC层——key1
void pf9_gicc_init();//初始化EXTI层——key3
void pf8_exti_init();//初始化GICD层——key3
void pf8_gicd_init();//初始化GICC层——key3
void pf8_gicc_init();//初始化EXTI层——key2
void pf7_exti_init();//初始化GICD层——key2
void pf7_gicd_init();//初始化GICC层——key2
void pf7_gicc_init();#endif

2、key.c——功能函数的定义(以key1为例)

1)RCC章节初始化

    //1.设置GPIOF组时钟使能RCC->MP_AHB4ENSETR |= (0x1 << 5);

2)GPIO章节初始化

    //1.设置PF9引脚为输入模式GPIOF->MODER &= (~(0x3 << 18));

3)EXTI章节初始化

3.1设置PF9引脚和EXIT9控制器进行连接

 EXTI->EXTICR3 &= (~(0xff << 8));EXTI->EXTICR3 |= (0x5 << 8);

3.2设置PF9引脚检测方式为下降沿

EXTI->FTSR1 |= (0x1 << 9);

3.3设置PF9引脚中断不屏蔽

EXTI->C1IMR1 |= (0x1 << 9);

4)初始化GICD层

4.1设置GICD层全局中断使能寄存器

 GICD->CTRL |= (0x1 << 0); 

4.2设置GICD层中断使能寄存器

 GICD->ISENABLER[3] |= (0x1 << 3);

4.3设置GICD层中断优先级寄存器

 GICD->IPRIORITYR[24] &= (~(0x1f << 27));GICD->IPRIORITYR[24] |= (0x1 << 27);

4.4设置GICD层中断目标分配寄存器

 GICD->ITARGETSR[24] |= (0x3 << 24);

5)初始化GICC层

5.1设置GICC层全局中断使能寄存器

GICC->CTRL |= (0x1 << 0);

5.2设置GICC层中断优先级寄存器

 GICC->PMR &= (~(0x1f << 3));GICC->PMR |= (0x9 << 3);

6)完整代码

#include "key.h"//初始化EXTI层——key1
void pf9_exti_init()
{/****RCC章节初始化*******///1.设置GPIOF组时钟使能RCC->MP_AHB4ENSETR |= (0x1 << 5);/****GPIO章节初始化*******///1.设置PF9引脚为输入模式GPIOF->MODER &= (~(0x3 << 18));/*****EXTI章节初始化******///1.设置PF9引脚和EXIT9控制器进行连接EXTI->EXTICR3 &= (~(0xff << 8));EXTI->EXTICR3 |= (0x5 << 8);//2.设置PF9引脚检测方式下降沿EXTI->FTSR1 |= (0x1 << 9);//3.设置PF9引脚中断不屏蔽EXTI->C1IMR1 |= (0x1 << 9);
}//初始化GICD层——key1
void pf9_gicd_init()
{//1.设置GICD层全局中断使能寄存器GICD->CTRL |= (0x1 << 0);    //2.设置GICD层中断使能寄存器GICD->ISENABLER[3] |= (0x1 << 3);//3.设置GICD层中断优先级寄存器GICD->IPRIORITYR[24] &= (~(0x1f << 27));GICD->IPRIORITYR[24] |= (0x1 << 27);//4.设置GICD层中断目标分配寄存器GICD->ITARGETSR[24] |= (0x3 << 24);
}//初始化GICC层——key1
void pf9_gicc_init()
{//1.设置GICC层全局中断使能寄存器GICC->CTRL |= (0x1 << 0);//2.设置GICC层中断优先级寄存器GICC->PMR &= (~(0x1f << 3));GICC->PMR |= (0x9 << 3);
}//初始化EXTI层——key3
void pf8_exti_init()
{/****GPIO章节初始化*******///1.设置PF8引脚为输入模式GPIOF->MODER &= (~(0x3 << 16));/*****EXTI章节初始化******///1.设置PF8引脚和EXIT8控制器进行连接EXTI->EXTICR3 &= (~(0xff << 0));EXTI->EXTICR3 |= (0x5 << 0);//2.设置PF8引脚检测方式下降沿EXTI->FTSR1 |= (0x1 << 8);//3.设置PF8引脚中断不屏蔽EXTI->C1IMR1 |= (0x1 << 8);
}//初始化GICD层——key3
void pf8_gicd_init()
{//1.设置GICD层全局中断使能寄存器GICD->CTRL |= (0x1 << 0);    //2.设置GICD层中断使能寄存器GICD->ISENABLER[3] |= (0x1 << 2);//3.设置GICD层中断优先级寄存器GICD->IPRIORITYR[24] &= (~(0x1f << 19));GICD->IPRIORITYR[24] |= (0x3 << 19);//4.设置GICD层中断目标分配寄存器GICD->ITARGETSR[24] |= (0x3 << 16);
}//初始化GICC层——key3
void pf8_gicc_init()
{//1.设置GICC层全局中断使能寄存器GICC->CTRL |= (0x1 << 0);//2.设置GICC层中断优先级寄存器GICC->PMR &= (~(0x1f << 3));GICC->PMR |= (0x8 << 3);
}//初始化EXTI层——key2
void pf7_exti_init()
{/****GPIO章节初始化*******///1.设置PF7引脚为输入模式GPIOF->MODER &= (~(0x3 << 14));/*****EXTI章节初始化******///1.设置PF7引脚和EXIT7控制器进行连接EXTI->EXTICR2 &= (~(0xff << 24));EXTI->EXTICR2 |= (0x5 << 24);//2.设置PF7引脚检测方式下降沿EXTI->FTSR1 |= (0x1 << 7);//3.设置PF7引脚中断不屏蔽EXTI->C1IMR1 |= (0x1 << 7);
}//初始化GICD层——key2
void pf7_gicd_init()
{//1.设置GICD层全局中断使能寄存器GICD->CTRL |= (0x1 << 0);    //2.设置GICD层中断使能寄存器GICD->ISENABLER[3] |= (0x1 << 1);//3.设置GICD层中断优先级寄存器GICD->IPRIORITYR[24] &= (~(0x1f << 11));GICD->IPRIORITYR[24] |= (0x2 << 11);//4.设置GICD层中断目标分配寄存器GICD->ITARGETSR[24] |= (0x3 << 8);
}//初始化GICC层——key2
void pf7_gicc_init()
{//1.设置GICC层全局中断使能寄存器GICC->CTRL |= (0x1 << 0);//2.设置GICC层中断优先级寄存器GICC->PMR &= (~(0x1f << 3));GICC->PMR |= (0x7 << 3);
}

3、do_irq.c——中断处理函数

使用延时函数进行去抖

#include "key.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;switch(num){case 97:delay_ms(500);printf("key2#####\n");//清除EXTI层中断挂起标志位EXTI->FPR1 |= (0x1 << 7); //清除GICD层中断挂起标志位GICD->ICPENDR[3] |= (0x1 << 1);break;case 98:delay_ms(500);printf("key3#####\n");//清除EXTI层中断挂起标志位EXTI->FPR1 |= (0x1 << 8);    //清除GICD层中断挂起标志位GICD->ICPENDR[3] |= (0x1 << 2);break;case 99:delay_ms(500);printf("key1#####\n");//清除EXTI层中断挂起标志位EXTI->FPR1 |= (0x1 << 9);    //清除GICD层中断挂起标志位GICD->ICPENDR[3] |= (0x1 << 3);break;}//清除中断号GICC->EOIR &= (0x3ff << 0);GICC->EOIR |= num;
}

4、main.c——延时函数的定义和初始化函数的调用

#include "key.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()
{/******key1初始化*****///初始化EXTI层pf9_exti_init();//初始化GICD层pf9_gicd_init();//初始化GICC层pf9_gicc_init();/******key3初始化*****///初始化EXTI层pf8_exti_init();//初始化GICD层pf8_gicd_init();//初始化GICC层pf8_gicc_init();/******key3初始化*****///初始化EXTI层pf7_exti_init();//初始化GICD层pf7_gicd_init();//初始化GICC层pf7_gicc_init();while(1){}return 0;
}

5、实验现象

2022/9/17——基于stm32mp157的按键中断实验相关推荐

  1. 基于STM32F103ZET6库函数外部中断实验

    基于STM32F103ZET6库函数外部中断实验 外部中断简介 IO 口外部中断的一般步骤 软件设计 外部中断简介 通过板载的 3 个按键,控制板载的两个 LED 的亮灭以及蜂鸣器的发声. 代码主要分 ...

  2. STM32——中断、EXTI、按键中断实验

    STM32中断--总结及实操 一.中断是什么? 1.1 中断的含义 1.2 中断的作用(了解即可) 1.3 中断的流程 二.中断资源 2.1 NVIC中断控制器 2.2 NVIC寄存器 三.优先级的概 ...

  3. 基于STM32F103ZET6库函数按键输入实验

    基于STM32F103ZET6库函数按键输入实验 GPIO_ReadInputDataBit函数 硬件设计 软件设计 我们将通过 ALIENTEK 精英 STM32F103 上载有的 3 个按钮(KE ...

  4. 基于STM32F103ZET6库函数定时器中断实验

    基于STM32F103ZET6库函数定时器中断实验 STM32F1 通用定时器简介 定时器相关的库函数主要集中在固件库文件 stm32f10x_tim.h 和 stm32f10x_tim.c 文件中 ...

  5. 基于Atmega16的外部中断实验

    一.实验目的 1. 理解单片机中断的概念. 2. 掌握外部中断的编程方法. 二.实验内容 1. 验证课堂例题 编译下载运行课堂例题--"按键次数显示"(INT_EX1)和" ...

  6. linux驱动开发5 按键中断实验(定时器和中断)

    led:IO的输出 :key:IO的输入 法一:直接读写IO 使用while(1)无限读取,但CPU占用达到了99.6%,所以不行 #include <linux/types.h>#inc ...

  7. ARM——cortex-A7核 按键中断实验

    控制按键key1.2.3,实现,按下按钮时,串口工具内输出对应按键名 本开发板为:stm32mp157 查找芯片手册得:key1.2.3的引脚分别对应PF9.PF7.PF8. 以Key1为例: PF9 ...

  8. cc2530 按键中断实验——按键控制LED灯的亮灭

    在本次学习中,主要通过外部中断来控制LED的亮灭. 首先,先查看相关电路图.由图可知,当CC2530端口1的1号引脚输出低电平时,LED3将被点亮,当按键31按下时,端口1的1号引脚将为低电平,抬起时 ...

  9. 【黑金ZYNQ7000系列原创视频教程】06.ZYNQ来自FPGA的中断——按键中断实验

    黑金论坛地址: http://www.heijin.org/forum.php?mod=viewthread&tid=36640&extra=page%3D1 爱奇艺地址: http: ...

最新文章

  1. 大蕉蕉的三道 Java 私房菜 No.131
  2. java filter 返回错误消息_利用java filter 实现业务异常拦截 跳转到错误信息提示页面...
  3. android WIFI信息获取
  4. linux测试地址是否能访问_一个小测试能看出孩子注意力是否集中,提前弥补,上小学会很轻松...
  5. 超链接跳转到action使用哪个方法_管道疏通剂哪个牌子好 管道疏通机使用方法有哪些...
  6. hadoop ubantu环境搭建_Ubuntu16.04 下 hadoop的安装与配置(伪分布式环境)
  7. matlab2c使用c++实现matlab函数系列教程-std函数
  8. 2014年工作中遇到的20个问题:161-180
  9. 关于图像高速缩放算法,目前看到的最好的最清晰的一篇文章2
  10. mouseover 和 mouseenter的区别
  11. 【经验】SQL Server 2008 R2 安装教程
  12. Hibernate表间映射时HHH000142异常
  13. 梦行扫码付(收银台条码支付 微信钱包条码支付 支付宝二维码支付 手机APP钱包支付 PHP扫码支付 )
  14. Type-C口充电器头为什么没有电压输出?
  15. 交大昂立华为鸿蒙,20210517湖南人涨停复盘
  16. 一本通1375:骑马修栅栏(fence)
  17. 布法罗大学计算机硕士学费,美国水牛城大学学费贵不贵(美国水牛城大学往年排名情况怎么样)...
  18. 理解F.dropout 和nn.ReLU(inplace=True)中inplace的作用
  19. Linux下TBB安装及编译
  20. 一个想法照进现实-《IT连》创业项目:关于团队组建

热门文章

  1. 图片翻译软件哪个好用?这些软件值得收藏
  2. 职业高中学计算机高考后能报什么,「新高考」新高考选哪些科目可以报计算机专业?高中生如何提分?...
  3. 秦皇岛人才网:如何用你的简历打动HR呢?
  4. Mac 开发者设置强迫症
  5. 解决Arduino DUE的程序必需Reset才能启动的问题
  6. 如何(c++,js)写一个传统的K线图和走势图5 - 移动筹码图
  7. IEEE系列期刊模板
  8. 如何实现产销平衡_六个动作实现制造企业产销协调管理
  9. 手机学python语言用什么软件好_如何在手机上面学习编程?有哪些软件推荐的?...
  10. 成功的经验 失败的教训