2022/10/4——基于stm32mp157a的A7核按键中断实验

news/2024/5/6 16:38:01/文章来源:https://blog.csdn.net/ad20001218/article/details/127163339

 分析电路图可知三个按键对应的管脚为:KEY1----->PF9  KEY2----->PF7  KEY3----->PF8

本次实验采用延时函数来解决按键按下时的电平抖动问题

功能分析如下

 如上图所示

1.需要分析GPIOF章节:设置引脚为输入模式

2.需要分析EXTI章节:检测中断的触发方式

3.需要分析GIC章节:设置GPIOF引脚对应的中断号

代码实现

一、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

二、key.c——功能函数的声明

以key1为例

1、RCC章节初始化——设置GPIOF组时钟使能

RCC->MP_AHB4ENSETR |= (0x1 << 5);

2、GPIO章节初始化——设置PF9引脚为输入模式

GPIOF->MODER &= (~(0x3 << 18));

3、EXTI章节初始化

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

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

2)设置PF9引脚检测方式下降沿

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

3)设置PF9引脚中断不屏蔽

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

4、GICD层初始化

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);

 5、GICC层初始化

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

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

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);
}

三、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 & 0x3ff;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;
}

四、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;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_18328.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人工智能算法一无监督学习(Kmeas聚类)

简介 在前面介绍的线性回归还有逻辑回归它们都是知道x,y然后开始训练模型&#xff0c;这也就是有监督学习的情况&#xff0c;还有如果只是知道x不知道y的情况那么这种就是无监督学习。 描述 需求引入&#xff0c;如果有一千万用户&#xff0c;我们要对用户进行分类。这里由于…

Pytorch深度学习笔记之三(构建一个完整的神经网络)

本篇笔记是基于一个印度人写的《Pytorch深度学习》一书的第二章&#xff0c;主要用来描述一个麻雀虽小五脏俱全的完整的神经网络&#xff0c;包含了建模、训练等。原书的代码基于较老版本的Pytorch&#xff0c;有多处编译不过&#xff0c;笔者都做了调整&#xff0c;并在文末给…

几种常见的概率分布表

参考:《概率论与数理统计 第四版》

Jenkins+Maven+Gitlab+Tomcat 自动化构建打包、部署

一、环境需求 本帖针对的是Linux环境&#xff0c;Windows或其他系统也可借鉴。具体只讲述Jenkins配置以及整个流程的实现。 1.JDK&#xff08;或JRE&#xff09;及Java环境变量配置&#xff0c;我用的是JDK1.8。 2.Jenkins 持续集成和持续交付项目。 3.现有项目及gitlab&#…

Redis实战 - 03 RedisTemplate 的 hash 结构

文章目录1. put(H var1, HK var2, HV var3)2. get(H var1, Object var2)3. entries(H key)4. keys(H key)5. values(H key)6. hasKey(H key, Object var2)7. size(H key)8. putAll(H key, Map<? extends HK, ? extends HV> map)1. put(H var1, HK var2, HV var3) 新增…

机器学习之验证曲线绘制-调参可视化-sklearn

验证曲线是什么&#xff1f; 验证曲线和学习曲线的区别是&#xff0c;横轴为某个超参数的一系列值&#xff0c;由此来看不同参数设置下模型的准确率(评价标准)&#xff0c;而不是不同训练集大小下的准确率。 从验证曲线上可以看到随着超参数设置的改变&#xff0c;模型可能从…

Java Web 12.1 Filter 12.1.2 Filter 快速入门

Java Web 【黑马程序员新版JavaWeb基础教程&#xff0c;Java web从入门到企业实战完整版】 12 Filter & Listener & Ajax 文章目录Java Web12 Filter & Listener & Ajax12.1 Filter12.1.2 Filter 快速入门12.1 Filter 12.1.2 Filter 快速入门 【开发步骤】…

论如何参与一个开源项目(上)

写在前面的一些话 说起开源项目&#xff0c;好像人人都懂&#xff1a;不过就是一群人一起写了些东西&#xff0c;并且这些东西是公开的&#xff0c;大家都能看。但要细说&#xff0c;可能大多数的开发者都说不出个所以然&#xff0c;甚至不知道怎么提issue。 所以我就想写这样…

这,这,是个神人,我喜欢

国庆的第三天&#xff0c;跟一个好友聊天&#xff0c;他本来是准备回老家的&#xff0c;但是因为疫情搁浅在原地了。上来就直接给我搞一个有难度的代码如果没有人跟你说这个是输出helloworld的&#xff0c;鬼知道这个代码。然后&#xff0c;我就说我想对他进行一个采访&#xf…

