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

news/2023/11/30 10:00:39

【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);}
}

https://www.xjx100.cn/news/306155.html

相关文章

ChatGPT自动生成大厨菜谱

大厨菜谱 最近几年,越来越多年轻人也开始尝试自己在家做菜吃饭,而不仅仅是外出就餐或点外卖。有些人可以向长辈讨教做菜心得,有些人则开始尝试从互联网搜索学习菜谱。著名的"下厨房" App,就是针对这个需求应运而生的。…

MATLAB图像处理:图像分割、特征提取和目标识别的应用和优化

MATLAB图像处理:图像分割、特征提取和目标识别的应用和优化 作为一种常用的图像处理工具,MATLAB在图像分割、特征提取和目标识别等方面具有广泛的应用。本文将详细介绍这三个方面的应用和优化。 第一章:图像分割 图像分割是将一幅图像划分成…

前端017_文章管理模块_审核功能

文章管理模块_审核功能 1、审核组件实现的功能2、引用组件3、添加表单渲染模版4、Mock添加查询数据5、Api调用接口回显数据6、获取分类和标签数据6.1、EasyMock 添加数据接口6.2 Api 调用接口7、回显文章所属标签名-多级选择器8、Markdown编辑文章内容8.1、什么是 Markdown8.2、…

Ae 入门系列之十二:三维合成

在 Ae 中,可以将图层设置为 3D 图层并添加动态的摄像机和灯光,从而制作基于三维空间的动画。 ◆ ◆ ◆ 二维与三维 二维 2D 在一个平面上的内容就是二维。只有上下、左右两个方向,没有前后。即,只有面积,没有体积。 …

Linux 网络路由实验

一、实验目标 利用3台虚拟机,搭建vmnet2和vmnet3两个host-only网络,实现两个网络的互联 二、实验环境 三、实验步骤 1、添加VMnet2和VMnet3,并取消其DHCP功能 2、内网虚拟机的设置 (1)解决网卡不一致的问题&#xf…

闪耀的钥匙:PHP 与访问修饰符

文章目录 参考描述访问修饰符访问修饰符PHP 与访问修饰符publicprotectedprivate 继承中的重写规则可见性举个栗子未重写父类的受保护成员前将受保护成员重写为公有成员将受保护成员重写为私有成员 为什么不允许子类成员设置比父类成员更严格的访问限制? final 关键…

Python学习笔记 - 探索五种数据类型

Python作为一门易学且功能强大的编程语言,吸引了众多编程爱好者。在学习Python的过程中,了解其数据类型是十分重要的。这里将向大家介绍Python中的五种常见数据类型,分别是:整数、浮点数、字符串、列表和字典,并且将通…

【Spring事务】Spring事务事件控制,解决业务异步操作

使用背景 在业务中,经常会有这样的需求,在数据库事务提交之后,发送异步消息或者进行其他的事务操作。 例如当用户注册成功之后,发送激活码,如果用户注册后就执行发送激活码,但是在用户保存时出现提交事务…