ARM开发,stm32mp157a-A7核中断实验(实现按键中断功能)
1.实验目的:实现KEY1/LEY2/KE3三个按键,中断触发打印一句话,并且灯的状态取反;
key1 ----> LED3灯状态取反;
key2 ----> LED2灯状态取反;
key3 ----> LED1灯状态取反;
2.分析框图:

3.代码:
---key.h头文件---
#ifndef __KEY_H__
#define __KEY_H__#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_gic.h"
#include "stm32mp1xx_exti.h"typedef enum
{FALLING_TRI, //下降沿触发方式RISING_TRI, //上升沿触发方式
}trigger_t;//中断RCC章节初始化 PF9 7 8
void hal_interrupt_rcc_init();//EXTI初始化函数
//EXTI编号 GPIO组号 触发方式
void hal_exti_init(unsigned int extix,unsigned int groupx,trigger_t trix);//GIC初始化函数
//中断号,中断优先级
void hal_gic_init(unsigned int interruptx,unsigned int priority);//led初始化函数
void led_init(gpio_t* gpiox,unsigned int pin);#endif
---key.c函数实现---
#include "key.h"//中断RCC章节初始化 PF9 7 8
void hal_interrupt_rcc_init()
{//RCC章节初始化 PF9 [5]=1RCC->MP_AHB4ENSETR |= (0x1 << 5);}//EXTI初始化函数
//EXTI编号 GPIO组号 触发方式
void hal_exti_init(unsigned int extix,unsigned int groupx,trigger_t trix)
{//GPIO章节初始化 设置三个按键为输入模式GPIOF->MODER &= (~(0x3 << 2*extix));//EXTI章节初始化,引脚信号与EXTI连接//1.EXIT_EXTICR组 0x05EXTI->EXTICR[extix/4] &= (~(0xff << ((extix%4)*8)));EXTI->EXTICR[extix/4] |= (groupx << ((extix%4)*8));//2.EXTI_FTSR1 设置下降沿触发方式if(trix == FALLING_TRI)EXTI->FTSR1 |= (0x1 << extix);elseEXTI->RTSR1 |= (0x1 << extix);//3.EXTI_IMR1 设置中断不屏蔽 =1EXTI->C1IMR1 |= (0x1 << extix);}//GIC初始化函数
//中断号,中断优先级
void hal_gic_init(unsigned int interruptx,unsigned int priority)
{//GICD初始化//1.GICD_CTRL 使能组0 [0]=1GICD->CTRL |= (0x1 << 0);//2.GICD_ISENABLER组 设置GICD层中断使能GICD->ISENABLER[interruptx/32] |= (0x1 << (interruptx % 32));//3.GICD_IPRIORITYR组 设置中断优先级 操作高5位GICD->IPRIORITYR[interruptx/4] &= (~(0x1f << (interruptx % 4 * 8 + 3)));GICD->IPRIORITYR[interruptx/4] |= (priority << (interruptx % 4 * 8 + 3));//4.GICD_ITARGETSR组 设置中断目标分配给CPU0GICD->ITARGETSR[interruptx/4] &= (~(0x3 << (interruptx % 4 * 8)));GICD->ITARGETSR[interruptx/4] |= (0x1 << (interruptx % 4 * 8));//GICC初始化//1.GICC_CTRL 设置GICC层组0使能 [0]=1GICC->CTRL |= (0x1 << 0);//2.GICC_PMR 设置GICC层中断优先级 GICC->PMR |= ((priority+1) << 3);
}//led灯初始化
//参数1:GPIO组号
//参数2:引脚编号
void led_init(gpio_t* gpiox,unsigned int pin)
{//1输出模式 gpiox->MODER &= ~(0x3 << (pin*2));gpiox->MODER |= (0x1 << (pin*2));//2输出类型gpiox->OTYPER &= (~(0x1 << pin));//3输出速率gpiox->OSPEEDR &= ~(0x3 << (pin*2));//4拉电阻gpiox->PUPDR &= ~(0x3 << (pin*2));
}
---do_irq.c终端处理函数---
#include "key.h"extern void printf(const char *fmt, ...);//中断处理函数
void do_irq(void)
{//1获取中断号 IAR[9:0]unsigned int num = 0;num = GICC->IAR & 0x3ff;//2判断中断号,并且打印一句话switch(num){case 99:printf("KEY1按键中断,LED3灯取反\n");//led3灯状态取反GPIOE->ODR ^= (0x1 << 8);//3清除EXTI层中断挂起标志位 [9]=1//EXTI_FDR1 [9]=1EXTI->FPR1 |= (0x1 << 9);//4清除GICD层中断挂起标志位//GICD_ICPENDR3 [3]=1GICD->ICPENDR[3] |= (0x1 << 3);break;case 97:printf("KEY2按键中断,LED2灯取反\n");//led2灯状态取反GPIOF->ODR ^= (0x1 << 10);//清除EXTI层中断挂起标志位 [9]=1EXTI->FPR1 |= (0x1 << 7);GICD->ICPENDR[3] |= (0x1 << 1);break;case 98:printf("KEY3按键中断,LED1灯取反\n"); //led1灯状态取反GPIOE->ODR ^= (0x1 << 10);EXTI->FPR1 |= (0x1 << 8);GICD->ICPENDR[3] |= (0x1 << 2);break;}//5清楚获取到的中断号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++);
}#define GPIO_PIN10 10 //引脚编号
#define GPIO_PIN8 8
#define EXTI9 9 //EXTI编号
#define EXTI7 7
#define EXTI8 8
#define GPIOF_GROUP 0x05 //GPIOF组号
#define KEY1_ID 99 //中断号
#define KEY2_ID 97
#define KEY3_ID 98
#define KEY1_PRIORITY 9 //中断优先级
#define KEY2_PRIORITY 7
#define KEY3_PRIORITY 8int main()
{//使能三盏灯PE10 PF10 PE8RCC->MP_AHB4ENSETR |= (0x3 << 4);//led初始化函数led_init(GPIOE,GPIO_PIN10);led_init(GPIOF,GPIO_PIN10);led_init(GPIOE,GPIO_PIN8);//中断RCC章节初始化 PF9 7 8hal_interrupt_rcc_init();//EXTI初始化函数hal_exti_init(EXTI9,GPIOF_GROUP,FALLING_TRI);hal_exti_init(EXTI7,GPIOF_GROUP,FALLING_TRI);hal_exti_init(EXTI8,GPIOF_GROUP,FALLING_TRI);//GIC初始化函数hal_gic_init(KEY1_ID,KEY1_PRIORITY);hal_gic_init(KEY2_ID,KEY2_PRIORITY);hal_gic_init(KEY3_ID,KEY3_PRIORITY);while(1){}return 0;}
4.实验现象:


相关文章:
ARM开发,stm32mp157a-A7核中断实验(实现按键中断功能)
1.实验目的:实现KEY1/LEY2/KE3三个按键,中断触发打印一句话,并且灯的状态取反; key1 ----> LED3灯状态取反; key2 ----> LED2灯状态取反; key3 ----> LED1灯状态取反; 2.分析框图: …...
kafka常用命名
kafka服务启动 $KAFKA_HOME/bin/kafka-server-start.sh -daemon config/server.properties 创建Topic $KAFKA_HOME/bin/kafka-topics.sh --create --topic test0--zookeeper 127.0.0.1:2181 --config max.message.bytes12800000 --config flush.messages1 --partitions 5 …...
华为云开发工具CodeArts IDE for C/C++ 开发使用指南
简介 CodeArts IDE是一个集成开发环境(IDE),它提供了开发语言和调试服务。本文主要介绍CodeArts IDE for C/C的基本功能。 1.下载安装 CodeArts IDE for C/C 已开放公测,下载获取免费体验 2.新建C/C工程 CodeArts IDE for C/…...
如何选择最适合你的SOLIDWORKS版本 硕迪科技
SOLIDWORKS是一款广泛应用于工程设计领域的三维计算机辅助设计(CAD)软件,因其强大的功能和易学易用的界面而备受工程师们的青睐。面对众多的SOLIDWORKS版本,比如SW专业版、白金版,租赁订阅版,以及solidwork…...
通过双层负载均衡实现HTTPS代理的高并发处理和容错能力
在互联网应用中,HTTPS代理服务器是承担用户请求的重要角色。当网站面临高并发请求时,单一的服务器可能无法满足需求,会导致性能下降和容错能力不足。为了解决这个问题,我们可以通过双层负载均衡技术来实现高并发处理和容错能力的提…...
Redis 整合中 Redisson 的使用
大家好 , 我是苏麟 , 今天带来 Redisson 使用 . 官方文档 : GitHub - redisson/redisson: Redisson - Easy Redis Java client with features of In-Memory Data Grid. Sync/Async/RxJava/Reactive API. Over 50 Redis based Java objects and services: Set, Multimap, Sorte…...
数据结构(5)
堆 堆可以看作一颗完全二叉树的数组对象。 特性: 1.堆是完全二叉树,除了树最后一层不需要满,其余层次都需要满,如果最后一层不是满的,那么要求左满右不满 2.通常使用数组实现,将二叉树结点依次放入数组中…...
R语言实现网状Meta分析(1)
#R语言实现网状Meta library(gemtc) help(package"gemtc") data<-gemtc::smoking #注意按照实例格式编写数据 net<-mtc.network(data$data.ab) #网状图 plot(net,mode"circle",displaylabelsT,boxed.labelF) summary(net) #网状model model<-mtc…...
Reactor 第十篇 定制一个生产的WebClient
1 为什么要用 WebClient 刚开始尝试使用 Spring WebFlux 的时候,很多人都会使用 Mono.fromFuture() 将异步请求转成 Mono 对象,或者 Mono.fromSupplier() 将请求转成 MOno 对象,这两种方式在响应式编程中都是不建议的,都会阻塞当…...
桃子叶片病害识别(Python代码,pyTorch框架,深度卷积网络模型,很容易替换为其它模型,带有GUI识别界面)
1.分为三类 健康的桃子叶片 ,251张 桃疮痂病一般,857张 桃疮痂病严重,770 张 2. GUI界面识别效果和predict.py识别效果如视频所示桃子叶片病害识别(Python代码,pyTorch框架,深度卷积网络模型࿰…...
matlab使用教程(21)—求函数最值
1. 求函数最优值 1.1求一元函数的最小值 如果给定了一个一元数学函数,可以使用 fminbnd 函数求该函数在给定区间中的局部最小值。例如,请考虑 MATLAB 提供的 humps.m 函数。下图显示了 humps 的图。 x -1:.01:2; y humps(x); plot(x,y) xlabel(x)…...
Redis中 为什么Lua脚本可以保证原子性?
Redis中 为什么Lua脚本可以保证原子性?...
tda4 videnc-test-app: CONTINUOUS and STEPWISE FRAMEINTERVALS not supported
/* videnc-test-app */ https://git.ti.com/cgit/jacinto7_multimedia/ git clone https://git.ti.com/git/jacinto7_multimedia/videnc-test-app.git // 编译 ./autogen.sh ./configure --enable-maintainer-mode --buildi386-linux --hostaarch64-none-linux CC/home/share…...
[已解决] libGL error: MESA-LOADER: failed to open swrast
在新的服务器中配置好虚拟环境后,利用已有的预训练模型test后,可视化时遇到: libGL error: MESA-LOADER: failed to open swrast: /usr/lib/dri/swrast_dri.so: cannot open shared object file: No such file or directory (search paths /u…...
JVM及垃圾回收机制
文章目录 1、JVM组成?各部分作用?1.1 类加载器(Class Loaders)1.2 运行时数据区(Runtime Data Area)1.3 执行引擎(Execution Engine)1.4 本地方法接口(Native Interface&…...
windows11不允许安装winpcap4.1.3
问题:下载安装包后在安装时显示与电脑系统不兼容,不能安装。 原因:winpcap是一个用于Windows操作系统的网络抓包库,有一些安全漏洞,存在被黑客攻击的风险。Windows11为了加强系统安全而禁用了这个库,因此不…...
matlab使用教程(23)—优化函数的参数
本博客向您介绍如何存储或访问向 MATLAB 复合函数(如 fzero 或 integral)传递的数学函数的额外参数。 MATLAB 复合函数基于某个值范围计算数学表达式。这些函数之所以称为复合函数是因为它们是接受函数句柄(函数的指针)作为输入…...
基于“互联网+ 服务供应链”的汽车道路救援系统对策分析
1。 建立“互联网服务供应链”背景下汽车道路救援系统 基于互联网的汽车道路救援,两级服务供应链结构是由服务提供商、服务 集成商和客户组成。“互联网服务供应链”背景下汽车道路救援系统组成, 它是一种 B2B2C 的形式,与前述传统汽车道路…...
浅谈泛在电力物联网在电力设备状态在线监测中的应用
安科瑞 华楠 摘要:随着信息化水平的不断发展,泛在电力物联网的建设提上日程,这对提升变电站电力设备在线监测水平,推动智能电网发展具有重要的指导意义。对基于物联网的电力设备状态监测系统进行了研究,概括了泛在电力…...
低通滤波器和高通滤波器
应用于图像低通滤波器和高通滤波器的实现 需要用到傅里叶变换 #include <opencv2/opencv.hpp> #include <Eigen> #include <iostream> #include <vector> #include <cmath> #include <complex>#define M_PI 3.14159265358979323846…...
GEO时代的技术突围:Infoseek媒体发布如何改写内容分发规则
最近在技术圈刷到一个新词——GEO(生成式引擎优化)。和传统SEO不一样,GEO的目标不是让网页排到搜索结果前面,而是让AI在回答用户问题时,把你的内容当成“标准答案”来引用。这个变化挺有意思,意味着内容分发…...
OpenClaw可视化监控:Qwen3-32B任务执行实时看板搭建
OpenClaw可视化监控:Qwen3-32B任务执行实时看板搭建 1. 为什么需要可视化监控? 去年冬天的一个深夜,我被手机警报惊醒——团队的数据处理流程卡住了。登录服务器后发现,OpenClaw正在处理的某个长文本分析任务已经运行了6小时&am…...
java毕业设计基于springboot铜仁一中学生成绩管理系统
前言 铜仁一中学生成绩管理系统是基于Java和Spring Boot框架开发的,目的是高效管理学生的成绩信息,为学校教学管理提供便利。通过该系统,教师可以方便地录入学生的各科考试成绩,学生和教师能够根据不同条件查询成绩,系…...
多智能体概述
一、多智能体概述 多智能体系统通过协调多个专职智能体或组件来完成复杂流程。并非所有复杂任务都需要多智能体——单个智能体配合合适的工具与提示词往往就够用。我们何时采用多智能体模式更有价值,以及 AgentScope 支持哪些模式? 1、为什么要用多智能体…...
避坑指南:在ZYNQ上调试PCIe设备时,如何手动验证枚举与BAR空间配置是否正确
ZYNQ平台PCIe设备调试实战:手动验证枚举与BAR配置的工程方法论 当你在ZYNQ平台上调试PCIe设备时,是否遇到过这样的场景:Vivado中精心设计的PCIe链路通过了硬件测试,但系统启动后lspci却看不到设备踪影?或者设备虽然被识…...
MinIO文件存储避坑指南:SpringBoot整合中的5个常见错误及解决方案
MinIO文件存储避坑指南:SpringBoot整合中的5个常见错误及解决方案 在当今数据驱动的时代,文件存储和管理已成为企业应用开发中不可或缺的一环。MinIO作为一款高性能、开源的对象存储解决方案,因其轻量级、兼容S3协议以及与云原生生态的无缝集…...
【LeArm】从零玩转机械臂(一):开箱、配网与基础控制实战
1. LeArm机械臂开箱初体验 第一次拿到LeArm机械臂的包装箱时,明显能感受到厂家在包装上的用心。打开外层纸箱后,内部还有一层泡沫保护层,所有部件都被固定在定制泡沫槽位里,这种包装方式让我想起了高端电子产品的开箱体验。取出所…...
虚拟手柄技术深度剖析:ViGEmBus内核级输入模拟架构解析
虚拟手柄技术深度剖析:ViGEmBus内核级输入模拟架构解析 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 在游戏开发与输入设备兼容性领域…...
OpenClaw长期运行秘诀:GLM-4.7-Flash任务守护与自动恢复机制
OpenClaw长期运行秘诀:GLM-4.7-Flash任务守护与自动恢复机制 1. 为什么需要长期运行方案? 去年冬天的一个深夜,我被手机警报惊醒——OpenClaw在连续处理300多份文档后突然崩溃,导致凌晨的自动化报表任务全部中断。这次事故让我意…...
构建高可用Chatbot UI完整模板:从架构设计到生产环境部署
痛点分析:Chatbot UI开发中的那些“坑” 在动手开发一个Chatbot UI之前,我们得先聊聊那些让开发者头疼的常见问题。如果你做过类似项目,下面这些场景一定不陌生: 状态管理失控:对话历史、用户输入、AI回复状态、连接…...
