94.STM32外部中断

目录

1.什么是 NVIC?

2.NVIC寄存器 

3.中断优先级 

4.NVIC的配置 

设置中断分组​编辑

配置某一个中断的优先级

5.什么是EXTI

6.EXTI和NVIC之间的关系 

7.SYSCFG 的介绍 


1.什么是 NVIC?

        NVIC是一种中断控制器,主要用于处理 ARM Cortex-M 微控制器的中断管理。NVIC 负责处理中断优先级、中断向量表以及中断使能和禁止等任务。

  1. 中断向量表: NVIC 维护了中断向量表,其中包含了中断服务程序的入口地址。当中断发生时,CPU会根据中断号(或中断向量)在中断向量表中查找相应的中断服务程序的入口地址。

  2. 中断优先级: NVIC 允许为每个中断配置优先级。这些优先级决定了中断在系统中的响应顺序。Cortex-M架构中,中断优先级通常是基于位宽的,较低位的值表示较高的优先级。

  3. 嵌套中断: NVIC 支持嵌套中断,即在处理某个中断时,如果发生更高优先级的中断请求,系统可以中断当前中断服务程序,处理更高优先级的中断,然后返回继续处理低优先级的中断。这种特性对于实时系统和复杂任务处理非常有用。

  4. 中断使能和禁止: NVIC 允许对每个中断进行使能和禁止。这使得可以在运行时动态地配置系统中的中断。

  5. 中断状态: NVIC 提供了一些寄存器用于查询和管理中断状态,例如检查某个中断是否处于挂起状态。

  6. 中断控制寄存器: NVIC 通过一系列寄存器(如 NVIC_ISER、NVIC_ICER、NVIC_ISPR、NVIC_ICPR)提供中断的使能、禁止、挂起和清除等功能。

2.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]; /* 中断优先级寄存器(8Bit 位宽) */uint32_t RESERVED5[644U];__OM uint32_t STIR; /* 中断触发中断寄存器 */
} NVIC_Type;

STM32F407 的中断在这些寄存器的控制下有序的执行的。只有了解这些中断寄存器,才能
方便的使用 STM32F407 的中断。下面重点介绍这几个寄存器:

1.ISER[8](Interrupt Set Enable Register):中断使能寄存器
2.ICER[8](Interrupt Clear Enable Registers):中断除能寄存器

3.ISPR[8](Interrupt Set Pending Registers):中断使能挂起控制寄存器,通过置 1,可以将正在进行的中断挂起,而执行同级或更高级别的中断。写 0 是⽆效的。
4.ICPR[8](Interrupt Clear Pending Registers):中断解除挂起控制寄存器

5.IABR[8](Interrupt Active Bit Registers):是⼀个中断激活标志位寄存器组。对应位所代表的中断和 ISER ⼀样,如果为 1,则表示该位所对应的中断正在被执行。这是⼀个只读寄存器,通过它可以知道当前在执行的中断是哪一个。在中断执行完了由硬件自动清零。
6.IP [240](Interrupt Priority Registers):中断优先级控制寄存器组。由240个8bit的寄存器组成,每个可屏蔽中断占用8bit。但我们只用IP[81] - IP[0]这82个。并且,每个中断通道占用的8bit并没有全部使用,而是只用了高4位。

3.中断优先级 

        STM32 中的中断优先级可以分为:抢占式优先级和响应优先级,每个中断源都需要被指定这两种优先级。抢占式优先级和响应优先级的区别:
        抢占优先级:抢占优先级高的中断可以打断正在执行的抢占优先级低的中断。
        响应优先级:抢占优先级相同,响应优先级高的中断不能打断响应优先级低的中断。
        还有一种情况就是当两个或者多个中断的抢占式优先级和响应优先级相同时,那么就遵循
自然优先级,看中断向量表的中断排序,数值越小,优先级越高。
        在 NVIC 中由寄存器 NVIC_IPR0-NVIC_IPR59 共 60 个寄存器控制中断优先级,每个寄存器的每 8 位又分为一组,可以分 4 组,所以就有了 240 组宽度为 8bit 的中断优先级控制寄存器,
