单片机学习笔记8--按键和外部中断(基于百问网STM32F103系列教程)

本文主要是介绍单片机学习笔记8--按键和外部中断(基于百问网STM32F103系列教程),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第八章 按键和外部中断

第一节 按键原理

GPIO内部上拉较弱,可根据满足电路需求选择是用内部的上拉还是自己外接上拉。

根据原理图可知,当按键松开时,单片机引脚连接在高电平上,GPIO口输入高电平。

在这里插入图片描述

当按键按下时,单片机引脚通过按键接地,GPIO口输入低电平。

在这里插入图片描述

在程序中,通过读取GPIO口的电平状态,就可以知道按键是否被按下。

由于按键是机械弹性开关,由于机械触电的弹性作用,按键在闭合及断开的瞬间均伴随有一连串的抖动。抖动会导致CPU在按键一次动作内发生多次响应,所以要对按键进行消抖处理。

在这里插入图片描述

通常对于按键消抖有两种方法,一种软件消抖,在按键程序中,延时10-20ms左右,等按键状态稳定了再去读取电平;另一种是硬件消抖,在按键两端并联个电容。

第二节 编写程序

2.1 按键轮询

按键轮询的原理就是在循环中,不断读取按键引脚的电平,当读取到低电平的时候,认为按键按下,然后执行操作。

时钟和LED的相关配置之前已经介绍过了,这里不再介绍。

配置按键的GPIO。

在这里插入图片描述

主程序轮询。

在这里插入图片描述

在循环中,先第一次判断按键是否按下,若按键按下,延时10ms(作用是消抖),消抖之后再判断一个按键状态,确认按键是否真的按下了,若读取引脚状态还是低电平,则认为按键是真的被按下了,然后执行操作函数,打开LED。

2.2 外部中断

2.2.1简单介绍

外部中断,从名字上看就是由于外部变化而在单片机内产生的中断。

单片机通过GPIO口接收外部数据,STM32F103的所有GPIO口都可以设置为外部中断模式。

前面介绍过NVIC控制芯片的所有中断,外部中断也不例外,但外部中断不是直接受控于NVIC,而是通过一个外部中断/事件控制器EXTI(External interrupt/event controller)与NVIC相连。而内部中断源比如串口、ADC等是直接和NVIC连接的。

STM32F103共有A-G7组GPIO,每一组有0-15共16个引脚,STM32F103支持19个外部中断/事件请求(互联型系列支持20个),每个GPIO组的相同位置的引脚位于同一个EXTIX(X = 0-15)中,比如所有GPIO的GPIO_PIN_0都在EXTI0中。同一时刻,只能有一个引脚被使能,也就是说加入配置了GPIOA_PIN_0为外部中断/事件,剩余的GPIOB—GPIOG的PIN_0引脚就不能设置为外部中断/事件模式了。

在这里插入图片描述

外部中断线共有20个,除了16个GPIO的,还有四条。

第16条是控制PVD(掉电检测)输出的。

第17条是RTC报警事件中断。

第18条是USB唤醒事件。

第19条是以太网唤醒事件。这个只有在互联型设备上才有。

根据上图从左到右推断可知,要想使能引脚的外部中断,首先要配置GPIO引脚,并设置成AFIO复用功能模式,然后配置EXTI寄存器,然后设置NVIC寄存器配置优先级即可完成外部中断的设置。

在这里插入图片描述

上图中每条线上的19表示这样的线有19条,也就是每个EXTI都有一条这样的线。

2.2.2中断和事件

上图可知,外部中断分为外部中断和外部事件两种情况。

简单的区分就是外部中断是当产生外部中断之后,现象表现在软件方面,产生中断后,程序调用外部中断函数,在中断函数中操作其他任务。外部事件表现在硬件方面,当发生中断后,在硬件上打开其他外设,比如定时器,ADC。这种情况不占用CPU资源。

中断和事件的输入都是一块的,通过引脚输入,首先通过边缘检测电路,判断是上升沿触发还是下降沿,然后通过一个或门输出,若事件屏蔽寄存器输出为1,产生事件,与门2打开,连接脉冲发生器产生脉冲,脉冲发生器在与其他外设连接。整体流程如上图黄色路线。

对于中断而言,当边缘检测电路检测到引脚状态改变了,或者软件中断寄存器置1了,或门输出为1,连接与门1,若中断屏蔽寄存器输出1,则与门1打通,发生中断,中断挂起寄存器中对应中断位就置为1,然后发送给NVIC进行处理中断函数。

2.2.3如何配置

了解了以上流程就知道如何配置外部中断了。

1、设置边缘检测方式,下降沿、上升沿、双边缘。

2、配置软件中断事件寄存器,因为它连接的是或门,所以这个是可选的,不是必须设置的。

3、选择打开中断屏蔽寄存器还是事件屏蔽寄存器。

4、将中断挂起寄存器置位,将信号发送给NVIC。

5、在中断程序里面编写对应程序。若是选择中断事件,则事件发送一个脉冲响应。

2.2.4引脚复用

在介绍GPIO的时候说过,GPIO可以作为简单的输入输出口用,也可以作为一些协议,ADC、DAC等外设的引脚,当GPIO作为后者使用的时候,就是GPIO的复用。

在这里插入图片描述

上图中,绿色就是GPIO的复用功能(Alternate functions),红色是引脚在复位之后的默认功能,就是做为普通的输入输出引脚使用。篮筐中的FT代表的是这个IO口是5V耐压的,也就是他是可以连接5V使用的(正常单片机的工作电压是3.3V)。

