按键中断控制LED灯亮灭

news2024/11/18 10:52:10

EXTI—外部中断/事件控制器

EXTI(External interrupt/event controller)—外部中断/事件控制器,管理了控制器的 20 个中断/事 件线。每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的 检测。EXTI可以实现对每个中断/事件线进行单独配置,可以单独配置为中断或者事件,以及触 发事件的属性

 

EXTI 功能框

 

中断/事件线

硬件设计:

软件设计:

创建两个文件Key.c和Key.h,用来存放按键驱动程序即相关宏定义。

编程要点:

(1)初始化用来产生中断的GPIO。
(2)初始化EXTI。
(3)配置NVIC。
(4)编写中断服务函数。

Key.c文件

#include "Key.h"
#include "Led.h"


void Key_Init(void)
{
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);  //开启GPIOE时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);    //开启AFIO时钟
	
	GPIO_InitTypeDef  GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;   //上拉输入
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4;    //引脚4
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOE,&GPIO_InitStruct);
	
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);   //选择外部中断线 AFIO
	
	EXTI_InitTypeDef  EXIT_InitStruct;   //定义外部中断结构体
	EXIT_InitStruct.EXTI_Line = EXTI_Line4;  //选择外部中断线
	EXIT_InitStruct.EXTI_LineCmd = ENABLE;    //使能外部中断
	EXIT_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;   //中断模式
	EXIT_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;   //上升沿触发
	EXTI_Init(&EXIT_InitStruct);  //初始化外部中断
	
	/*配置NVIC为优先级组*/
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);   //配置NVIC
	
	NVIC_InitTypeDef NVIC_InitStruct;
	NVIC_InitStruct.NVIC_IRQChannel = EXTI4_IRQn; /*配置中断源:按键0*/
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;  /*配置抢占优先级:1*/
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;			/*配置子优先级:1*/
	 
	NVIC_Init(&NVIC_InitStruct);
}



void Key1_Init(void)
{
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);   //开启AFIO时钟
	
	GPIO_InitTypeDef  GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;   //上拉输入
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOE,&GPIO_InitStruct);
	
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3);	   ///*选择EXTI的信号源*/
	EXTI_InitTypeDef  EXIT_InitStruct;   //定义外部中断结构体
	EXIT_InitStruct.EXTI_Line = EXTI_Line3;  //选择外部中断线
	EXIT_InitStruct.EXTI_LineCmd = ENABLE;    //使能外部中断
	EXIT_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;   //中断模式
	EXIT_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;   //上升沿触发
	EXTI_Init(&EXIT_InitStruct);  //初始化外部中断
	
	
	/*配置NVIC为优先级组*/
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);   //配置NVIC
	
	NVIC_InitTypeDef NVIC_InitStruct;
	NVIC_InitStruct.NVIC_IRQChannel = EXTI3_IRQn;  /*配置中断源:按键1*/
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;  /*配置抢占优先级:1*/
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;    	/*配置子优先级:2*/
	
	NVIC_Init(&NVIC_InitStruct);
	
}

void  EXTI4_IRQHandler(void)
{
    /*确认是否产生了EXTI Line中断*/
	if(EXTI_GetITStatus(EXTI_Line4) != RESET)  
	{
	
		LED_ON();   //按键按下灯亮
         //清除中断标志位
		EXTI_ClearITPendingBit(EXTI_Line4);
	 
	}
	
}

void  EXTI3_IRQHandler(void)
{

	if(EXTI_GetITStatus(EXTI_Line3) != RESET)   //不等于0条件为真
	{
	
		LED_OFF();   //按键按下灯灭
		EXTI_ClearITPendingBit(EXTI_Line3);
	 
	}
	

Key.h文件

#ifndef __KEY_H
#define __KEY_H

#include "stm32f10x.h"                  // Device header

void Key_Init(void);
void Key1_Init(void);

#endif 

Led.c文件

#include "Led.h"


void LED_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽输出
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOE, &GPIO_InitStructure);
	
	GPIO_SetBits(GPIOE, GPIO_Pin_5);
	
}

void LED_ON()   //灯亮
{

	GPIO_ResetBits(GPIOE, GPIO_Pin_5);

}

void LED_OFF()   //灯灭
{
	
	GPIO_SetBits(GPIOE, GPIO_Pin_5);
	
	
}

Led.h文件

