入门STM32—外部中断

news2024/11/26 10:19:59

        外部中断的存在使得微控制器能够及时响应外部事件,避免频繁的轮询操作,从而提高系统的实时性、效率和低功耗性能。

1.什么是外部中断?

        外部中断是指微控制器接收到外部引脚的信号变化时触发的中断。STM32F103系列微控制器支持多个外部中断线路(EXTI),每条线路可以与特定的GPIO引脚连接,并配置不同的触发模式(上升沿、下降沿或双边沿)。

 

外部中断的基本组成部分包括:

  1. GPIO引脚:物理引脚,通过配置可以触发中断。
  2. EXTI线路:用于连接GPIO引脚和中断控制器。
  3. NVIC(嵌套向量中断控制器):管理所有中断的优先级和响应

 2.外部中断和按键相结合

         在上一篇按键输入的博客里面,可以看在为了检测到按键的输入,必须要在while循环里面时刻检测IO口电平的变化,那么就存在一种可能,随着程序复杂性的增加,如果你没有检测到电平的变化,那么这次按键就白按了,这显然不是我们想看到的情景,所以我们寻求一种方法在不借助轮询检测的基础上,能够时刻检测到按键的变化,争取不错过每一次心动的感觉

        结合的方法也很简单,如上文所说,外部中断的本质上使检测电平的变化,按键按下也会带来电平的变化,所以确认过眼神,遇上对的人

3.配置步骤

3.1 GPIO初始化

        首先需要将对应的GPIO引脚配置为输入模式,以检测外部信号。以下代码展示了如何初始化PA0引脚为浮空输入模式

void GPIO_Config(void) {
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 使能GPIOA时钟

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;  // 选择PA0引脚
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 配置为浮空输入模式
    GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA的PA0
}

3.2 AFIO配置

        AFIO(Alternate Function I/O)用于将特定的GPIO引脚映射到外部中断线路。以下代码将PA0引脚映射到EXTI0线路,并配置中断触发条件为上升沿触发:

void EXTI_Config(void) {
    EXTI_InitTypeDef EXTI_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); // 使能AFIO时钟
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); // 连接PA0到EXTI线路0

    EXTI_InitStructure.EXTI_Line = EXTI_Line0;  // 选择EXTI线路0
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; // 设置为中断模式
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; // 上升沿触发
    EXTI_InitStructure.EXTI_LineCmd = ENABLE; // 使能EXTI线路
    EXTI_Init(&EXTI_InitStructure); // 初始化EXTI配置
}

3.3 NVIC配置

NVIC负责管理中断的优先级及响应。以下代码展示了如何使能EXTI0中断,并配置其优先级:

void NVIC_Config(void) {
    NVIC_InitTypeDef NVIC_InitStructure;

    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; // 选择EXTI0中断
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00; // 设置抢占优先级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; // 设置响应优先级
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // 使能中断通道
    NVIC_Init(&NVIC_InitStructure); // 初始化NVIC配置
}

3.4 中断处理函数 

 触发中断后,可以在中断处理函数添加需要处理的函数。

void EXTI0_IRQHandler(void) 
{ 
    if (EXTI_GetITStatus(EXTI_Line0) != RESET) 
    { 
        // 这里可以添加中断触发后的处理代码 
        EXTI_ClearITPendingBit(EXTI_Line0); // 清除中断标志 
    } 
}

 4. 响应优先级和抢占优先级

        响应优先级决定了在同一优先级的中断中,哪个中断会被首先响应。它是中断控制器处理同一级别中断请求的顺序。通常,中断优先级是一个数字,较低的数字表示较高的优先级。高响应优先级的中断可以在当前处理中断中继续执行,而低响应优先级的中断可能需要等待。

        抢占优先级决定了当一个中断正在处理中时,另一个优先级更高的中断是否可以打断(抢占)当前正在处理中断。抢占优先级的配置能够帮助处理更紧急的任务,而不被当前的中断所阻塞。高抢占优先级的中断可以中断任何低抢占优先级的中断。低抢占优先级的中断则需要等待高抢占优先级的中断完成后才能被处理。

        所以说抢占优先级,用于决定中断是否可以中断其他中断。响应优先级,用于在同一级别中决定中断的处理顺序。