原则上每个外部中断可配置的优先级为 0~255,数值越小,优先级越高。但是实际上 M3 /M4
/M7 芯片为了精简设计,只使用了高四位[7:4],低四位取零,这样以至于最多只有 16 级中断嵌
套,即 2^4=16。

        抢占优先级的级别高于响应优先级。而数值越小所代表的优先级就越高。 抢占优先级和响应优先级相同的,按中断号(中断向量表)先后执行。

4.NVIC的配置 

设置中断分组

配置某一个中断的优先级

函数名称:void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);

typedef struct
{uint8_t NVIC_IRQChannel;  //表示要配置的中断通道(或中断号)                  uint8_t NVIC_IRQChannelPreemptionPriority;  //表示中断的抢占优先级。uint8_t NVIC_IRQChannelSubPriority;  //表示中断的响应优先级。      FunctionalState NVIC_IRQChannelCmd; //表示中断通道的使能状态。       
} NVIC_InitTypeDef;

下面是结构体成员的解释:

  1. NVIC_IRQChannel 表示要配置的中断通道(或中断号)。对于 ARM Cortex-M 微控制器,中断通道的编号是硬件定义的,代表不同的中断源。例如,USART1 的中断通道号是 USART1_IRQn

  2. NVIC_IRQChannelPreemptionPriority 表示中断的抢占优先级。中断的抢占优先级决定了在同一时间发生多个中断时,哪个中断可以立即被处理,而哪些需要等待。这是一个 0 到 N-1(N 是抢占优先级位数)的值,值越小表示优先级越高。

  3. NVIC_IRQChannelSubPriority 表示中断的子优先级。在同一抢占优先级组内,子优先级决定了不同中断的响应顺序。这是一个 0 到 N-1(N 是子优先级位数)的值,值越小表示优先级越高。

  4. NVIC_IRQChannelCmd 表示中断通道的使能状态。可以为 ENABLEDISABLE,分别表示使能或禁止相应的中断通道。

5.什么是EXTI

   EXTI 是外部中断(External Interrupt)控制器的缩写,用于处理与外部事件(通常是硬件引脚的状态变化)相关的中断。在 STM32 微控制器中,EXTI 模块与 GPIO 模块一起使用,以便在特定事件(如边沿触发、电平触发等)发生时触发相应的中断。 

初始化函数:void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);EXTI外设的时钟默认是开启的

typedef struct
{uint32_t EXTI_Line;              EXTIMode_TypeDef EXTI_Mode;      EXTITrigger_TypeDef EXTI_Trigger; FunctionalState EXTI_LineCmd;     
}EXTI_InitTypeDef;
  1. EXTI_Line 指定要启用或禁用的外部中断线。这个参数可以是 EXTI_Lines 枚举类型中的任何组合值,表示一个或多个中断线。例如,EXTI_Line0 表示外部中断线0。
  2. EXTI_Mode 指定外部中断线的工作模式。这个参数可以是 EXTIMode_TypeDef 枚举类型的值,表示中断线的触发模式。例如,EXTI_Mode_Interrupt 表示中断模式。
  3. EXTI_Trigger 指定外部中断线的触发方式,即触发信号的边沿。这个参数可以是 EXTITrigger_TypeDef 枚举类型的值,表示中断线触发的方式,如上升沿、下降沿等。
  4. EXTI_LineCmd 指定所选外部中断线的新状态。这个参数可以是 FunctionalState 枚举类型的值,表示中断线的使能或禁止状态,可以是 ENABLEDISABLE

6.EXTI和NVIC之间的关系 

  1. EXTI 模块配置中断线: EXTI 负责配置外部中断线,将外部事件(通常是引脚状态的变化)连接到中断系统。它定义了中断线的触发条件、使能状态等。EXTI 允许你设置哪些引脚上的事件会触发中断,以及中断是由上升沿、下降沿还是上升和下降沿都触发。配置好 EXTI 后,当与之相关联的外部事件发生时,EXTI 会产生中断请求。

  2. NVIC 确定中断优先级: 一旦 EXTI 产生中断请求,中断请求会传递给 NVICNVIC 负责管理所有中断的优先级。在STM32中,中断的优先级是按组管理的,NVIC 允许配置每个中断的优先级。这就是为什么在使用外部中断时,需要通过 NVIC 设置中断的优先级。

  3. 中断处理函数:NVIC 配置好中断优先级后,当外部中断被触发时,NVIC 会根据中断优先级的设定决定是否打断当前正在执行的程序。如果中断被接受,NVIC 会跳转到相应的中断处理函数,该函数是由用户编写的,通常用于处理与中断相关的任务。在中断处理函数中,需要清除相应的中断标志,通常是通过 EXTI_ClearITPendingBit 来完成。

