32单片机——外部中断

STM32F103ZET6的系统中断有10个,外部中断有60个

1、中断的概念

        中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的,中断功能的存在,很大程度上提高了单片机处理外部或内部事件的能力

        eg::你打开火, 烧上一壶水。然后去洗衣服,在洗衣服的过程中,突然听到水壶发出水开的报警声,这时,你停止洗衣服动作,立即去关掉火,然后将开水灌入暖水瓶中,灌完开水后,你又回去继续洗衣服。这个过程中实际上就发生了一次中断

        对于单片机来讲,中断是指CPU在处理某一事件A时,发生了另一事件B,请求CPU迅速去处理(中断发生);CPU暂时停止当前的工作(中断响应),转去处理事件B(中断服务);待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断

2、中断的作用和意义

作用:

        (1)实时控制

                在确定时间内对相应事件作出响应,如:温度监控

        (2)故障处理

                检测到故障,需要第一时间处理,如:电梯门夹人了

        (3)数据传输

                不确定数据何时会来,如:串口数据接收

意义:高效处理紧急查询,不会一直占用CPU资源

3、STM32 GPIO外部中断简图

如下图所示:

4、NVIC 

NVIC全称Nested vectored interrupt controller,嵌套向量中断控制器,属于内核M3/4/7

NVIC支持:256个中断(16内核 + 240外部),支持:256个优先级,允许裁剪!

NVIC相关的寄存器如下:

typedef struct{
  __IOM uint32_t ISER[8U];               /*  中断使能寄存器  */
        uint32_t RESERVED0[24U];
  __IOM uint32_t ICER[8U];               /*  中断除能寄存器   */
        uint32_t RSERVED1[24U];
  __IOM uint32_t ISPR[8U];               /*  中断使能挂起控制寄存器  */
        uint32_t RESERVED2[24U];
  __IOM uint32_t ICPR[8U];               /*  中断解挂控制寄存器  */
        uint32_t RESERVED3[24U];
  __IOM uint32_t IABR[8U];               /*  中断激活标志位寄存器  */
        uint32_t RESERVED4[56U];
  __IOM uint8_t  IP[240U];               /*  中断优先级寄存器  */
        uint32_t RESERVED5[644U];
  __OM  uint32_t STIR;                   /*  软件触发中断寄存器  */
}  NVIC_Type; 

4.1 中断优先级

        STM32 中的中断优先级可以分为:抢占式优先级和响应优先级。响应优先级也称子优先级 , 每个中断源都需要被指定这两种优先级 

(1)抢占优先级:抢占优先级高的中断可以打断正在执行的抢占优先级低的中断

(2)响应优先级:抢占优先级相同,响应优先级高的先执行,但是不能互相打断

(3)当两个或者多个中断的抢占式优先级和响应优先级相同时,那么就遵循自然优先级(硬件优先级)

数值越小,优先级越高抢占、响应和自然优先级都是如此

4.2 NVIC的使用

(1)设置中断分组:

HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_x);        //分组x,x:0~4

不用设置,默认有,在stm32f1xx_hal.c的文件中

(2)设置中断优先级

HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority)

①形参1:中断号

        例如:HAL_NVIC_SetPriority(EXTI0_IRQn,2,0);

        为什么例子中的形参1与声明不同?

        因为IRQn_Type是定义的枚举,EXTI0_IRQn在枚举中

②形参2:抢占优先级,可以选择范围:0到15

③形参3:响应优先级,可以选择范围:0到15

(3)使能中断

HAL_NVIC_EnableIRQ(IRQn_Type IRQn);        //操作ISERx寄存器

5、EXTI

        EXTI是外部中断或事件控制器,包含20个产生事件/中断请求的边沿检测器,即总共:20条EXTI线(F1)

中断和事件的区别:

        中断:要进入NVIC,有相应的中断服务函数,需要CPU处理

        事件:不进入NVIC,仅用于内部硬件自动控制,如:TIM、DMA、ADC

