STM32 多功能按键中断

news2025/2/26 15:12:54

key1 开关实现led1亮灭,key2开关实现蜂鸣器开关,key3开关实现风扇开关

main.c

#include "uart.h"
#include "key_it.h"
#include "led.h"
int main()
{
    char c;
    char *s;
    uart4_init();//串口初始化
	all_led_init();
	key_it_config();
	fengshan_init();
	key3_it_config();
    while(1)
    {
		
    }
    return 0;
}

 按键功能函数 

#include"key_it.h"
void key3_it_config()
{	RCC->MP_AHB4ENSETR |= (0x1<<5);

	//PF8
	GPIOF->MODER &= (~(0x3<<16));
	//PF8
	EXTI->EXTICR3 &= (~(0xFF<<0));
	EXTI->EXTICR3 |= (0x5<<0);
	//设置触发方式为下降沿触发EXTI_FTSR1
	EXTI->FTSR1 |= (0x1<<8);
	//设置EXTI事件触发不屏蔽 EXTI_IMR1
	EXTI->C1IMR1 |=(0x1<<8);
	GICD->IPRIORITYR[24] &= (~(0x1F<<19));
	GICD->ITARGETSR[24] &= (~(0x3<<16));
	GICD->ITARGETSR[24] |= (0x1<<16);
}
void key_it_config()
{
	//RCC使能GPIOF时钟
	RCC->MP_AHB4ENSETR |= (0x1<<5);

	RCC->MP_AHB4ENSETR |= (0x1<<1);
	
	RCC->MP_AHB4ENSETR |= (0x1<<4);
	//设置PF9 PF7 PF8 GPIO_MODER输入
	//PF9
	GPIOF->MODER &= (~(0x3<<18)); 
	//PF7
	GPIOF->MODER &= (~(0x3<<14));
	GICD->ISENABLER[3] |= (0x1<<2);   //PF8 98号中断 
	//PB6 蜂鸣器
	GPIOB->MODER &= (~(0x3<<12));
	GPIOB->MODER |=(0x1<<12);
	GPIOB->OTYPER &=(~(0x1<<6));
	GPIOB->OSPEEDR &= (~(0x3<<12));
	GPIOB->PUPDR &= (~(0x3<<12));
	//设置PF9 PF7 PF8产生EXTI事件 EXTI_EXTICRx
	//PF7
	EXTI->EXTICR2 &= (~(0xFF<<24));
	EXTI->EXTICR2 |= (0x5<<24);

	//pF9
	EXTI->EXTICR3 &= (~(0xFF)<<8);
	EXTI->EXTICR3 |= (0x5<<8);	
	//设置触发方式为下降沿触发EXTI_FTSR1
	EXTI->FTSR1 |= (0x7<<7);
	//设置EXTI事件触发不屏蔽 EXTI_IMR1
	EXTI->C1IMR1 |=(0x7<<7);
	//使能组0转发中断GICD_CTRL
	GICD->CTRL |=(0x1);
	//使能中断能转发到特定的CPU接口层
	GICD->ISENABLER[3] |= (0x1<<3);   //PF9 99号中断 

	GICD->ISENABLER[3] |= (0x1<<1);   //PF7 97号中断
	//GICD_IPRIOITYR设置中断优先级
	GICD->IPRIORITYR[24] &= (~(0x1F)<<11);

	//PF9
	GICD->IPRIORITYR[24] &= (~(0x1F<<27));
	//设置当前中断被转发特定的CPU接口层GICO_ITARGETSRx
	GICD->ITARGETSR[24] &= (~(0x3<<8));
	GICD->ITARGETSR[24] |= (0x1<<8);

	GICD->ITARGETSR[24] &= (~(0x3<<24));
	GICD->ITARGETSR[24] |= (0x1<<24);
	//使能CPU可以处理组0转发的中断GICD_CTLR
	GICC->CTRL |= 0x1;
	//设置中断优先级掩码GICC_CTKR
	GICC->PMR |= (0x1F<<3);
	GICC->CTRL |= (0x1);
	
}
void fengshan_init()
{
	RCC->MP_AHB4ENSETR |= (0x1<<4);
	//PB9
	GPIOE->MODER &= (~(0x3<<18));
	GPIOE->MODER |= (0x1<<18);
	GPIOE->OTYPER &=(~(0x1<<9));
	GPIOE->OSPEEDR &= (~(0x3<<18));
	GPIOE->PUPDR &= (~(0x3<<18));
}

 头文件 key_it.h