7.SYSCFG 的介绍 

   SYSCFG 是STM32微控制器中的一个系统配置寄存器,用于配置和控制一些系统级别的功能和外设。主要的作用包括配置外部中断线、使能内部的传感器和控制外设的引脚映射。

1.中断线映射: SYSCFG 允许将外部中断线映射到不同的中断通道。在使用外部中断时,需要配置 SYSCFG 以选择相应的中断通道。

SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);
//上述例子将 GPIOA 的引脚0与外部中断线0相关联。 

2.定时器触发映射: 对于某些定时器,SYSCFG 允许配置触发源。例如,可以将外部信号映射到定时器的触发输入。

TIM1_ETR_Config(TIM1_ETRSource_TI1, TIM1_ExtTRGPSC_DIV1, TIM1_ExtTRGPolarity_NonInverted, 0x00);
//上述例子配置了TIM1定时器的触发源。

3.内部传感器使能: SYSCFG 允许使能内部的温度传感器和电压检测器。

SYSCFG_VBATMonitoringCmd(ENABLE);
//上述例子使能了电池电压检测器。

4.BOOT模式配置: SYSCFG 允许配置启动时的引脚状态,以确定系统启动时的模式。

SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM);
//上述例子将内部SRAM映射到系统的起始地址。

 第一步:时钟的使能

  • 1)使能GPIO时钟
  • 2)使能SYSCFG时钟
  • ** EXTI和 NVIC的时钟默认是打开的

第二步:配置GPIO
第三步:配置SYSCFG

  • 配置函数:SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,EXTI_PinSource4);
  • 功能:选择中断引脚

第四步:初始化EXTI

  • 初始化函数:EXTI_Init();

第五步:配置NVIC

  • 1) 设置优先级:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//整个⼯程只设置⼀次
  • 2) 初始化:NVIC_Init();

第六步:编写中断函数

 

#include "stm32f4xx.h"                  // Device headervoid EXTI3_IRQHandler(void){//判断是否有中断if(EXTI_GetITStatus(EXTI_Line3)==SET){GPIO_SetBits(GPIOF,GPIO_Pin_9);GPIO_SetBits(GPIOF,GPIO_Pin_10);EXTI_ClearITPendingBit(EXTI_Line3);}
}
void EXTI4_IRQHandler(void){//判断是否有中断if(EXTI_GetITStatus(EXTI_Line4)==SET){GPIO_ResetBits(GPIOF,GPIO_Pin_9);GPIO_ResetBits(GPIOF,GPIO_Pin_10);EXTI_ClearITPendingBit(EXTI_Line4);}
}int main(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);GPIO_InitTypeDef GPIO_InitTypeDefStruct;GPIO_InitTypeDef GPIO_InitTypeDefStruct1;//初始化按键GPIO_InitTypeDefStruct.GPIO_Mode = GPIO_Mode_IN;//GPIO_InitTypeDefStruct.GPIO_OType = GPIO_OType_PP;GPIO_InitTypeDefStruct.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_3;GPIO_InitTypeDefStruct.GPIO_PuPd = GPIO_PuPd_UP;GPIO_InitTypeDefStruct.GPIO_Speed = GPIO_High_Speed;GPIO_Init(GPIOE,&GPIO_InitTypeDefStruct);//初始化LEDGPIO_InitTypeDefStruct1.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitTypeDefStruct1.GPIO_OType = GPIO_OType_PP;GPIO_InitTypeDefStruct1.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;GPIO_InitTypeDefStruct1.GPIO_PuPd = GPIO_PuPd_UP;GPIO_InitTypeDefStruct1.GPIO_Speed = GPIO_High_Speed;GPIO_Init(GPIOF,&GPIO_InitTypeDefStruct1);//配置SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,EXTI_PinSource3);SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,EXTI_PinSource4);//EXTI_InitTypeDef EXIT_STRUCT;EXIT_STRUCT.EXTI_Line=EXTI_Line4;EXIT_STRUCT.EXTI_Mode=EXTI_Mode_Interrupt;EXIT_STRUCT.EXTI_Trigger=EXTI_Trigger_Falling;EXIT_STRUCT.EXTI_LineCmd=ENABLE;EXTI_Init(&EXIT_STRUCT);EXTI_InitTypeDef EXIT_STRUCT1;EXIT_STRUCT1.EXTI_Line=EXTI_Line3;EXIT_STRUCT1.EXTI_Mode=EXTI_Mode_Interrupt;EXIT_STRUCT1.EXTI_Trigger=EXTI_Trigger_Falling;EXIT_STRUCT1.EXTI_LineCmd=ENABLE;EXTI_Init(&EXIT_STRUCT1);//设置中断分组NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef nvic_struct;nvic_struct.NVIC_IRQChannel=EXTI4_IRQn;nvic_struct.NVIC_IRQChannelPreemptionPriority=0;nvic_struct.NVIC_IRQChannelSubPriority=1;nvic_struct.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&nvic_struct);NVIC_InitTypeDef nvic_struct1;nvic_struct1.NVIC_IRQChannel=EXTI3_IRQn;nvic_struct1.NVIC_IRQChannelPreemptionPriority=1;nvic_struct1.NVIC_IRQChannelSubPriority=2;nvic_struct1.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&nvic_struct1);while(1){EXTI3_IRQHandler();EXTI4_IRQHandler();}
}

 

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

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