EXTI的主要特征:每条EXTI线都可以单独配置:选择类型(中断或者事件)、触发方式(上升沿,下降沿或者双边沿触发)、支持软件触发、开启/屏蔽、有挂起状态位

5.1 工作原理

从上图可以看到有两条主线,一条是由输入线到NVIC中断控制器,一条是由输入线到脉冲发生器。这就恰恰是EXTI的两大部分功能:产生中断和产生事件

(1)产生中断的线路

        标号①:边沿检测电路,包括边沿检测电路、上升沿触发选择寄存器(EXTI_RTSR)和下降沿触发选择寄存器(EXTI_FTSR)。以输入线作为信号输入端,如果检测到有边沿跳变就输出有效信号‘1’到标号②部分电路,否则输出无效信号‘0’

EXTI_RTSREXTI_FTSR边沿检测电路
00关闭
10有效信号是上升沿
01有效信号是下降沿
11双边沿

        标号②:或门电路,只要输入端有信号‘1’,就会输出‘1’到标号③电路和标号④电路。它的两个信号输入端分别是软件中断事件寄存器(EXTI_SWIER)和边沿检测电路的输入信号

        标号③:与门电路,输入都为‘1’才输出‘1’。它的两个信号输入端分别是中断屏蔽寄存器(EXTI_IMR)和标号②电路输出信号,如果EXTI_IMR设置为0时,不管从标号②电路输出的信号特性如何,最终标号③电路输出的信号都是0;假如EXTI_IMR设置为1时,最终标号③电路输出的信号才由标号②电路输出信号决定。这样子就可以简单控制EXTI_IMR来实现中断的目的,标号④电路输出‘1’就会把请求挂起寄存器(EXTI_PR)对应位置1

(2)产生事件的线路

产生事件线路是从标号2之后与中断线路有所不用,之前的线路都是共用的

        标号④:与门电路。输入端来自标号②电路以及事件屏蔽寄存器(EXTI_EMR)。如果EXTI_EMR寄存器设置为0,那不管标号②电路输出的信号是‘0’还是‘1’,最终标号④输出的是‘0’; 如果EXTI_EMR寄存器设置为1,最终标号④电路输出信号就由标号②电路输出的信号决定。通过控制EXTI_EMR来实现是否产生事件

        标号④电路输出有效信号‘1’就会使脉冲发生器电路产生一个脉冲,而无效信号就不会使其产生脉冲信号。脉冲信号产生可以给其他外设电路使用,例如定时器,模拟数字转换器等 

(3)产生中断线路和产生事件线路的目的

        产生中断线路目的使把输入信号输入到NVIC,进一步运行中断服务函数,实现功能

        产生事件线路目的是传输一个脉冲信号给其他外设使用,属于硬件级功能

5.2 EXTI的HAL库设置步骤(外部中断)

(1)使能GPIO时钟:__HAL_RCC_GPIOx_CLK_ENABLE();(x:A~E
(2)配置GPIO/AFIO/EXTI:HAL_GPIO_Init(GPIO_TypeDef  *GPIOx, GPIO_InitTypeDef *GPIO_Init);
(3)设置中断分组:HAL_NVIC_SetPriorityGrouping
(4)设置中断优先级:HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority)
(5)使能中断:HAL_NVIC_EnableIRQ(IRQn_Type IRQn)

例子:exit初始化

