【STM32】基础知识 第十三课 中断

news2024/12/1 0:40:00

【STM32】基础知识 第十三课 中断

  • 概述
  • 中断是什么
  • 中断的作用 & 意义
  • STM32 中断体系
    • NVIC
    • 中断向量表
    • STM32 中断优先级基本概念
  • STM32 外部中断器 (EXTI)
    • EXTI 简介
    • EXTI 配置
  • AFIO
    • AFIO 与中断
  • 案例

概述

今天小白我将带领大家详细介绍 STM32 单片机中的中断处理机制, 包括中断的基本概念, 配置和使用方法. 中断在嵌入式系统中扮演着重要角色, 使系统能够快速响应外部事件, 提高系统的实时性和效率.

STM32 中断

中断是什么

中断 (Interrupt) 是单片机和其他嵌入式系统中的一种重要机制, 用于在发生特定事件时通知处理器. 中断使得可以由外部事件 (如按键按下, 定时器溢出等) 触发, 也可以由软件生成.

中断的作用 & 意义

  1. 提高实时性: 中断允许单片机在特定事件发生时立即响应, 而无需持续轮询状态. 这大大提高了系统的实时性, 确保及时处理外部事件和设备请求
  2. 降低资源占用, 通过使用中断, 单片机可以在需要时才处理指定任务, 而不是持续检查设备和输入状态, 这降低了系统资源的占用. 使单片机能够更有效地执行其他任务
  3. 简化程序结构: 中断使得开发者能够将事件处理逻辑分离, 编写简单, 清晰的代码. 这有助于提高程序的可维护性和可读性
  4. 支持多任务处理: 中断机制使得单片机能够在同一事件处理多个任务. 通过合理分配中断优先级, 可以确保紧急任务优先执行, 提高系统的整体效率
  5. 动态事件响应:中断可以根据事件发生的条件动态地执行不同的处理函数. 这使得系统能够根据实际需求灵活地响应时间, 提高系统的适应性和鲁棒性
  6. 省电优势: 当没有外部事件发生时, 单片机可以进入低功耗模式, 降低功耗. 当时间发生时, 中断机制能够立即唤醒单片机进行处理. 这在许多低功耗应用场景中具有显著优势
  7. 平衡性能和功耗:通过合理配置中断, 开发者可以在系统性能和功耗之间实现平衡. 这对于需要在有限资源下实现高性能运算的嵌入式系统尤为重要

STM32 中断体系