#ifndef __LED_H
#define __LED_H

#include "stm32f10x.h"                  // Device header

void LED_Init(void);
void LED_ON(void);
void LED_OFF(void);

#define LED1_TOGGLE		{GPIOE->ODR ^=GPIO_Pin_5;} //绿灯状态翻转    异或操作

#endif

main.c文件

#include "stm32f10x.h"                  // Device header
#include "Led.h"
#include "Key.h"


int main(void)
{
	
	LED_Init();
	Key_Init();
	Key1_Init();
	
	while(1)
	{
	
	}

}

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

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

相关文章

MyBatis整合Spring的原理分析

MyBatis整合Spring的原理分析 http://mybatis.org/spring/zh/index.html 1. MyBatis整合Spring实现 我们先来实现MyBatis和Spring的整合操作。1.1 添加相关的依赖 <dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifa…

面试官:说说Vue 3.0中Treeshaking特性?

一、是什么 Tree shaking 是一种通过清除多余代码方式来优化项目打包体积的技术&#xff0c;专业术语叫 Dead code elimination 简单来讲&#xff0c;就是在保持代码运行结果不变的前提下&#xff0c;去除无用的代码 如果把代码打包比作制作蛋糕&#xff0c;传统的方式是把鸡…

石油数字孪生可视化管理平台,推动石油行业数字化转型与智能化应用

随着科技的飞速发展&#xff0c;如何利用先进的信息技术全面增强智能制造过程中感知、处理、决策、执行的能力&#xff0c;成为当前石油化工信息化数字化变革的研究重点&#xff0c;而数字孪生可视化管理平台具有高效的决策分析特点&#xff0c;将有力地推动数字化转型与智能化…

函数模板和类模板实例介绍

模板&#xff1a;将类型定义为参数&#xff0c;实现类型参数化&#xff0c;实现代码重用。 一、函数模板 格式&#xff1a; &#xff08;template-声明模板的关键字&#xff0c;class修饰形参类型&#xff09; template <class / typename T> 返回类型 函数名&#xff…

qDebug().noquote()、qDebug().nospace()和 DEFINES+= QT_NO_DEBUG_OUTPUT作用

qDebug().noquote() qDebug().noquote() 和输出有关系。 qDebug() 是 Qt 的调试输出函数&#xff0c;用于在调试模式下输出信息。 默认情况下&#xff0c;qDebug() 会自动为输出的字符串添加引号。使用 .noquote() 可以禁用这个特性&#xff0c;输出的字符串将不再包含引号。…

【Linux】操作系统的认识

操作系统 1. 冯诺依曼体系结构2. 操作系统 1. 冯诺依曼体系结构 冯诺依曼体系结构的介绍 冯.诺依曼结构消除了原始计算机体系中&#xff0c;只能依靠硬件控制程序的状况&#xff08;程序作为控制器的一部分&#xff0c;作为硬件存在&#xff09;&#xff0c;将程序编码存储在…

Python面向对象丨面向过程和面向对象,你真的了解“对象”吗?

Author&#xff1a;AXYZdong 硕士在读 工科男 有一点思考&#xff0c;有一点想法&#xff0c;有一点理性&#xff01; 定个小小目标&#xff0c;努力成为习惯&#xff01;在最美的年华遇见更好的自己&#xff01; CSDNAXYZdong&#xff0c;CSDN首发&#xff0c;AXYZdong原创 唯…

51单片机练习(04)

eg1:使用定时器的方式实现单片机流水灯 #include <REGX52.H> #include <INTRINS.H> #define uchar unsigned char #define uint unsigned int uchar temp,t0;// 初始化函数 void init(){temp 0xfe;//第一个发光二级管点亮P1 temp;// 初始化定时器TMOD 0x11;TH0…

网络协议--IP选路

9.1 引言 选路是IP最重要的功能之一。图9-1是IP层处理过程的简单流程。需要进行选路的数据报可以由本地主机产生&#xff0c;也可以由其他主机产生。在后一种情况下&#xff0c;主机必须配置成一个路由器&#xff0c;否则通过网络接口接收到的数据报&#xff0c;如果目的地址不…

游戏盾如何有效防护DDoS