QX-A51智能小车实现-物联网应用系统设计项目开发

目录介绍说明展示介绍 STC89C52系列单片机是STC推出的新一代高速/低功耗/超强抗干扰/超低价的单片机&#xff0c;指令代码完全兼容传统8051单片机&#xff0c;12时钟每机器周期和6时钟每机器周期可以任意选择 QX-A51智能小车原理图 QX-A51智能小车配置 硬件组成&#xff1a;电…

QT模型索引使用QModelIndex

QT模型索引使用QModelIndex QModelIndex有三个要素&#xff1a;行row 列column 父节点索引parent 但是注意我们并不能定义一个QModelIndex QModelIndex的构造函数QModelIndex()的功能是创建一个新的空的QModelIndex QModelIdex()是一个空索引&#xff0c;它其实可以代表任意mo…

数据库-MySQL基础(9)-多表关系

目录 概述 1、一对多 2、多对多 3、一对一 多表查询概述 多表查询分类 1、连接查询 2、子查询 概述 项目开发中&#xff0c;在进行数据库表结构关系设计时&#xff0c;会根据业务需求及业务模块之间的关系&#xff0c;分析设计表结构&#xff0c;由于业务之间相互关联…

5、android 数据存储(2)(数据库SQLite:SQLiteDatabase)

1、数据库管理器SQLiteDatabase SQLiteDatabase是SQLite的数据库管理类&#xff0c;它提供了若干操作数据表的API&#xff0c;常用的方法有3类&#xff1a; 1. 管理类&#xff0c;用于数据库层面的操作。 openDatabase&#xff1a;打开指定路径的数据库。 isOpen&#xff1a…

机器学习之学习曲线绘制Python-skleran

学习曲线作用&#xff1a; 学习曲线是什么&#xff1f;简单来说&#xff0c;就是用学习曲线(learning curve)来判断模型状态&#xff1a;过拟合还是欠拟合。 学习曲线定义&#xff1a; 学习曲线是根据不同训练集大小&#xff0c;模型在训练集和验证集上的得分变化曲线。 学…

虚拟机搭建Redis 远程密码可访问,并且后台运行

1、关闭系统防火墙 操作指令备注查看防火墙状态systemctl status firewalld / firewall-cmd --state暂时关闭防火墙systemctl stop firewalld永久关闭防火墙(禁用开机自启)systemctl disable firewalld下次启动,才生效暂时开启防火墙systemctl start firewalld永久开启防火墙(…

基于python+django框架+Mysql数据库的校园新生报到系统设计与实现

项目背景和意义 目的&#xff1a;本课题主要目标是设计并能够实现一个基于python的校园新生报到系统&#xff0c;整体网站系统基于B/S架构&#xff0c;技术上使用基于python的Django框架来实现&#xff1b;通过后台添加设置校园信息、录入和管理校园资讯、校园风光、学校分院信…

Linux 用户管理 文件目录指令 时间日期指令 搜索查找类 解压压缩类

目录 用户管理 添加用户: 指定/修改密码 删除用户 查询用户信息指令 切换用户 查看当前用户/登录用户 用户组 修改用户的组 用户和组相关文件 指定运行级别1 指定运行级别2 找回root密码 帮助指令 文件目录指令 文件目录类 pwd 指令 ls 指令 cd 指令 mkdir指…

Android Automotive(五) CarService

Android Automotive&#xff08;五&#xff09; CarService CarService是Android Automotive在系统框架层的核心服务。它类似SystemServer在服务内部管理着数十个子服务。 启动流程 CarService是由SystemServer启动的&#xff0c;启动流程如下。 SystemServer 启动CarServi…

【GNN从入门到精通】第一章 图的基本知识

文章目录一、图的表示1.1 什么是图&#xff1f;二、图的特征2.1 子图2.2 连通分量2.3 接通图2.3.1 无向图连通图2.3.2 有向连通图2.4 最短路径2.5 图直径三、图中心性3.1 度中心性3.2 特征向量中心性3.3 中介中心性3.4 连接中心性四、网页排序算法4.1 PageRank4.2 HITS4.3 例子…

游程描述的任意区域最小旋转矩形算法实现

效果 采用游程描述了多个区域,经过算法计算,找到最小包围矩形。 白色是指定的区域,黄色是该区域的最小旋转矩形。 算法原理 有时候算法不一定很高深,只要把道理点破,实现起来很简单,难的是最开始的算法构思过程。 区域最小旋转矩形的算法原理也很简单:将区域从0到90…