在复用功能中,有分为两类,一个是默认功能Default。注意一个引脚的复用功能可以不止一个,可以有多种复用功能。如上图PB14既可以作为PSI2_MISO使用,又可以作为TIM1_CH2使用,还可以作为USART3_RTS使用。

第二种是重映射Remap,他是把有特殊功能的引脚分配给其他引脚。也就是把A引脚的默认复用功能X分配给B引脚,这样B引脚只能使用复用功能X,A引脚只能使用除了X功能之外的其他复用功能。

举个例子,下图PB13引脚,可以把TIN1_CH1N的复用功能重映射给PA7使用,这样PA7只能使用TIM1_CH1N功能,不能使用默认的SPI_MOSI等功能;而PB13引脚的复用功能,不能使用TIM1_CH1N功能,只能使用剩下的三个功能。

在这里插入图片描述

2.3程序代码

2.3.1HAL库函数

GPIO中的关于外部中断的主要函数有两个,他们的作用跟之前中断系统中介绍的是一样的,是在系统默认的中断服务函数中调用的。

HAL_GPIO_EXTI_IRQHandler(GPIO_PIN);``HAL_GPIO_EXTI_Callback(GPIO_Pin);

HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);设置中断函数两个优先级。
HAL_NVIC_EnableIRQ(EXTI0_IRQn);使能具体的外部中断函数。

2.3.2注意事项

较于之前的实验,这里只新增了两部分,设置复用功能和配置EXTI,对于其他的比如时钟配置,LED配置这理解不在讲解了。

在设置引脚复用功能是,只需要把GPIO结构体中的Mode成员的参数选择为具体的复用功能就行,如GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; 设置GPIO的工作模式为下降沿触发的中断复用模式。

GPIO配置完成要配置EXTI。这里要注意,不是每个EXTI都有自己独立的中断函数,在官方的文件中可以看到,只有EXTI0、1、2、3、4的中断函数是单独的,EXTI5—9(共5个)和EXTI10—15(共6个)他们的中断函数是合在一起的,也就是说,EXTI5、6、7、8、9他们发生中断时,程序内执行的中断函数是同一个函数。而EXTI0、1、2、3、4他们每个都有自己的中断函数。
在这里插入图片描述

下图可以看到,对于不同的EXTI,他们的系统中断服务函数也不同,EXTI3有自己的独立函数,而EXTI13和EXTI15只能挤在同一个函数中。

在这里插入图片描述

2.3.4寄存器

对于EXTI的配置,主要的寄存器有两种,中断/事件屏蔽寄存器和触发沿选择寄存器。

中断屏蔽寄存器用到了低20位,分别控制20个EXTI的中断请求,置1则允许中断,否则会将中断屏蔽掉,即使满足中断条件,程序也不会执行中断服务函数。对于事件屏蔽寄存器跟中断屏蔽寄存器是一样的。

在这里插入图片描述

触发沿设置寄存器。

在这里插入图片描述

在这里插入图片描述

这两个是设置选择上升沿触发还是下降沿触发的。

在这里插入图片描述

当发生了选择的边沿事件,该寄存器的对应位置就会置1。相当于一个标志位,像该寄存器写1则清除它。

这篇关于单片机学习笔记8--按键和外部中断(基于百问网STM32F103系列教程)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/298909

相关文章

Maven的使用和配置国内源的保姆级教程

《Maven的使用和配置国内源的保姆级教程》Maven是⼀个项目管理工具,基于POM(ProjectObjectModel,项目对象模型)的概念,Maven可以通过一小段描述信息来管理项目的构建,报告... 目录1. 什么是Maven?2.创建⼀个Maven项目3.Maven 核心功能4.使用Maven H

IDEA自动生成注释模板的配置教程

《IDEA自动生成注释模板的配置教程》本文介绍了如何在IntelliJIDEA中配置类和方法的注释模板,包括自动生成项目名称、包名、日期和时间等内容,以及如何定制参数和返回值的注释格式,需要的朋友可以... 目录项目场景配置方法类注释模板定义类开头的注释步骤类注释效果方法注释模板定义方法开头的注释步骤方法注

Python虚拟环境终极(含PyCharm的使用教程)

《Python虚拟环境终极(含PyCharm的使用教程)》:本文主要介绍Python虚拟环境终极(含PyCharm的使用教程),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录一、为什么需要虚拟环境?二、虚拟环境创建方式对比三、命令行创建虚拟环境(venv)3.1 基础命令3

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

python连接本地SQL server详细图文教程

《python连接本地SQLserver详细图文教程》在数据分析领域,经常需要从数据库中获取数据进行分析和处理,下面:本文主要介绍python连接本地SQLserver的相关资料,文中通过代码... 目录一.设置本地账号1.新建用户2.开启双重验证3,开启TCP/IP本地服务二js.python连接实例1.

Python 安装和配置flask, flask_cors的图文教程

《Python安装和配置flask,flask_cors的图文教程》:本文主要介绍Python安装和配置flask,flask_cors的图文教程,本文通过图文并茂的形式给大家介绍的非常详细,... 目录一.python安装:二,配置环境变量,三:检查Python安装和环境变量,四:安装flask和flas

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Ubuntu中远程连接Mysql数据库的详细图文教程

《Ubuntu中远程连接Mysql数据库的详细图文教程》Ubuntu是一个以桌面应用为主的Linux发行版操作系统,这篇文章主要为大家详细介绍了Ubuntu中远程连接Mysql数据库的详细图文教程,有... 目录1、版本2、检查有没有mysql2.1 查询是否安装了Mysql包2.2 查看Mysql版本2.

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J