void exit_init(void){
    GPIO_InitTypeDef g_exti_struct;
    //一、外部中断--HAL库配置
    //1、使能时钟
    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_GPIOE_CLK_ENABLE();
    //2、配置GPIO/AFIO/EXTI
        //初始化KEY_UP
    g_exti_struct.Pin=GPIO_PIN_0;
    g_exti_struct.Mode=GPIO_MODE_IT_RISING;  //上升沿触发
    g_exti_struct.Pull=GPIO_PULLDOWN;  //下拉
    g_exti_struct.Speed=GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOA,&g_exti_struct);
        //初始化KEY0
    g_exti_struct.Pin=GPIO_PIN_4;
    g_exti_struct.Mode=GPIO_MODE_IT_FALLING;  //下降沿触发
    g_exti_struct.Pull=GPIO_PULLUP;  //上拉
    HAL_GPIO_Init(GPIOE,&g_exti_struct);
        //初始化KEY1
    g_exti_struct.Pin=GPIO_PIN_3;
    g_exti_struct.Mode=GPIO_MODE_IT_FALLING;  //下降沿触发
    g_exti_struct.Pull=GPIO_PULLUP;  //上拉
    HAL_GPIO_Init(GPIOE,&g_exti_struct);
    //3、设置优先级分组--不用设置,默认(main.c-->HAL_Init()下)有
    //4、设置优先级
    HAL_NVIC_SetPriority(EXTI0_IRQn,2,0);  //抢占优先级:2,响应优先级:0
    HAL_NVIC_SetPriority(EXTI4_IRQn,2,0);  //抢占优先级:2,响应优先级:0
    HAL_NVIC_SetPriority(EXTI3_IRQn,2,0);  //抢占优先级:2,响应优先级:0
    //5、使能中断
    HAL_NVIC_EnableIRQ(EXTI0_IRQn);
    HAL_NVIC_EnableIRQ(EXTI4_IRQn);
    HAL_NVIC_EnableIRQ(EXTI3_IRQn);
}

5.3 中断服务处理机制

(1)中断服务函数:在启动文件中已经定义过了

(2)要调用中断公共处理函数

(3)中断回调函数:在这里编写中断处理的逻辑代码

例子:与5.2的例子是一体的

//二、中断服务处理机制
//1、中断服务函数:在启动文件中已经定义过了
    //KEY_UP
void EXTI0_IRQHandler(){
    //2、要调用中断公共处理函数
    HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);  //中断公共处理函数
    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0);  //清中断
}
    //KEY0
void EXTI4_IRQHandler(){
    HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4);  //中断公共处理函数
    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_4);  //清中断
}
    //KEY1
void EXTI3_IRQHandler(){
    HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);  //中断公共处理函数
    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_3);  //清中断
}
//3、中断回调函数:在这里编写中断处理的逻辑代码
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){  //弱函数
    //消抖
    delay_ms(10);
    //判断
    if(GPIO_Pin==GPIO_PIN_0){
        //KEY_UP  控制LED0翻转
        HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);
    }else if(GPIO_Pin==GPIO_PIN_4){
        //KEY0  控制 LED1翻转
        HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_5);
    }else if(GPIO_Pin==GPIO_PIN_3){
        //KEY1  控制KEEP翻转
        HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);
    }
}

EXTI0_IRQHandler定义在启动文件中,来源于startup_stm32f103xe.s第84行的DCD     EXTI0_IRQHandler           ; EXTI Line 0

HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin) ;        //为中断通用入口函数

作用:通过入口参数GPIO_Pin判断中断来自哪个IO口

#define __HAL_GPIO_EXTI_CLEAR_IT(__EXTI_LINE__) (EXTI->PR = (__EXTI_LINE__))

__HAL_GPIO_EXTI_CLEAR_IT定义在stm32f1xx_hal_gpio.h文件中,清中断

__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)        //用__weak修饰的函数是弱函数,用户可以重新定义
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(GPIO_Pin);
  /* NOTE: This function Should not be modified, when the callback is needed,
           the HAL_GPIO_EXTI_Callback could be implemented in the user file
   */
}        

HAL_GPIO_EXTI_Callback定义在stm32f1xx_hal_gpio.c文件中

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

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

相关文章