5. 中断线映射

        在复杂的系统中,可能存在多个外设产生的中断信号。如果没有合理的中断线映射,这些中断信号可能会冲突或覆盖彼此的处理逻辑。中断线映射的目的是为了灵活和有效地管理中断源和响应,确保系统能够按预期运行。不同的外部设备和内部模块可能生成多个中断请求。通过中断线映射,可以将这些中断源映射到不同的中断线,以确保系统可以灵活地管理和处理各种中断。  

      

 6.注意

引脚配置:确保配置的GPIO引脚与EXTI线路正确映射。

中断优先级:合理设置中断优先级,避免优先级冲突。

中断处理:中断服务程序应简短高效,避免长时间占用CPU资源。

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

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

相关文章

破烂行情空仓,换两融深圳融资融券利率最低是多少?4-5%?

最近行情稀烂,持续缩量,已经空仓很久了,刚好趁这个机会换个融资融券账户!现在深圳融资融券利率最低能做到什么水平? 融资融券是什么? 融资融券是股票交易市场上的一种投资方式,也被称为证券信…

python中len是什么

Python len() 方法返回字符串长度。 len()方法语法: len( str ) 返回值: 返回字符串长度。 以下实例展示了len()的使用方法: #!/usr/bin/python str "this is string example....wow!!!"; print "字符串长度: ", len…

Leetcode JAVA刷刷站(69)x的平方根

一、题目概述 二、思路方向 在Java中,计算一个非负整数x的算术平方根,并返回其整数部分,你可以使用二分查找法。这是因为平方根函数是单调递增的,所以我们可以利用二分查找在合理的时间复杂度内找到结果。 三、代码实现 public…

html+css+js网页设计 天猫首页

htmlcssjs网页设计 天猫首页 网页作品代码简单,可使用任意HTML编辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作)。 获取源码 1,访问…

实现el-table 两列多选框且不可同时勾选,可单选,可多选

1.页面实现效果&#xff1a; 审核通过可批量处理&#xff0c;可单选&#xff1b;审核不通过&#xff0c;单选&#xff0c;但两者不可同时勾选☑️ 2.代码如下 <template lang"pug"> .financing-order-tab.table-container.btns(style"margin-bottom: 15p…

Tomcat使用及负载均衡(最全源码安装及配置使用教程)

目录 一 Tomcat概述 1.1 Tomcat 简介 1.2 Tomcat 下载 二 Tomcat 单主机配置 2.1 Tomcat 环境配置 2.2 Tomcat 安装与添加系统启动 2.3 Tomcat 启动与停止 三 Tomcat 配置文件及反向代理 3.1 配置文件详解 3.2 反向代理实现Tomcat部署 四 Memcached安装 4.1 简介 …

Ollama 企业私有化部署大模型最佳解决方案

为什么要私有化部署大模型&#xff1f; 很多企业为了控制成本和减少核心数据外泄的风险&#xff0c;会通过私有化部署大模型&#xff0c;来控制成本和保障企业的数据安全。 说到本地化部署&#xff0c;这时就需要说到Ollama框架了。 Ollama 是什么&#xff1f; Ollama 是一个开…

霸王茶姬小程序任务脚本

霸王茶姬小程序任务脚本 小白操作----仅供学习研究参考 功能&#xff1a; 积分签到 解析 该脚本用于“霸王茶姬小程序”的签到和积分查询操作。通过模拟网络请求登录账号&#xff0c;获取个人信息&#xff0c;执行每日签到&#xff0c;并查询积分情况。支持多账号操作&#…

3.js - 使用着色器实现各种图形

有更多案例&#xff0c;私我 main.js import * as THREE from three import { OrbitControls } from three/examples/jsm/controls/OrbitControls import * as dat from dat.gui import { GUI } from three/examples/jsm/libs/lil-gui.module.min.js// ts-ignore import basi…

