按键中断控制LED灯亮灭

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;    //引脚4GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOE,&GPIO_InitStruct);GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);   //选择外部中断线 AFIOEXTI_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);   //配置NVICNVIC_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);   //配置NVICNVIC_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 headervoid 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 headervoid 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.rhkb.cn/news/166788.html

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

相关文章

路由器的路由过程

大家好,我叫徐锦桐,个人博客地址为www.xujintong.com。平时记录一下学习计算机过程中获取的知识,还有日常折腾的经验,欢迎大家来访。 路由器是连接不同的局域网的一个设备,它一开始的目的是互联异构网络的。 前言 这里…

阿伐曲泊帕的合并用药方案【医游记】

(图片来源于网络!) 阿伐曲泊帕是一种口服的促血小板生成素受体激动剂,用于治疗择期行诊断性操作或手术的慢性肝病相关血小板减少症的成年患者。本文将介绍阿伐曲泊帕的药理作用和药物相互作用。 药理作用 阿伐曲泊帕可以与人体…

【vSphere 8 自签名证书】企业 CA 签名证书替换 vSphere Machine SSL 证书Ⅱ—— 创建和添加证书模板

目录 博文摘要3. 使用 Microsoft 证书颁发机构创建 Machine SSL 和 Solution User 证书模板3.1 打开 Certificate Template Console3.2 复制模板3.3 修改 Compatibility 选项卡3.4 修改 General 选项卡3.5 修改 Extensions 选项卡3.6 修改 Subject Name 选项卡3.7 确认新模板 4…

粘包和半包问题及解决办法

粘包问题是指数据在传输时,在一条消息中读取到了另一条消息的部分数据,这种现象就叫做粘包。 半包问题是指数据在传输时,接收端只收到了部分数据,而非完整的数据,就叫做半包。 产生粘包和半包问题原因: …

Ubuntu更新镜像源切换

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

SOAR安全事件编排自动化响应-安全运营实战

SOAR是最近几年安全市场上最火热的词汇之一。各个安全产商都先后推出了相应的产品,但大部分都用得不是很理想。SOAR不同与传统的安全设备,买来后实施部署就完事,SOAR是一个安全运营系统,是实现安全运营过程中人、工具、流程的有效…

Map<String, Object> 和 com.fasterxml.jackson.databind.node.ObjectNode区别

Map<String, Object>和com.fasterxml.jackson.databind.node.ObjectNode都可以用来表示一个键值对集合&#xff0c;其中键是字符串&#xff0c;值可以是任何对象。 Map<String, Object>是Java标准库中的一种数据结构&#xff0c;用于存储一组键值对。它是一个接口…

4、Kafka 消费者

5.1 Kafka 消费方式 5.2 Kafka 消费者工作流程 5.2.1 消费者总体工作流程 5.2.2 消费者组原理 Consumer Group&#xff08;CG&#xff09;&#xff1a;消费者组&#xff0c;由多个consumer组成。形成一个消费者组的条件&#xff0c;是所有消费者的groupid相同。 • 消费者组内…

【设计模式】解释器模式

文章目录 1.解释器模式定义2.解释器模式的角色3.解释器模式实战案例3.1.场景说明3.2.结构类图3.3.代码实现 4.解释器模式优缺点5.解释器模式适用场景6.解释器模式总结 主页传送门&#xff1a;&#x1f481; 传送 1.解释器模式定义 解析器模式&#xff08;Interpreter Pattern&a…

网络解析(二)

ICMP 报文有很多的类型,不同的类型有不同的代码。最常用的类型是主动请求为 8,主动请求的应答为 0。 ICMP 相当于网络世界的侦察兵。我讲了两种类型的 ICMP 报文,一种是主动探查的查询报文,一种异常报告的差错报文; ping 使用查询报文,Traceroute 使用差错报文。 IP和…

进程(1)——什么是进程?【linux】

进程&#xff08;1&#xff09;——什么是进程&#xff1f;【linux】 一. 什么是进程&#xff1f;二. 管理进程&#xff1a;2.1 怎么管理&#xff1a;2.2 PCB2.3.1 task_struct2.3.2 组织task_struct&#xff1a; 三.查看进程3.1 ps ajx3.2 ls /proc 四. 父子进程4.1 什么是父子…

数据结构——三路划分(快排优化)

刷Leetcode时遇到的问题&#xff0c;用普通的快排去跑&#xff0c;发现有问题。 普通的Hoare或者其他的快排好像都没有直接解决掉这个问题&#xff0c;当一个数重复出现的时候&#xff0c;用普通的快排效率其实并没有那么高。所以&#xff0c;这也是普通快排的缺点之一。 所以&…

基于SSM的仓库管理系统

基于SSM的仓库管理系统的设计与实现【文末源码】 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringSpringMVCMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 登录界面 管理员界面 员工管理 货物管理 员工界面 摘要 当考虑构建基于…

Git使用入门

一、Git简介 Git 是一个开源的分布式版本控制系统。 Git版本控制的功能为保存不同版本的代码&#xff0c;保存代码的地方叫做仓库。 每个仓库中有多个分支&#xff0c;每个分支上又有很多节点&#xff0c;每个节点代表一个版本&#xff0c;不同的分支可以进行合并&#xff0…

用节点亲和性把 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…

通过小程序实现会议Oa的会议展示以及个人中心

&#x1f3c5;我是默&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《微信小程序 》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c;还是有一定基础的程序员&#xff0c;…

游戏盾如何有效防护DDoS

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

蓝桥杯 (年号字串 C++)

思路&#xff1a; 1、看成10进制转化成26进制 。 2、A表示1、B表示2。以此类推&#xff0c;Z表示26. 代码&#xff1a; #include <iostream> using namespace std; int main() {char str[10]; int sum 2019, n, i 0; while (sum > 0) {str[i] sum % 26 64;sum / …

REDIS命令

常见文件名 Redis-cli使用命令 1、启动Redis2、连接Redis3、停止Redis4、发送命令 1、redis-cli带参数运行&#xff0c;如&#xff1a;2、redis-cli不带参数运行&#xff0c;如&#xff1a;5、测试连通性key操作命令 获取所有键查询键是否存在删除键查询键类型移动键查询key的生…