ARM按键中断控制事件
设置按键中断,按键1按下,LED亮,再按一次,灭按键2按下,蜂鸣器响。再按一次,不响按键3按下,风扇转,再按一次,风扇停
src/key_it.c
#include"key_it.h"
//GPIO初始化
void all_led_init()
{//RCC使能RCC->MP_AHB4ENSETR |= (0X1<<4);//设置PE10 PF10 PE8为输出GPIOE->MODER &= (~(0X3<<20));GPIOE->MODER |= (0X1<<20);//设置推挽输出GPIOE->OTYPER &= (~(0X1<<10)); //设置三个管脚低速输出GPIOE->OSPEEDR &= (~(0X3<<20));//设置三个管脚输出时无上拉电阻和下拉电阻 GPIOE->PUPDR &= (~(0X3<<20));
}
void all_spi_init()
{//RCC使能RCC->MP_AHB4ENSETR |= (0X3<<1);//设置PE10 PF10 PE8为输出GPIOB->MODER &= (~(0X3<<12));GPIOB->MODER |= (0X1<<12);//设置推挽输出GPIOB->OTYPER &= (~(0X1<<6)); //设置三个管脚低速输出GPIOB->OSPEEDR &= (~(0X3<<12));//设置三个管脚输出时无上拉电阻和下拉电阻 GPIOB->PUPDR &= (~(0X3<<12));
}
void all_fan_init()
{//RCC使能RCC->MP_AHB4ENSETR |= (0X3<<4);//设置PE10 PF10 PE8为输出GPIOE->MODER &= (~(0X3<<18));GPIOE->MODER |= (0X1<<18);//设置推挽输出GPIOE->OTYPER &= (~(0X1<<9)); //设置三个管脚低速输出GPIOE->OSPEEDR &= (~(0X3<<18));//设置三个管脚输出时无上拉电阻和下拉电阻 GPIOE->PUPDR &= (~(0X3<<18));
}
//按键2的配置
void key2_it_config()
{//RCC使能GPIOF时钟RCC->MP_AHB4ENSETR |= (0x1<<5);//pf7GPIOF->MODER &= (~(0x3<<14));//pf7EXTI->EXTICR2 &=(~(0xFF<<24));EXTI->EXTICR2 |= (0x5<<24);//pf7EXTI->FTSR1 |= (0x1<<7);//PF7EXTI->C1IMR1 |= (0x1<<7);//PF7 97号中断GICD->ISENABLER[3] |= (0X1<<1); //PF7GICD->IPRIORITYR[24] &= (~(0X1F<<11)); //pf7 97中断GICD->ITARGETSR[24] &= (~(0X3<<8));GICD->ITARGETSR[24] |= (0X1<<8);
}
//按键1 按键3以及GICC层的配置
void key_it_config()
{//RCC使能GPIOF时钟RCC->MP_AHB4ENSETR |= (0x1<<5);//设置PF9 PF7 PF8GPIO输入//PF9GPIOF->MODER &= (~(0x3<<18));//PF8GPIOF->MODER &= (~(0x3<<16));//设置PF9 PF7 PF8产生EXTI事件 EXTI_EXTICRx//pf8EXTI->EXTICR3 &=(~(0xFF<<0));EXTI->EXTICR3 |= (0x5<<0);//pf9EXTI->EXTICR3 &=(~(0xFF<<8));EXTI->EXTICR3 |= (0x5<<8);//设置事件触发方式为下降沿触发EXTI_FTSR1//pf8EXTI->FTSR1 |= (0x1<<8);//pf9EXTI->FTSR1 |= (0x1<<9);//设置EXTI事件触发不屏蔽EXTI_IMR1//PF8EXTI->C1IMR1 |= (0x1<<8);//PF9EXTI->C1IMR1 |= (0x1<<9);//使能中断能转发到特定的CPU接口层GICD_ISENABLERx//PF8 98号中断GICD->ISENABLER[3] |= (0X1<<2); //PF9 99号中断GICD->ISENABLER[3] |= (0X1<<3); //GICD_ISENABLERx设置中断优先级//PF8GICD->IPRIORITYR[24] &= (~(0X1F<<19)); //PF9GICD->IPRIORITYR[24] &= (~(0X1F<<27)); //设置当前中断被转发到哪一个CPU处理GICD_ITARGETSRx//pf8 98中断GICD->ITARGETSR[24] &= (~(0X3<<16));GICD->ITARGETSR[24] |= (0X1<<16);//pf9 99中断GICD->ITARGETSR[24] &= (~(0X3<<24));GICD->ITARGETSR[24] |= (0X1<<24);//使能组0转发中断GICD_CTLRGICD->CTRL |= 0X1;//设置中断优先级掩码GICC_PMRGICC->PMR |= (0x1F<<3);//使能CPU可以处理组0转发的中断GICC_CTLRGICC->CTRL |= 0X1;}
src/do_irq.c
#include "key_it.h"extern void printf(const char *fmt, ...);unsigned int i = 0;void do_irq(void) {static int flag=0;static int flag1=0;static int flag2=0;int irqno;//保存中断号irqno=GICC->IAR & 0X3FF;switch(irqno){case 99://key1//按键1中断处理//printf("KEY1 INT\n");if(0==flag){//LED1亮GPIOE->ODR |= (0X1<<10);flag=1;}else if(1==flag){//LED1灭GPIOE->ODR &= (~(0X1<<10));flag=0;}//清除挂起中断标志位GICD_ICPENDRxGICD->ICPENDR[3] |= (0x1<<3);//清除中断触发标志位EXTI_FPR1EXTI->FPR1 |= (0x1<<9);break;case 97://key2//按键2中断处理//printf("KEY2 INT\n");if(0==flag1){//蜂鸣器响GPIOB->ODR |= (0X1<<6);flag1=1;}else if(1==flag1){//蜂鸣器不响GPIOB->ODR &= (~(0X1<<6));flag1=0;}//清除挂起中断标志位GICD_ICPENDRxGICD->ICPENDR[3] |= (0x1<<1);//清除中断触发标志位EXTI_FPR1EXTI->FPR1 |= (0x1<<7);break;case 98://key3//按键3中断处理// printf("KEY3 INT\n");if(0==flag2){//风扇转GPIOE->ODR |= (0X1<<9);flag2=1;}else if(1==flag2){//风扇停GPIOE->ODR &= (~(0X1<<9));flag2=0;}//清除挂起中断标志位GICD_ICPENDRxGICD->ICPENDR[3] |= (0x1<<2);//清除中断触发标志位EXTI_FPR1EXTI->FPR1 |= (0x1<<8);break;}//清除处理完的中断号GICC_EOIRGICC->EOIR =irqno;}
include/key_it.h
#ifndef __KEY_IT_H__
#define __KEY_IT_H__
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_exti.h"
#include "stm32mp1xx_gic.h"void key_it_config();
void key2_it_config();
void all_led_init();
void all_spi_init();
void all_fan_init();#endif
main.c
#include "uart.h"#include "key_it.h"int main(){uart4_init();//串口初始化all_led_init();//中断初始化key_it_config();key2_it_config();all_spi_init();all_fan_init();while(1){//保证主程序不结束} return 0;}
相关文章:
ARM按键中断控制事件
设置按键中断,按键1按下,LED亮,再按一次,灭按键2按下,蜂鸣器响。再按一次,不响按键3按下,风扇转,再按一次,风扇停 src/key_it.c #include"key_it.h" //GPIO初…...
微信小程序之本地生活(九宫格)
文章目录 一.创建项目二.配置修改json三.编写WXML四.编写WXSS五.最终效果 一.创建项目 创建新的项目,名称为:本地生活 二.配置修改json 在app.json中删除其他页面 将index改为grid 自动生成新的文件 添加自己的轮播图片 源代码: <!--…...
【Linux 安装Kibana 及 Es 分词器安装】
一、客户端Kibana安装 Kibana是一个开源分析和可视化平台,旨在与Elasticsearch协同工作。参考文档 1. 下载并解压缩Kibana 下载路径 选择的版本是和 ElasticSearch 对应(7.17.3) 下载后上传到Linux 系统中,并放在 /root/ 下&a…...
python-arima模型statsmodels库实现-有数据集(续)-statsmodels-0.9.0版本
python-arima模型statsmodels库实现-有数据集(续) 这篇博客是上一篇python-arima模型statsmodels库实现的续集,上一篇采用的statsmodels版本应该要高一点,如果使用低版本的statsmodels代码会有bug,这一篇则是针对stat…...
JVM源码剖析之线程的创建过程
说在前面: 对于Java线程的创建这个话题,似乎已经被"八股文"带偏~ 大部分Java程序员从"八股文"得知创建Java线程有N种方式,比如new Thread、new Runnable、Callable、线程池等等~ 而笔者写下这篇文…...
ansible的介绍安装与模块
目录 一、ansible简介 二、ansible特点 三、Ansible核心组件与工作原理 1、核心组件 2、工作原理 四、ansible的安装 五、ansible 命令行模块 1.command 模块 2.shell 模块 3.cron 模块 4.user 模块 5.group 模…...
el-form简单封装一个列表页中的搜索栏
父组件如何使用 代码中注释很多, 应该很容易理解 <template><div><wgySearchv-model"searchDefault":fields"searchFields"reset"reset"submit"submit"><!-- 通过 slot 自定义的组件 传啥都行 --><te…...
【Python 2】列表 模式匹配 循环 dict set 可变对象与不可变对象
Python内置的一种数据类型是列表:list 变量classmates就是一个list。用len()函数可以获得list元素的个数 用索引来访问list中每一个位置的元素 当索引超出了范围时,Python会报一个IndexError错误,所以,要确保索引不要越界…...
深度学习—cv动物/植物数据集
文章目录 动物相关植物相关 动物相关 Edinburgh Pig Behavior Video Dataset:https://homepages.inf.ed.ac.uk/rbf/PIGDATA/ WLD 动物目标检测数据集: https://github.com/hellock/WLD 猪脸识别:https://blog.51cto.com/u_15404184/5289690 AFD动物面部数据集&…...
高效团队协作软件推荐:提升工作效率的优选方案!
使用团队协作软件有什么好处?可以摆脱过时的电子表格,有了单一的真实来源,您可以随时检查任何任务并获得可用的最新信息。 一目了然地查看所有正在进行的工作,看板式面板、甘特图和燃尽图等可视化工具可让您随时轻松获得项目的高级…...
Mac中使用virtualenv和virtualenvwrapper
Virtualenv 介绍 在使用 Python 开发的过程中,工程一多,难免会碰到不同的工程依赖不同版本的库的问题;亦或者是在开发过程中不想让物理环境里充斥各种各样的库,引发未来的依赖灾难。 因此,我们需要对于不同的工程使…...
wpf webBrowser控件 常用的函数和内存泄漏问题
介绍 WebBrowsers可以让我们在窗体中进行导航网页。 WebBrowser控件内部使用ie的引擎,因此使用WebBrowser我们必须安装ie浏览器(windows默认安装的)。 使用 直接在xmal中使用webBrowser控件 <WebBrowser x:Name"WebBrowser1"…...
AI游戏设计的半年度复盘;大模型+智能音箱再起波澜;昇思大模型技术公开课第2期;出海注册经验分享;如何使用LoRA微调Llama 2 | ShowMeAI日报
👀日报&周刊合集 | 🎡生产力工具与行业应用大全 | 🧡 点赞关注评论拜托啦! 🔥 进步or毁灭:Nature 调研显示 1600 科学家对AI的割裂态度 国际顶级期刊 Nature 最近一项调研很有意思,全球 160…...
多线程 - 锁策略 CAS
常见的锁策略 此处谈到的锁策略,不局限于 Java,C,Python,数据库,操作系统……但凡是涉及到锁,都是可以应用到下列的锁策略的 乐观锁 vs 悲观锁 锁的实现者,预测接下来锁冲突(锁竞争,两个线程针对一个对象加锁,产生阻塞等待了)的概率是大,还是不大,根据这个冲突的概率,来接下…...
VP记录——The 2021 CCPC Weihai Onsite
网址 2021CCPC威海 赛时过题与罚时 A.Goodbye, Ziyin! 签到题,队友写的 #include<bits/stdc.h> using namespace std; int cnt[10], de[1000010]; int main() {int n;cin >> n;for(int i 1; i < n; i) {int u, v;scanf("%d %d", &…...
JavaWeb---Servlet
1.Srvlet概述 Servlet是运行在java服务器端的程序,用于接收和响应来着客户端基于HTTP协议的请求 如果想实现Servlet的功能,可以通过实现javax。servlet。Servlet接口或者继承它的实现类 核心方法:service()…...
英语——方法篇——单词——谐音法+拼音法——50个单词记忆
theatre,剧场,太后th吃eat热re食物,就去剧场了 loud dolphin,做do脸皮厚plh在。。。里 humid,hu湖mi米d的 blender,b爸lend借给er儿。 tragedy,tr土人...
35道Rust面试题
这套Rust面试题包括了填空题、判断题、连线题和编码题等题型。 选择题 1 ,下面哪个是打印变量language的正确方法? A,println("{}", language); B,println(language); C,println!("{}", langu…...
01 时钟配置初始化,debug
1. 开启debug series,否则只能下载一次,再次下载要配置boot 2.f0外部时钟配置 h750 配置 实测可用...
Halcon我的基础教程(一)(我的菜鸟教程笔记)-halcon仿射变换(Affine Transformation)的探究与学习
目录 什么是仿射变换?仿射变换有哪些方式?任何仿射变换都能由以下基本变换构造而来:在Halocn中,仿射变换具有重要的作用,那我们本文章重点讨论仿射变换基础性知识。 使用Halcon中的重要算子,仿射变换一般解决步骤,案例应用会在以后的文章中我们重点解答与讨论。 我们首先…...
AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