一篇初学者入门Python匿名函数与Lambda表达式详细教程

首先要了解了如何定义和使用函数的参数,以及如何从一个函数返回值.这篇文章将深入介绍Python中的“匿名函数”和“Lambda表达式”,这两个概念在实际编程中非常有用 如果你对Python感兴趣的话&#xff0c;可以试试我整理的这一份全套的Python学习资料&#xff0c;【点击这里】免…

数据库表转为库表设计文档

开发完之后&#xff0c;就一大堆文档需要写的&#xff0c;其中就有库表设计文档&#xff0c;所以直接写个接口&#xff0c;直接把库表转为库表设计文档就行&#xff0c;省一大堆时间摸鱼了。直接贴代码。 pom文件引入依赖 <!--引入数据库表结构文档生成器Screw依赖--> &…

《驾驭未来:大型语言模型的理论与实践》—— 探索大模型的奥秘

在这个信息爆炸的时代&#xff0c;人工智能尤其是大型语言模型&#xff08;LLM&#xff09;已经成为推动科技进步的关键力量。无论是科学研究、商业应用还是日常生活&#xff0c;大型语言模型都在不断地改变着我们的世界。对于那些渴望深入了解这一前沿技术的人来说&#xff0c…

JAVA实现单词词频统计-辅助英文考试学习

一、基于GUI的可以自行输入的英文单词词频统计软件

SpingBoot集成kafka发送读取消息

SpingBoot集成kafka开发 kafka的几个常见概念 1、springboot和kafka对应版本&#xff08;重要&#xff09;2、创建springboot项目&#xff0c;引入kafka依赖2.1、生产者EventProducer2.2、消费者EventConsumer2.3、启动生产者的方法SpringBoot01KafkaBaseApplication2.4、appli…

小程序学习day10-自定义组件的data数据、方法、属性,data与properties的关系、自定子组件之数据监听器

39、WXS脚本&#xff08;小程序独有的一套脚本语言&#xff09;&#xff08;续&#xff09; &#xff08;6&#xff09;自定义组件的data数据、方法、属性 1&#xff09;自定义组件的data数据&#xff08;在小程序组件中&#xff0c;用于组件模版渲染的私有数据&#xff09; …

定格精彩瞬间!详解六自由度技术原理及应用

在体育赛事中&#xff0c;观赏各项目的精彩瞬间&#xff0c;欣赏运动员的卓越表现是观众们最为关注的焦点。以体操跳马为例&#xff0c;运动员们全力助跑&#xff0c;然后奋力起跳、腾空&#xff0c;接着精准的推手和转体动作&#xff0c;最后稳稳落地&#xff0c;整个动作行云…

【JAVA CORE_API】Day19 多线程API(2)、多线程并发安全问题、同步

多线程API 进程和线程 进程&#xff1a;进程就像是一个程序在电脑里运行时的一个实例。你可以把它想象成一个独立的小工人&#xff0c;专门负责完成某项任务&#xff08;比如打开浏览器、播放音乐&#xff09;。每个进程都有自己独立的资源&#xff08;比如内存&#xff09;和…

python 可迭代,迭代器,生成器,装饰器

1. 可迭代&#xff08;Iterable&#xff09; 可迭代 是指一个对象可以返回一个迭代器的对象。也就是说&#xff0c;它实现了 __iter__() 方法或 __getitem__() 方法。常见的可迭代对象有列表、元组、字符串、字典和集合。 from collections.abc import Iterablei 100 s &qu…

墙裂推荐!云上机密计算,阿里云上体验了一下海光内存加密和远程认证

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 机密计算目录 前言1、构…

哈希原理实现

本节主要看源代码实现 哈希特点 哈希&#xff08;Hashing&#xff09;是一种将数据映射到固定大小的表中以实现快速查找的数据结构和算法方法。哈希的主要特点包括&#xff1a; 1. 高效的查找、插入和删除 时间复杂度&#xff1a;哈希表通常提供近乎常数时间的查找、插入和…