入门STM32—外部中断

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

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线路0EXTI_InitStructure.EXTI_Line = EXTI_Line0;  // 选择EXTI线路0EXTI_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.mzph.cn/bicheng/52181.shtml

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

相关文章

鸿蒙(API 12 Beta3版)【DRM会话管理(C/C++)】数字版权保护开发

DRM会话管理(MediaKeySession)支持媒体密钥管理及媒体解密等,MediaKeySession实例由系统管理里的MediaKeySystem实例创建和销毁。 开发步骤 导入NDK接口,接口中提供了DRM相关的属性和方法,导入方法如下。 #include &…

学习嵌入式第二十九天

ipc进程间通信方式 PC,即进程间通信(Inter-Process Communication),是操作系统中不同进程之间交换数据的一种机制。以下是一些常见的IPC方式: 管道:用于父子进程或兄弟进程之间的通信。消息队列&#xff…

selenium-java实现自动登录跳转页面

如果要一直刷新一个网页,总不能人工一直去点,所以想到大学时候学过selenium技术,写个脚本来一直刷新,因为经常写java语言,所以选用java语言来写 实验环境 注意,需要先准备好Google浏览器和Chrome-Driver驱…

ffmpeg6.1集成Plus-OpenGL-Patch滤镜

可参考上一篇文章。ffmpeg6.1集成ffmpeg-gl-transition滤镜-CSDN博客 安装思路大致相同, 因为 Plus-OpenGL-Patch也是基于 ffmpeg 4.x 进行开发的,所以在高版本上安装会有很多报错。 这是我安装后的示例,需要安装教程或者改代码可私信我。 …

记录一次 Redis 优化发送数据(使用管道批量传送)

一 项目背景 此前的项目中,鉴于客户方服务器的安全配置对 MQ 中间件有所限制,我们只得采用 Redis 的 list 作为简易的 MQ 来传送报文数据。然而,近段时间客户关闭了相关端口,导致大量数据积压,需要进行补发。在补发过程…

大数据背景下基于Python的牛油果销售数据可视化分析

注:源码在最后,只是一次实验记录,不合理的地方自行修改。 一 研究背景及意义 21世纪以来,随着科学技术的进步,人们的生活水平也随之大幅提升提高。在科技和经济快速发展下,全球已经进入了大数据时代。大数…

8.21-部署eleme项目

1.设置主从从mysql57服务器 (1)配置主数据库 [rootmsater_5 ~]# systemctl stop firewalld[rootmsater_5 ~]# setenforce 0[rootmsater_5 ~]# systemctl disable firewalldRemoved symlink /etc/systemd/system/multi-user.target.wants/firewalld.serv…

使用 Fyne 构建 GUI 应用:设置标签文本和自增计数器

引言 Fyne 是一个用 Go 语言编写的跨平台 GUI 框架,它提供了一套丰富的组件来帮助开发者快速构建出漂亮的用户界面。在本文中,我们将通过一个简单的案例来演示如何使用 Fyne 创建 GUI 应用程序,该程序包含设置标签文本和自增计数器的功能。 …

「字符串」前缀函数|KMP匹配:规范化next数组 / LeetCode 28(C++)

目录 概述 思路 核心概念:前缀函数 1.前缀函数 2.next数组 1.考研版本 2.竞赛版本 算法过程 构建next数组 匹配过程 复杂度 Code 概述 为什么大家总觉得KMP难?难的根本就不是这个算法本身。 在互联网上你可以见到八十种KMP算法的next数组…

项目1 物流仓库管理系统

一、项目概述 本项目旨在开发一个功能全面的物流仓库管理系统,以数字化手段优化仓库作业流程,提高管理效率。系统集成了前端用户交互界面与后端数据处理逻辑,涵盖了从用户注册登录、订单管理、货单跟踪到用户信息维护等多个核心业务模块。通…

基于django的学生作业提交与管理系统,有管理后台,可作为课设使用

在本项目中,我们设计并实现了一个基于Django框架的学生作业提交与管理系统,旨在为教师和学生提供一个高效、便捷的作业管理平台。Django作为一个高效的Web框架,因其强大的功能和灵活的架构,使得本系统能够快速开发并扩展。 系统功…

Maven的简单使用

Maven使用 Maven的作用1. 自动构建标准化的java项目结构(1) 项目结构① 约定目录结构的意义② 约定大于配置 (2)项目创建坐标坐标的命名方法(约定) 2. 帮助管理java中jar包的依赖(1) 配置使用依赖引入属性配置 (2) maven指令(3) 依赖的范围(4) 依赖传递(…

【密码学】密钥管理:②密钥分配

一、密钥分配的定义 密钥分配是密钥管理生命周期中最重要的部分,密钥分配方案研究的是密码系统中密钥的分发和传送问题。从本质上讲,密钥分配为通信双方建立用于信息加密、解密签名等操作的密钥,以实现保密通信或认证签名等。 (1…

win10蓝牙只能发送,无法接收

给win10升了级,到22H2,蓝牙出了问题 以前接收,就是默认直接就可以接收。现在只能发送,无法接收。 在网上找了很多办法都没奏效,目前的方法是, 每次接收,都要操作一次,而不是自动接…

leetcode-538. 把二叉搜索树转换为累加树

题目描述 给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。 提醒一下,二叉搜索树满足下列约束…

计量自动化终端上行通信规约

物理层 TCP 和 UDP 的传输接口 该类接口的登录链接和心跳检测采用链路测试服务,链路测试周期可设定。 参见 TCP/IP 协议规范。 串行通信传输接口 字节传输按异步方式进行,它包含 8 个数据位、1 个起始位“0”、1 个偶校验位 P 和 1 个停止位“1”。 …

Android Studio 动态表格显示效果

最终效果 一、先定义明细的样式 table_row.xml <?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_h…

集团数字化转型方案(四)

集团数字化转型方案通过全面部署人工智能&#xff08;AI&#xff09;、大数据分析、云计算和物联网&#xff08;IoT&#xff09;技术&#xff0c;创建了一个智能化的企业运营平台&#xff0c;涵盖从业务流程自动化、实时数据监控、精准决策支持&#xff0c;到个性化客户服务和高…

实验七:独立按键实验

硬件电路图和题目; LED1-LD8是 P2口8个管脚 mian.c #include<reg52.h>sbit But1=P3^1 ; sbit But2=P3^0 ; sbit But3=P3^2 ; sbit But4=P3^3 ;sbit LED1 =P2^0 ; sbit LED2 =P2^1 ; sbit LED3 =P2^2 ; sbit LED4 =P2^3 ;#define PRESS_1 1 #define PRESS_…

CUTLASS 中的 47_ampere_gemm_universal_streamk 示例

前一篇文章介绍了 Stream-K: Work-centric Parallel Decomposition for Dense Matrix-Matrix Multiplication on the GPU 论文&#xff0c;下面对其代码实现进行分析。 cutlass 的 examples/47_ampere_gemm_universal_streamk 展示了 GEMM Stream-K 算法在 Ampere 架构上的使用…