相关文章

自动化框架错误排查:本地全通过,pipline上大部分报错

现象: 最近经过一次切环境和验证码部分的代码重构,果不其然,我们的自动化框架就出错了 我在本地修改调试,并在堡垒机上全部跑过 但在pipline上则大部分报错 进一步排查 这么多case报错,而且报错log都一模一样,推断是底层出错 我在堡垒机上使用命令行来跑case,发现与…

时序预测 | Python实现GA-TCN-LSTM遗传算法-时间卷积神经网络-长短期记忆网络时间序列预测

时序预测 | Python实现GA-TCN-LSTM遗传算法-时间卷积神经网络-长短期记忆网络时间序列预测 目录 时序预测 | Python实现GA-TCN-LSTM遗传算法-时间卷积神经网络-长短期记忆网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 使用先进的机器学习技术和优化算法…

【C++ regex】C++正则表达式

文章目录 前言一、正则表达式是什么&#xff1f;二、<regex>库的基础使用2.1 第一个示例2.1 <regex>库的函数详解std::regex_matchstd::regex_searchregex_search 和 regex_match 的区别std::regex_replacestd::regex_iterator 和 std::sregex_iterator&#xff1a…

❀My学习Linux命令小记录(13)❀

目录 ❀My学习Linux命令小记录&#xff08;13&#xff09;❀ 51.su指令 52.sudo指令 53.shutdown指令 54.reboot指令 55.poweroff指令 ❀My学习Linux命令小记录&#xff08;13&#xff09;❀ 51.su指令 功能说明&#xff1a;用于切换当前用户身份到其他用户身份。 &am…

MacBook Pro 安装Nacos【超详细图解】

目录 一、安装Nacos 二、启动nacos 三、进入可视化界面 因项目用到nacos&#xff0c;所以需要装一个&#xff0c;顺便写篇文章记录 一、安装Nacos 前往官网下载&#xff1a;Nacos官网homehttps://nacos.io/zh-cn/ # 解压 unzip nacos-server-2.3.0.zip 二、启动nacos …

怎么测试服务器的访问速度

一个网站的好坏&#xff0c;很大一部分原因是由于网站空间的稳定决定的。现在互联网发展十分迅速&#xff0c;网络宽带速度也非常快&#xff0c;流畅的 网站让用户对网站的打开时间要求也越来越高。如果一个网站它打开时间超过了5秒以上&#xff0c;那么极有可能会让访问用户关…

Collection集合的遍历方式-迭代器,增强for循环,Lambda

集合体系概述 Collection是单列集合的祖宗&#xff0c;它规定的方法&#xff08;功能&#xff09;是全部单列集合都会继承的 public class Work1 {public static void main(String[] args) {//简单认识一下Collection集合的特点ArrayList<String> list new ArrayList&…

【Vue2】Vue的介绍与Vue的第一个实例

