按键中断控制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.mzph.cn/news/116878.shtml

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

相关文章

【广州华锐互动】关于物理力学的3D实验实操平台

在科学的广阔领域中,物理力学是一个至关重要的分支,它探索了物体在力作用下的运动规律。然而,传统的物理实验往往需要复杂的设备和大量的操作,这对于学生来说是一项巨大的挑战。为了解决这个问题,广州华锐互动开发了物…

Hadoop3教程(三十五):(生产调优篇)HDFS小文件优化与MR集群简单压测

文章目录 (168)HDFS小文件优化方法(169)MapReduce集群压测参考文献 (168)HDFS小文件优化方法 小文件的弊端,之前也讲过,一是大量占用NameNode的空间,二是会使得寻址速度…

浅谈RabbitMQ的延迟队列

Part 01、 延迟队列是什么 延迟队列代表了一种强大的消息传递机制,允许我们在将消息发送至RabbitMQ时,规定它们只能在未来某个预定的时间点被消费。这种特殊类型的消息被简称为"延迟消息"。 以RabbitMQ为例,它允许我们通过延迟…

聊聊分布式架构10——Zookeeper入门详解

目录 01ZooKeeper的ZAB协议 ZAB协议概念 ZAB协议基本模式 消息广播 崩溃恢复 选举出新的Leader服务器 数据同步 02Zookeeper的核心 ZooKeeper 的核心特点 ZooKeeper 的核心组件 选举算法概述 服务器启动时的Leader选举 服务器运行期间的Leader选举 03ZooKeeper的…

人工智能算法PPT学习

YOLO You only look once 是一种图像识别算法,速度较快。高效、灵活、泛化性能好,在工业中较为受欢迎。 图像金字塔 一幅图像的多个不同分辨率的子图构成的图像集合。是通过一个图像不断的降低采样率产生的,最小的图像可能仅仅有一个像素点…

C# out参数out多个参数

文章目录 C# out参数out多个参数背景说明作用方法定义调用方法测试结果注意 C# out参数out多个参数 背景说明 一个方法返回多个相同数据类型的变量,可以采用数据的方式; 我需要返回多个不同数据类型的方法,在这里采用out多个参数的方式。 …

vue3项目使用TypeIt打字机

官网: TypeIt | The most versatile JavaScript typewriter effect library on the planet. 下载: npm i typeit 使用方法: 正常打字 多行打字机 input输入框实现打字机效果 打字机颜色变化 删除,光标移动,最全面的打字机效果 官网最下面还可以输入你想有的打字效果,然后生…

【文件操作】Java -操作File对象

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ 文件操作 Java - File对象 Java - File对象 Fi…

计算机视觉-数学基础*变换域表示

被研究最多的图像(或任何序列数据)变换域表示是通过傅 里叶分析 。所谓的傅里叶表示就是使用 正弦函数的线性组合来表示信号。对于一个给定的图像I(n1,n2) ,可以用如下方式分解它(即逆傅里叶变换): 其中&a…

【lesson14】进程控制之进程等待

文章目录 为什么要有进程等待?如何等待和什么是等待? 为什么要有进程等待? 1.子进程退出,父进程不管子进程,子进程就要处于僵尸状态------会导致内存泄漏 2.父进程创建子进程是要让子进程办事的,那么子进…

【Tensorflow 2.12 简单智能商城商品推荐系统搭建】

Tensorflow 2.12 简单智能商城商品推荐系统搭建 前言架构数据召回排序部署调用结尾 前言 基于 Tensorflow 2.12 搭建一个简单的智能商城商品推荐系统demo~ 主要包含6个部分,首先是简单介绍系统架构,接着是训练数据收集、处理,然后是召回模型、…

“深入探讨Java JUC中的ReentrantLock锁:实现多线程同步与并发控制“

简介 1、从Java5开始,Java提供了一种功能更强大的线程同步机制——通过显式定义同步锁对象来实现同步,在这种机制下,同步锁由Lock对象充当。 2、Lock 提供了比synchronized方法和synchronized代码块更广泛的锁定操作,Lock允许实…

arcgis js api FeatureLayer加载时返回数据带*问题

接着这一问题衍生出来的问题 arcgis的MapServer服务查询出来的结果geometry坐标点带*的问题-CSDN博客 个人感觉像是server版本的问题,具体不清楚,pg数据库里面的shape点集合坐标点的精度是8,但是server服务查出来的默认都十几位。所以存在一…

使用CPR库和Python编写程序

以下是一个使用CPR库和Python编写的爬虫程序,用于爬取。此程序使用了proxy的代码。 import requests from cpr import CPR ​ def get_proxy():url "https://www.duoip.cn/get_proxy"headers {"User-Agent": "Mozilla/5.0 (Windows NT …

如何用.bat文件直接安装jar包

大家应该都知道一个maven引入jar包,如果直接把jar包放到目录,这样是没用的,引入还是会失败 这里我们可以创建一个.bat的windows系统文件,写入pom.xml对应的groupid,artifactId,version pom.xml中进入jar包…

RDB.js:适用于 Node.js 和 Typescript 的终极对象关系映射器

RDB.js 是适用于 Node.js 和 Typescript 的终极对象关系映射器,可与 Postgres、MS SQL、MySQL、Sybase SAP 和 SQLite 等流行数据库无缝集成。无论您是使用 TypeScript 还是 JavaScript(包括 CommonJS 和 ECMAScript)构建应用程序&#xff0c…

Ceres 使用笔记

文章目录 Part.I IntroductionChap.I 预备知识Chap.II 概念理解 Part.II 简单使用Chap.I Ceres 中主要函数简介Chap.II 一个简单的实例 Reference Part.I Introduction Ceres 1 是由 Google 开发的开源 C 通用非线性优化库,与 g2o 并列为目前视觉 SLAM 中应用最广泛…

springboot+vue开发的视频弹幕网站动漫网站

springbootvue开发的视频弹幕网站动漫网站 演示视频 https://www.bilibili.com/video/BV1MC4y137Qk/?share_sourcecopy_web&vd_source11344bb73ef9b33550b8202d07ae139b 功能: 前台: 首页(猜你喜欢视频推荐)、轮播图、分类…

28、Flink 的SQL之DROP 、ALTER 、INSERT 、ANALYZE 语句

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…

cookie过大导致request 400 错误研究

问:get请求太长报400的错误,如何解决?生成系统中经常偶现此问题 问:get请求URL的长度是谁限制的? 问:每一个cookie的value的大小还是同域下cookie的个数做的限制? 现象:出现 400 Ba…