UG NX二次开发(C#)-获取具有相同属性名称的体对象

文章目录 1、前言2、在UG NX中的属性的赋予3、通过UG NX二次开发获取相同属性的体对象1、前言 UG NX中每个对象都可以属于属性的,包括体、面、边、特征、基准等。在QQ群中有个群有提出一个问题,就是获取相同属性的体对象,然后将这个体对象导出到一个part文件中。我们今天先…

手动实现legend 与 echarts图交互 通过元素和js事件实现图标某项的高亮 显示与隐藏

通过html实现legend的样式 提供调用echarts的api实现与echarts图表交互的效果 实现饼图element实现类似于legend与echartstu表交互效果 效果图 配置代码 <template><div style"height: 400px; width: 500px;background-color: #CCC;"><v-chart:opti…

SpringBoot与BookKeeper整合,实现金融级别的日志存储系统

BookKeeper的优势 高吞吐量和低延迟 分布式架构: Apache BookKeeper采用分布式的架构设计&#xff0c;能够支持高并发的写入和读取操作。 批量写入: 支持批量写入日志条目&#xff0c;显著提高写入效率。 异步I/O: 使用异步I/O操作&#xff0c;减少等待时间&#xff0c;提升…

【Bug】 [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed

当你在进行深度学习相关操作时&#xff0c;若因缺少本地的 CA 证书而无法下载资源&#xff0c;下面为你介绍几种解决办法&#xff1a; 方法一&#xff1a;更新 CA 证书 在大多数 Linux 发行版中&#xff0c;你可以使用包管理器来更新 CA 证书。例如&#xff0c;在基于 Debian…

Vue3中AbortController取消请求的用法详解

在 Vue3 中&#xff0c;AbortController 用于取消 fetch 请求&#xff0c;避免组件卸载后仍执行异步操作导致的潜在问题&#xff08;如内存泄漏或更新已销毁组件的状态&#xff09;。以下是详细用法和最佳实践&#xff1a; 一、基本用法 创建 AbortController 实例 在组件 setu…

【刷题Day26】Linux命令、分段分页和中断(浅)

说下你常用的 Linux 命令&#xff1f; 文件与目录操作&#xff1a; ls&#xff1a;列出当前目录的文件和子目录&#xff0c;常用参数如-l&#xff08;详细信息&#xff09;、-a&#xff08;包括隐藏文件&#xff09;cd&#xff1a;切换目录&#xff0c;用于在文件系统中导航m…

Spring Boot 参考文档导航手册

&#x1f4da; Spring Boot 参考文档导航手册 &#x1f5fa;️ ✨ 新手入门 &#x1f476; 1️⃣ &#x1f4d6; 基础入门&#xff1a;概述文档 | 环境要求 | 安装指南 2️⃣ &#x1f527; 实操教程&#xff1a;上篇 | 下篇 3️⃣ &#x1f680; 示例运行&#xff1a;基础篇 …

卷积神经网络(CNN)详细教程

卷积神经网络&#xff08;CNN&#xff09;详细教程 一、引言 卷积神经网络&#xff08;Convolutional Neural Networks, CNN&#xff09;是一种深度学习模型&#xff0c;广泛应用于图像识别、视频分析、自然语言处理等领域。CNN通过模拟人类视觉系统的层次结构&#xff0c;能够…

解决SSLError: [SSL: DECRYPTION_FAILED_OR_BAD_RECORD_MAC] decryption faile的问题

问题描述&#xff1a; 在pip安装第三方库时&#xff0c;出现SSL的问题。 传输层安全性协议&#xff08;TLS&#xff09;及其前身安全套接层&#xff08;SSL&#xff09;是现在的 HTTPS 协议中的一种安全协议&#xff0c;目的是为互联网通信提供安全及数据完整性保障。而较新版…

SpringBoot程序的创建以及特点,配置文件,LogBack记录日志,配置过滤器、拦截器、全局异常

目录 一、创建一个SpringBoot程序 二、SpringBoot的特点 ①主要特点 ②其他特点 ③热部署 启动热部署 关闭热部署 三、SpringBoot的配置文件 ①SpringBoot三种配置文件的格式&#xff08;以设置端口号为例&#xff09;&#xff1a; ②配置文件的优先级 ③常见配置项 1…

i18n-ai-translate开源程序,可以使用DeepSeek等模型将您的 i18nJSON翻译成任何语言

一、软件介绍 文末提供程序和源码下载 i18n-ai-translate开源程序使用 DeepSeek等模型可以将您的 i18n JSON 翻译成任何语言。 无缝翻译本地化文件。支持嵌套翻译文件的目录。需要i18next样式的JSON 文件&#xff08;文末一并提供下载&#xff09;。 二、模式 CSV 模式 三个…

Flask + ajax上传文件(一)--单文件上传

一、概述 本教程将教你如何使用Flask后端和AJAX前端实现文件上传功能,包含完整的代码实现和详细解释。 二、环境准备 1. 所需工具和库 Python 3.xFlask框架jQuery库Bootstrap(可选,用于美化界面)2. 安装Flask pip install flask三、项目结构 upload_project/ ├── a…

如何在 Postman 中,自动获取 Token 并将其赋值到环境变量

在 Postman 中&#xff0c;你可以通过 预请求脚本&#xff08;Pre-request Script&#xff09; 和 测试脚本&#xff08;Tests&#xff09; 实现自动获取 Token 并将其赋值到环境变量&#xff0c;下面是完整的操作步骤&#xff1a; ✅ 一、创建获取 Token 的请求 通常这个请求…

北斗导航 | 基于Transformer+LSTM+激光雷达的接收机自主完好性监测算法研究

基于Transformer+LSTM+激光雷达的接收机自主完好性监测算法研究 接收机自主完好性监测(RAIM)是保障全球导航卫星系统(GNSS)定位可靠性的核心技术。传统RAIM算法依赖最小二乘残差法,存在故障漏检、对复杂环境适应性差等问题。结合Transformer、LSTM与激光雷达的多模态融合…

基于Python爬虫的豆瓣电影信息爬取(可以根据选择电影编号得到需要的电影信息)

# 豆瓣电影信息爬虫(展示效果如下图所示:) 这是一个功能强大的豆瓣电影信息爬虫程序,可以获取豆瓣电影 Top 250 的详细信息。 ## 功能特点 - 自动爬取豆瓣电影 Top 250 的所有电影信息 - 支持分页获取,每页 25 部电影,共 10 页 - 获取每部电影的详细信息,包括: - 标题…

Ubuntu22.04/24.04 P104-100 安装驱动和 CUDA Toolkit

硬件环境 使用一块技嘉 B85m-DS3H 安装 P104-100, CPU是带集成显卡的i5-4690. 先在BIOS中设置好显示设备优先使用集成显卡(IGX). 然后安装P104-100开机. 登入Ubuntu 后查看硬件信息, 检查P104-100是否已经被检测到 # PCI设备 lspci -v | grep -i nvidia lspci | grep NVIDIA …

东南亚与中东小游戏市场出海调研报告

东南亚与中东小游戏市场出海调研报告 目标市场筛选与概况 (The Gaming Market in Southeast Asia (SEA) | Allcorrect)图:2018–2027年东南亚主要国家游戏市场收入(亿美元)趋势。到2024年东南亚游戏市场规模预计将接近300亿美元 (2024年东南亚手游市场怎么样? - 快出海问…

力扣4-最长公共前缀

一.题目 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 ""。 示例 1&#xff1a; 输入&#xff1a;strs ["flower","flow","flight"] 输出&#xff1a;"fl"示例 2&…

设计模式和单一原则笔记

单一原则&#xff1a;方法 对象 策略模式&#xff1a;方法实现 // 策略接口&#xff08;单一职责&#xff1a;定义计算规范&#xff09; public interface PriceStrategy {boolean match(String type); // 职责1&#xff1a;判断是否适用该策略double calculate(double pric…

常见正则表达式整理与Java使用正则表达式的例子

一、常见正则表达式整理 1. 基础验证类 邮箱地址 ^[a-zA-Z0-9._%-][a-zA-Z0-9.-]\\.[a-zA-Z]{2,}$ &#xff08;匹配如 userexample.com&#xff09;手机号 ^1[3-9]\\\\d{9}$ &#xff08;匹配国内11位手机号&#xff0c;如 13812345678&#xff09;中文字符 ^[\u4e00-\u9fa5…