STM32 单片机基于 ARM Cortex-M 内核, 具有高度可配置的中断控制器 (NVIC, Nested Vectored Interrupt Controller). NVIC 支持多达 240 个中断源. 包括外部中断 (如 GPIO 中断, 定时器中断, 通信接口中断等.

STM32 信号内核中断外部中断中断优先级
STM32F103xx106016
STM32F407xx108216
STM32F429xx109116
STM32F750xx109816
STM32F767xx1011016
STM32H743xx1015016
STM32H750xx1015016

NVIC

NVIC (Nested Vectored Interrupt Controller), 嵌套向量中断控制器. NVIC 是 ARM Cortex-M 系列单片机中的一种高级中断控制器.

STM32 NVIC

NVIC 的一些基本概念:

  1. 中断向量: 在 NVIC 中, 每个中断源都与一个中断向量相关联. 中断向量是一个指向中断处理函数的指针, 当对应的中断事件发生时, 处理器会根据中断向量跳转到相应的重案处理函数执行
  2. 中断优先级: NVIC 支持为每个中断源设置优先级, 优先级搞的中断将优先于优先级低的中断执行. 我们可以根据任务的紧急程度来安排中断的执行顺序, 提高系统的实时性和效率
  3. 嵌套中断处理器: NVIC 支持嵌套中断处理器, 即在处理一个中断时, 如果发生了优先级更高的中断, 处理器会暂停当前中断处理, 先去处理优先级更高的中断. 这有助于确保紧急任务能够及时处理
  4. 电源管理, NVIC 具有一定的电源管理功能. 可以在没有中断发生时使处理器进入低功耗模式, 节省能源. 当中断事件发生时, NVIC 将唤醒处理器进行处理

中断向量表

中断向量表 (Interrupt Vector Table) 是一种数据结构, 用于存储中断处理函数的地址信息. 在单片机中, 每个中断源都与中断向量表中的一个条目相关联. 当中断事件发生时, 单片机控制器会根据中断向量表中的信息转跳到相应的中断处理函数执行.

中断向量表的相关概念:

  1. 向量条目: 中断向量表中的每个条目都包含一个指向中断处理函数的指针. 不同的中断源对应不同的条目, 其顺序通常由硬件决定
  2. 表的起始地址: 中断向量表通常位于固定的内存地址. 例如在 ARM Cortex-M 系列微控制器中, 中断向量表的启示地址为 0x0000 0000. 我们需要根据具体的单片机和编译器设置中断向量表的位置
  3. 异常处理和中断处理: 在 ARM Cortex-M 单片机中, 中断向量表包括异常向量和中断向量. 异常向量处理诸如复位, 非法指令等异常情况, 通常位于中断向量表的前部. 中断向量则处理来自外部设备或内部模块的中断事件
  4. 中断向量表的初始化: 在系统启动时, 单片机会初始化中断向量表, 将中断处理函数的地址加载到对应的向量条目中. 这通常由启动代码 (Bootloader) 或编译器生成的初始化代码完成
  5. 动态修改: 在某些情况下, 我们可能需要在运行时动态修改中断向量表. 例如, 在使用实时操作系统 (RTOS) 时, 开发者可能需要修改中断处理函数以实现任务切换. 这需要特殊的编程技巧和对单片机内存结构的深入了解

NVIC 相关寄存器介绍:

NVIC 相关寄存器位数寄存器个数备注
中断使能寄存器 (ISER)328每个位控制一个中断
中断失能寄存器 (ICER)328每个位控制一个中断
应用程序中断及复位控制器 (AIRCR)321位[10:8] 控制优先级分组
中断优先级寄存器 (IPR)82408 个位对应一个中断, 而 STM32 只使用高 4 位

STM32 中断优先级基本概念

  1. 抢占优先级 (pre): 高抢占优先级可以打断正在执行的低抢占优先级中断
  2. 响应优先级 (sub): 当抢占优先级相同时, 响应优先级高的先执行, 但是不能互相打断
  3. 抢占和响应都相同的情况下, 自然优先级越高的, 先执行
  4. 自然优先级: 中断向量表的优先级
  5. 数值越小, 表示优先级越高

例子:

编号自然优先级对应外设抢占响应
310RTC21
613EXIT030
714EXIT20
-16Systick30

STM32 外部中断器 (EXTI)

在单片机中, 外部中断 (EXTI, External Interrupt/Event Controller) 是一种重要的硬件属性. EXTI 使单片机能够对外部事件做出快速响应.

STM32 外部中断器 EXTI

EXTI 简介

在 STM32 单片机中, EXTI 是一种特殊的中断来源, 可以通过外部引脚触发, 或者通过软件生成. 每个 EXTI 线路都可以独立配置为上升沿触发, 下降沿触发或者双边沿触发. 此外, EXTI 还支持事件生成, 既不产生中断, 但能触发 DMA 请求.

中断和事件:

  • 中断: 要进入 NVIC, 有相应的中断服务函数, 需要 CPU 处理
  • 事件: 不进入 NVIC, 仅用于内部硬件自动控制的, 如: TIM, DMA

EXTI 配置

配置 STM32 的 EXTI 通常需要以下步骤:

  1. 配置 PGIO 引脚: 首先, 我们需要将 GPIO 引脚配置为输入, 并选择合适的上拉 / 下拉设置
  2. 配置 EXTI 线路: 然后, 我们需要选择 GPIO 引脚对应的 EXTI 线路, 并设置触发条件 (上升沿, 下降沿或双边沿)
  3. 配置 NVIC: 为了处理 EXTI 中断, 我们需要, 我们需要在 NVIC 中启动对应的中断, 并设置优先级
  4. 编写中断处理函数: 最后, 我们需要编写对应的中断处理函数, 并在该函数中清除中断标志

EXTI 的 HAL 库设置步骤:

  1. 使能 GPIO 时钟, 使用 __HAL_RCC_GPIOx_CLK_ENABLE
  2. GPIO/AFIO(SYSCFG)/EXTI, 使用 HAL_GPIO_Init, 一步到位
  3. 设置中断分组, 使用 HAL_NVIC_SetPriorityGrouping, 此函数仅需设置一次
  4. 设置中断优先级: HAL_NVIC_SetPriority
  5. 使能中断, 使用 HAL_NVIC_EnableRQ
  6. 设计中断服务函数, 编写 EXTIx_IRQHandler, 中断服务函数 清空中断标识

AFIO

在 STM32 单片机中, AFIO (Alternate Function I/O) 模块是一个重要的硬件模块, 负责管理 STM32 的多功能引脚.

AFIO 与中断

在 STM32 单片机中, AFIO (Alternate Function I/O) 模块不仅负责管理多功能引脚, 也负责配置外部中断线 EXTI (External Interrupt/Event Controller) 的源. 举个例子, 每个外部中断线可以由多个 GPIO 引脚之一触发, 选择哪个 GPIO 引脚取决于 AFIO 模块的配置.

STM32 的外部中断源与 GPIO 引脚的关联是固定的. 例如 EXTI0 可以由任何一组 Px0 引脚触发. AFIO 模块的 EXTI 配置寄存器 (AAFIO_EXTICR)决定了具体由哪一个 GPIO 引脚触发对应的中断.

案例

#include "./stm32f1xx_it.h"
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/BEEP/beep.h"
#include "./BSP/EXTI/exti.h"


int main(void)
{
    HAL_Init();                            /* 初始化HAL库 */
    sys_stm32_clock_init(RCC_PLL_MUL9);    /* 设置时钟, 72Mhz */
    delay_init(72);                        /* 延时初始化 */
    usart_init(115200);                    /* 串口初始化为115200 */
    led_init();                            /* 初始化LED */
    beep_init();                           /* 初始化蜂鸣器 */
    extix_init();                          /* 初始化外部中断输入 */
    LED0(0);                               /* 先点亮红灯 */

    while (1)
    {
        printf("OK\r\n");
        delay_ms(1000);
    }
}

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

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

相关文章

Python每日一练(20230514) 不同路径 I\II\III UniquePaths

目录 1. 不同路径 I Unique Paths 1 2. 不同路径 II Unique Paths 2 3. 不同路径 III Unique Paths 3 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 不同路径 I Unique Paths 1 一个…

Java每日一练(20230514) 滑动窗、最大子序和、转罗马数字

目录 1. 滑动窗口最大值 🌟🌟 2. 最大子序和 🌟 3. 整数转罗马数字 🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1.…

C/C++每日一练(20230514) 全排列、分数转小数、排序链表去重II

目录 1. 全排列 🌟🌟 2. 分数到小数 🌟🌟 3. 删除排序链表中的重复元素 II 🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Ja…

【C++】unordered_map与unordered_set(系列关联式容器)

文章目录 1.unordered系列关联式容器2. unordered_map3.unordered_set 1.unordered系列关联式容器 在C98中,STL提供了底层为红黑树结构的一系列关联式容器,如map和set,它们在查询时效率可达logN,即最差情况下需要比较红黑树的高度…

【UnavailableInvalidChannel: The channel is not accessible or is invalid.】

Collecting package metadata (current_repodata.json): failedUnavailableInvalidChannel: The channel is not accessible or is invalid.channel name: simplechannel url: http://pypi.douban.com/simpleerror code: 404.condarc以点开头,一般表示 conda 应用程…

前端016_文章管理模块_列表功能

文章管理模块_列表功能 1、需求分析2、Mock模拟接口数据3、Api调用接口4、列表模版6、分页查询7、条件查询1、需求分析 文章管理模块主要进行对文章的增删改查,一篇文章可以选择多个标签。 首先开发模块中的列表功能,包含数据列表、分页、查询。 2、Mock模拟接口数据 请求…

『MySQL 实战 45 讲』14 - count(*) 慢的根本原因

count(*) 慢的根本原因 count(*) 的实现方式 MyISAM 引擎会把一个表的总行数存在了磁盘上InnoDB 引擎需要把数据一行行读出,累计计数 为什么 InnoDB 不跟 MyISAM 一样,也把数字存起来呢 由于多版本并发控制的原因(和快照读有关系&#xf…

APP 兼容性测试是什么?8年测试老鸟告诉你

1、APP 兼容性测试认识 随着 APP 应用范围越来越广,用户群体越来越大,终端设备的型号也越来越多,移动终端碎片化加剧,使得 APP 兼容性测试成为测试质量保障必须要考虑的环节。 APP 兼容性测试通常会考虑:操作系统、厂…

Golang每日一练(leetDay0065)

目录 191. 位1的个数 Nnumber of 1-bits 🌟 192. 统计词频 Word Frequency 🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 191. 位1的个数 Nnum…

《编程思维与实践》1070.复数幂

《编程思维与实践》1070.复数幂 题目 思路 思路比较简单,就是细节比较繁琐: ( a b i ) ( c d i ) ( a c − b d ) ( a d b c ) i (abi)(cdi)(ac-bd)(adbc)i (abi)(cdi)(ac−bd)(adbc)i , 利用该公式分实部和虚部进行计算结果即可. 由于涉及加减和正负号,所以在大整数结构…

MySQL的事务

1、事务的概念 事务是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行。 事务是一个不可分割的工作逻辑单元&#xff…

【python数据分析】Pandas数据载入

🙋‍ 哈喽大家好,本次是python数据分析、挖掘与可视化专栏第五期 ⭐本期内容:Pandas数据载入 🏆系列专栏:Python数据分析、挖掘与可视化 👍“总有一段时光悄悄过去然后永远怀念.” 文章目录 前言一、数据载…

fusion app 网页远程控制app

拥有此网页,即可。远程控制软件里面的公告更新以及其他内容。 网页并无联系方式,请自己摸索。 从此即可摆脱, QQ收藏,微云,讯飞语记的束缚! 使用本程序网站放再多的内容都不会乱码! FA2和1都可…

代码随想录算法训练营第四天|24. 两两交换链表中的节点 、19.删除链表的倒数第N个节点 、面试题 02.07. 链表相交 、142.环形链表II

两两交换链表中的节点 题目链接:力扣 解题思路:虚拟头节点,然后进行模拟即可。 我拿到这道题的时候,其实交换的思路是有的,但是首先没有设虚拟节点,这使得我的解答很乱,有很多if条件判断。其次…

Eclipse中如何使用:Maven、Git、GitHub、码云

第1章 在Eclipse 中使用 Maven 1.1 安装 Maven 核心程序 1)下载地址:http://maven.apache.org/ 2)检查 JAVA_HOME 环境变量。Maven 是使用 Java 开发的,所以必须知道当前系统环境中 JDK 的安装目录。 即:安装jdk目录中bin目录的上一级目录…

基于ESP32的单通道LoRaWAN网关设计资料介绍-操作模式

资料下载链接》》 介绍 这是在由ESP8266/ESP32 mcu和sx1276无线电组成的平台上实现LoRa网关功能的第6代软件。与旧版本的网关不同,此版本将在单一频率上收听所有可用的扩频因子 (SF)。网关使用 Web 功能(通过 Intranet)启用网关的监控和配置…

桂院导航小程序 云开发项目 二次开发教程

Gitee代码仓库:桂院导航小程序 GitHub代码仓库:GLU-Guide​​​​​​​ 演示视频 桂院校园导航小程序 演示视频 先 假装 大伙都成功安装了云开发项目,并能在 微信开发者工具 和 手机 上正确运行。 接着就是 将项目 改成自己的学校。 代码…

Redis性能测试怎么做?看看字节8年测试工程师写的测试总结

最近测试服务端的时候,接触到了redis,之前也看过,但不系统,借着这次实践,记录一下 01、简介 Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 它通常被称为数据结构…

【Linux】第一个驱动程序,hello world!开启驱动之旅

目录 前言: 一、背景 二、驱动程序编写流程 1.APP打开的文件在内核中如何表示? 2.编写驱动程序的流程 三、hello驱动程序实战 hello_drive.c hello_drive_test.c 最终测试: a.首先编译内核(如果没有编译过&#xff09…

Makefile 与 docker 进行多服务 一次性构建

本机多服务一次性构建背景 本机开发多个服务,每个服务还会互相调用正常情况,开发者需要在本地启动多个服务,并且手动调用想着不使用gitlab ci/cd, 在本机快速通过 makefiledocker-compose 编排多个服务可执行源码在:https://github.com/webws/go-moda/tree/main/example/traci…