从进入计算机时代以来&#xff0c;DDoS攻击一直是网络世界中的一大威胁&#xff0c;让无数服务陷入瘫痪。这种攻击的原理非常简单&#xff1a;攻击者使用大量的僵尸主机或蠕虫病毒&#xff0c;向目标服务器发送海量请求&#xff0c;迅速耗尽服务器的资源&#xff0c;使其无法继…

ATF安全漏洞挖掘之FUZZ测试

安全之安全(security)博客目录导读 ATF(TF-A)/OPTEE之FUZZ安全漏洞挖掘汇总 目录 一、tf-a-tests简介 二、TF-A SMC_FUZZING 一、tf-a-tests简介 tf-a-tests.git - Trusted Firmware-A Tests 版本下载 tf-a-tests.git - Trusted Firmware-A Tests 文档描述 Getting Star…

大二第三周总结(算法+生活)

算法&#xff1a; 题目&#xff1a;有效的括号 这个题目也是做过很多回了。主要就是数据结构中”栈“的应用&#xff0c;先进后出。 解题思路&#xff1a; 1.创建 Map 哈希表形成键值对映射 2.进行遍历字符串 在遍历过程中 如果 遍历到的字符c 是左括号&#xff0c;则入栈 pu…

【2024秋招】2023-8-5-小红书-数据引擎团队后端开发提前批面经

1 面试官介绍 OLAP引擎&#xff0c;离线引擎&#xff0c;大数据分析中间件 2 自我介绍 缺点&#xff1a; &#xff08;1&#xff09;面试官让重点介绍自己最在行的项目&#xff0c;我真的在自我介绍上扯了一些别的东西… &#xff08;2&#xff09;在面试的时候因为想看简…

学习笔记---0基础+干货满满的单链表专题~~

目录​​​​​​​ 1. 链表的概念及结构&#x1f451; 1.1 什么是链表&#xff1f;&#x1f440; 1.2 为什么需要链表&#xff1f;⁉️ 1.3 链表的结构是怎么样的&#xff1f;❓ 2. 链表的分类&#x1f99c; 3. 实现单链表&#x1faf5; 3.1 要实现的目标&#x1f3af;…

Ubuntu更新镜像源切换

概述 用ubuntu用apt命令&#xff0c;自动安装或更新包的时候&#xff0c;默认的镜像源服务器非常卡&#xff0c;很不方便。切换到国内的镜像源&#xff0c;下载更新非常快。为防止以后忘记&#xff0c;本文以国内服务器阿里巴巴的为例简单描述。 版本 Ubuntu23.10 找到更新…

使用 类加载器 或者 类对象 读取文件(参考的路径都是编译以后的文件夹,out 或者 target 文件夹 )

以下内容 本人都是 用 Maven 工程总结的 &#xff0c;所以会和普通项目的项目目录不太一样。相对路径&#xff1a;项目 的 根目录 开始查找。&#xff08; 但是在我们真正开发的时候&#xff0c;我们读到的更多的文件并不是直接放在我们项目里面这个文件夹里面&#xff0c;而是…

OpenAI 现已开始考虑自研 AI 芯片战略

根据 TechCrunch 的报道&#xff0c;随着 AI 芯片短缺的问题日益严重&#xff0c;OpenAI 现已开始考虑自研 AI 芯片。 据悉&#xff0c;从去年开始 OpenAI 内部就已经开始讨论 AI 芯片战略&#xff0c;以解决其 AI 芯片短缺的问题。这些方案包括自研 AI 芯片、与英伟达等芯片制…

用节点亲和性把 Pod 分配到节点

用节点亲和性把 Pod 分配到节点 当前集群信息&#xff1a; rootk8s-master:~# kubectl get node -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME k8s…

宝塔部署code-server

大家好&#xff0c;我叫徐锦桐&#xff0c;个人博客地址为www.xujintong.com。平时记录一下学习计算机过程中获取的知识&#xff0c;还有日常折腾的经验&#xff0c;欢迎大家来访。 code-server其实就是vscode网页版&#xff0c;可以实现随时随地编程。那么本教程是将源码的二进…

理解电路:从电报机到门电路,我们如何做到“千里传信”?

目录 背景 从信使到电报&#xff0c;我们怎么做到“千里传书”&#xff1f; 理解继电器&#xff0c;给跑不动的信号续一秒 小结 背景 所有最终执行的程序其实都是使用“0”和“1”这样的二进制代码来表示的。我们知道&#xff0c;对应的整数和字符串&#xff0c;其实也是用…