文章目录 前言一、为什么要学习Vue二、什么是Vue1.什么是构建用户界面2.什么是渐进式Vue的两种开发方式&#xff1a; 3.什么是框架 三、创建Vue实例四、插值表达式 {{}}1.作用&#xff1a;利用表达式进行插值&#xff0c;渲染到页面中2.语法3.错误用法 五、响应式特性1.什么是响…

mysql中删除数据后,新增数据时id会跳跃,主键自增id不连续

引言&#xff1a; 在使用MySQL数据库时&#xff0c;有时候我们需要删除某些记录&#xff0c;但是删除记录后可能会导致表中的id不再连续排序。 如何实现删除记录后让id重新排序的功能。 如图&#xff1a; 删除数据后&#xff0c;中间的id不会自动连续。 下面有两种方法进行重…

医院绩效系统源码:基础数据管理、核算方法和分配规则、KPI评分公式等功能

医院绩效管理系统源码&#xff0c;医院绩效管理数据采集的自动化和绩效评估数字化 医院绩效管理系统以国家医院绩效管理考核政策法规为依据&#xff0c;结合医院管理实践&#xff0c;以经济管理指标为核心&#xff0c;医疗质量、安全、效率、效益管理为重点&#xff0c;特别强调…

阿里云虚拟机安装nginx容器步骤

1、申请虚拟机&#xff0c;操作系统选择centos 7.6&#xff0c;自带阿里云yum源。 2、安装yum工具 yum install -y yum-utils 3、添加docker 源 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 4、安装docker yum -y insta…

头哥实践平台----HBase 开发:使用Java操作HBase

一.第1关&#xff1a;创建表 1.先写命令行 start-dfs.shstart-hbase.shhadoop fs -ls /hbase(可有可无)2.再写代码文件 package step1;import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; impor…

unity3d模型中缺失animation

在 模型的Rig-Animationtype 设置成Legacy https://tieba.baidu.com/p/2293580178

时间戳,标准时间之间的转化

一. 获取时间戳 方法一&#xff1a;Date.now() console.log(Date.now()) // 1701676212978方法二&#xff1a;Date.parse() Date.parse()将字符串或者时间对象直接转化成时间戳&#xff1a; Date.parse(new Date()) // 1701676571000 Date.parse("2023/12/04 15:53"…

回文串+动态规划

最长回文子串 遍历字符串&#xff0c;逐个判断每个字符&#xff0c;向两边扩散&#xff0c;判断以当前字符为中心&#xff0c;最长回文大小。 /*** ①中心扩散法* 向左 向右 向左右* ②动态规划优化* 空间换时间*/ class Solution {public static void main(String[] args) …

OWASP SAMM 软件保障成熟度模型

软件保障成熟度模型 我们的使命是为您提供一种有效且可衡量的方式来分析和改进您的安全开发生命周期。 SAMM 支持完整的软件生命周期&#xff0c;并且与技术和流程无关。我们构建的 SAMM 本质上是不断发展和风险驱动的&#xff0c;因为没有一种单一的配方适用于所有组织。奥瓦…

【图像拼接】论文精读:Pixel-wise Deep Image Stitching(PWM+SIGMo)

第一次来请先看这篇文章:【图像拼接(Image Stitching)】关于【图像拼接论文精读】专栏的相关说明,包含专栏使用说明、创新思路分享等(不定期更新) 图像拼接系列相关论文精读 Seam Carving for Content-Aware Image ResizingAs-Rigid-As-Possible Shape ManipulationAdap…

【前端】甘特图或日历图

前言 之前不是说了吗?公司文化就是让人来偷懒就偷懒的操作,于是乎就开始开发甘特图,可以让客户的员工以及领导能清晰地看见工作安排和生产排产情况。 技术选型 说实话使用什么技术可以兼容到现有系统里面,毕竟自己手写太浪费时间啦,于是乎就去GitHub上面找,真是尝试了…

JVM——垃圾回收器(G1,JDK9默认为G1垃圾回收器)

1.G1垃圾回收器 JDK9之后默认的垃圾回收器是G1&#xff08;Garbage First&#xff09;垃圾回收器。 Parallel Scavenge关注吞吐量&#xff0c;允许用户设置最大暂停时间 &#xff0c;但是会减少年轻代可用空间的大小。 CMS关注暂停时间&#xff0c;但是吞吐量方面会下降。 而G1…