#ifndef __KEY_IT_H__
#define __KEY_IT_H__
#include "stm32mp1xx_exti.h"
#include "stm32mp1xx_gic.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
void key_it_config();
void key3_it_config();
void fengshan_init();
#endif

 led的功能函数 led.c

#include"led.h"
//延时函数
void delay(int ms)
{
	int i,j;
	for(i=0;i<ms;i++)
	{
		for(j=0;j<2000;j++);
	}
}

//GPIO初始化
void all_led_init()
{
	//RCC使能
	RCC->MP_AHB4ENSETR |= (0x3<<20);
	//设置PE10 PF10 PE8为输出
	GPIOE->MODER &= (~(0x3<<20));
	GPIOE->MODER |= (0x1<<20);
	GPIOF->MODER &= (~(0x3<<20));
	GPIOF->MODER |= (0x1<<20);
	GPIOE->MODER &= (~(0x3<<16));
	GPIOE->MODER |= (0x1<<16);
	//设置推挽输出
	GPIOE->OTYPER &= (~(0x1<<10));
	GPIOF->OTYPER &= (~(0x1<<10));
	GPIOE->OTYPER &= (~(0x1<<8));
	//设置三个管脚低速输出
	GPIOE->OSPEEDR &= (~(0x3<<20));
	GPIOF->OSPEEDR &= (~(0x3<<20));
	GPIOE->OSPEEDR &= (~(0x3<<16));
	//设置三个管脚输出时无上拉电阻和下拉电阻
	GPIOE->PUPDR &= (~(0x3<<20));
	GPIOE->PUPDR &= (~(0x3<<20));
	GPIOE->PUPDR &= (~(0x3<<20));
	



}

中断处理函数实现do_irq.c

#include "key_it.h"
#include "led.h"
extern void printf(const char *fmt, ...);
unsigned int i = 0;
int flag=0;
void do_irq(void) 
{
	int irqno; //保存中断号
	irqno=GICC->IAR & 0x3FF;
	switch(irqno)
	{
	case 99://key1
		//按键1中断处理
		printf("key1\n");
		printf("key1 ID =%d\n",irqno);
		//LED亮
		if(flag==0)
		{
		GPIOE->ODR |=(0x1<<10);
		flag=1;
		//GPIOE.odr &=(~(0x1<<10));
		//GPIOE.odr &= (~(0x1<<8));
		}else
		{
			flag=0;
			GPIOE->ODR &=(~(0x1<<10));

		}
		//清除挂起中断标志位GICD_ICPENDRx
		GICD->ICPENDR[3] |=(0x1<<3);
		//清除中断触发标志位EXTI_FPR1
		EXTI->FPR1 |= (0x1<<9);
		break;
	case 97:
		//按键2中断处理
		printf("key2\n");
		printf("key2 ID =%d\n",irqno);

		if(flag==0)
		{
		GPIOB->ODR |=(0x1<<6);
		flag=1;
		}
		else
		{
			flag=0;
			GPIOB->ODR &= (~(0x1<<6));
		}
		//清除挂起中断标志位GICD_ICPENDRx
		GICD->ICPENDR[3] |=(0x1<<1);
		//清除中断触发标志位EXTI_FPR1
		EXTI->FPR1 |= (0x1<<7);
		break;
	case 98:

		//按键3中断处理
		printf("key3\n");
		printf("key3 ID =%d\n",irqno);
		
		if(flag==0)
		{
		GPIOE->ODR |=(0x1<<9);
		flag=1;
		}
		else
		{
			flag=0;
			GPIOE->ODR &= (~(0x1<<9));
		}
//清除挂起中断标志位GICD_ICPENDRx
		GICD->ICPENDR[3] |=(0x1<<2);
		//清除中断触发标志位EXTI_FPR1
		EXTI->FPR1 |= (0x1<<8);

	}

		//清除处理完的中断号
		GICC->EOIR=irqno;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年中国脱皮芝麻生产工艺、产量及消费量分析[图]

白芝麻在一般的油脂生产中是不脱皮的&#xff0c;但是直接食用时最好进行脱皮处理。原因在于芝麻种皮或角质层中纤维和草酸盐含量&#xff08;2%~3%草酸钙螯合物&#xff09;较高&#xff0c;使得其油和粕不能作为人类的蛋白质资源&#xff0c;只能用作牛的饲料或肥料。因此&am…

MarkDown制作思维导图

MarkDown制作思维导图 很实用的markdown转xmind思维导图教程 1、markdown导出OPML文件 &#x1f4a1; Typora 导出&#xff0c;需要安装 Pandoc&#xff0c;安装后重启电脑即可导出 2、xmind选择导入OPML格式 &#x1f4a1; 思维导图markdown的标题生成&#xff0c;因此可能要…

【嵌入式】堆栈与单片机内存

堆栈 在片内RAM中&#xff0c;常常要指定一个专门的区域来存放某些特别的数据 它遵循顺序存取和后进先出(LIFO/FILO)的原则&#xff0c;这个RAM区叫堆栈。 其实堆栈就是单片机中的一些存储单元&#xff0c;这些存储单元被指定保存一些特殊信息&#xff0c;比如地址&#xff0…

自动驾驶学习笔记(三)——场景设计

#Apollo开发者# 学习课程的传送门如下&#xff0c;当您也准备学习自动驾驶时&#xff0c;可以和我一同前往&#xff1a; 《自动驾驶新人之旅》免费课程—> 传送门 《2023星火培训【感知专项营】》免费课程—>传送门 文章目录 前言 场景设计平台 场景地图 场景基本…

颠覆出海营销,机器学习带来买量新变化

这几年出海营销的神话都是机器学习给的&#xff1a; 机器学习显著降低CPI、机器学习大幅提高下载量、机器学习低成本撬动大流量... 此前&#xff0c;用户增长每一步都高度依赖营销人员的运营经验&#xff1b;现在&#xff0c;机器学习正在完全颠覆买量模式拓展营销格局&#…

【线下沙龙】低成本高效率构建您的业务系统

全球企业都在向数字化迈进&#xff0c;但在各类行业调查中表明&#xff0c;只有不到20&#xff05;的前沿企业通过其数字化转型而获得了成功&#xff0c;大部分企业都将高昂的时间和成本花费在了数字化技术的实施和培训上面。很多企业在转型的过程中面临着众多挑战&#xff1a;…

pycharm中快速对比两个.py文件

在学习一个算法的时候&#xff0c;就想着自己再敲一遍代码&#xff0c;结果最后出现了一个莫名其妙的错误&#xff0c;想跟源文件对比一下到底是在哪除了错&#xff0c;之前我都是大致定位一个一个对比&#xff0c;想起来matlab可以快速查找出两个脚本文件(.m文件)的区别&#…

基于深度学习的“语义通信编解码技术”框架分类

目录 基于神经网络的语义提取基于神经网络的语义信源编码基于神经网络的语义信源信道联合编码基于神经网络的语义编码与数字调制联合设计参考文献 基于神经网络的语义提取 在现有的信源编码前端加上一个语义提取神经网络[53] &#xff0c;如图所示。语义提取神经网络的输入是原…

linux 安装python django pip 遇到的问题

Python解决SSL不可用问题 解决方案&#xff1a; 首先要明白python版本需要和openssl的版本需要相对匹配的&#xff0c;在Python3.7之后的版本&#xff0c;依赖的openssl&#xff0c;必须要是1.1或者1.0.2之后的版本&#xff0c;或者安装了2.6.4之后的libressl&#xff0c;linux…

使用AIGC快速涨粉

1、newbing 2、输入提示词&#xff1a; 我想拍一个抖音短视频&#xff0c;请帮我选题&#xff0c;要求吸引人的 3、根据他的回答&#xff0c;选中一个有代表性的。 请产生《我用抖音教你如何做出超级美味的巧克力蛋糕&#xff0c;只需要三分钟&#xff0c;简单又好吃》的脚本 …

MobaXterm使sftp目录与cmd目录同步

MobaXterm使sftp目录与cmd目录同步 创建session时在ssh菜单栏中选择Advanced SSH settings其中SSH-browser type 选择SCP&#xff08;enhanced speed&#xff09; 勾选Follow SSH path

人体行走电压测试仪的使用说明

人体行走电压测试仪是一种用于测试人体静电电压的仪器&#xff0c;通常由控制单元、传感器、显示屏等组成。以下是人体行走电压测试仪的使用说明&#xff1a; 连接电源&#xff1a;将测试仪的电源线插入电源插座&#xff0c;并将另一端插入测试仪的电源接口。 连接传感器&…

SpringMVC之框架搭建开发实例请求的处理流程

什么是springmvc Spring Web MVC是一种基于Java的实现了MVC设计模式的、请求驱动类型的、轻量级Web框架。 项目中加入springmvc支持 导入依赖 <properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.sourc…

应用在汽车发动机温度检测中的高精度温度传感芯片

汽车发动机是为汽车提供动力的装置&#xff0c;是汽车的心脏&#xff0c;决定着汽车的动力性、经济性、稳定性和环保性。根据动力来源不同&#xff0c;汽车发动机可分为柴油发动机、汽油发动机、电动汽车电动机以及混合动力等。 常见的车用温度传感器有进气温度传感器、变速器…

面试常考数据结构:红黑树、B树、B+树各自适用的场景

1. 磁盘基础知识 分页&#xff1a; 现代操作系统都使用虚拟内存来印射到物理内存&#xff0c;内存大小有限且价格昂贵&#xff0c;所以数据的持久化是在磁盘上。虚拟内存、物理内存、磁盘都使用页作为内存读取的最小单位。一般一页为4KB&#xff08;8个扇区&#xff0c;每个扇…

eclipse 配置selenium环境

eclipse环境 安装selenium的步骤 配置谷歌浏览器驱动 Selenium安装-如何在Java中安装Selenium chrome驱动下载 eclipse 启动配置java_home&#xff1a; 在eclipse.ini文件中加上一行 1 配置java环境&#xff0c;网上有很多教程 2 下载eclipse&#xff0c;网上有很多教程 ps&…

掌握Python爬虫实现网站关键词扩展提升曝光率

在如今激烈竞争的网络世界中&#xff0c;如何提升网站的搜索曝光率成为了每个站长和营销人员都关注的重要问题。在这方面&#xff0c;Python爬虫可成为您的得力助手&#xff0c;通过扩展网站关键词&#xff0c;更好地满足用户搜索需求&#xff0c;提升网站在搜索引擎中的曝光率…

小视频APP源码定制化攻略:让你的短视频应用独树一帜

在当今流行的短视频应用市场中&#xff0c;为了突出个性和赢得用户青睐&#xff0c;许多人采用定制化小视频APP源码的方式&#xff0c;以创建独特的平台。本文将教你如何定制化小视频APP源码&#xff0c;让你的短视频应用在竞争激烈的市场中独树一帜。 1. 理解小视频APP源码的…

PyTorch 深度学习之多分类问题Softmax Classifier(八)

1. Revision: Diabetes dataset 2. Design 10 outputs using Sigmoid? 2.1 Output a Distribution of prediction with Softmax 2.2 Softmax Layer Example, 2.3 Loss Function-Cross Entropy Cross Entropy in Numpy Cross Entropy in PyTorch 注意交叉熵损失&#xff0c;最…

Openstack部署

搭建基础环境 #网络 #防火墙 #用户用 #解析 #同步时间 实验角色 OpenStack01OpenStack02OpenStack03192.168.1.101192.168.1.102192.168.1.103srv1srv2srv3 同步时间 [rootsrv1]# yum install chrony -y [rootsrv1]# vim /etc/chrony.conf # 修改第3行&#xff0c;将NT…