【STM32】中断与NVIC以外部中断为例

2023-11-06

前言

在stm32中姑且可以认为,异常就是中断

单片机上电之后,首先执行启动文件,开辟堆栈之后,开始初始化中断向量表。

NVIC

NVIC

NVIC是嵌套向量中断控制器,控制着整个芯片中断相关的功能,它跟内核紧密耦合,是内核里面的一个外设。

####三个寄存器ISERICERIP
NVIC 结构体定义,来自固件库头文件:core_cm3.h
在配置中断的时候我们一般只用 ISERICERIP 这三个寄存器,ISER 用来使能中断,ICER 用来失能中断,IP 用来设置中断优先级。
NVIC 结构体定义,来自固件库头文件:core_cm3.h
ISER[8]:Interrupt Set Enable Registers,这是一个中断使能寄存器组。是个u32类型的数组,成员有8个。 CM3、4 内核支持 256 个中断,这里用 8 个 32 位寄存器来控制,每个位控制一个中断。根据单片机生产厂商的设计,不一定会全部使用到。
ICER[8]:全称是:Interrupt Clear Enable Registers,是一个中断除能寄存器组。该寄存器组与 ISER 的作用恰好相反,是用来清除某个中断的使能的。其对应位的功能,也和 ISER 一样。这里要专门设置一个 ICER 来清除中断位,而不是向 ISER 写 0 来清除,是因为 NVIC 的这些寄存器都是写 1 有效的,写 0 是无效的。
IP [240]:全称是:Interrupt Priority Registers,是一个中断优先级控制的寄存器组。这个寄存器组相当重要!STM32F407 的中断分组与这个寄存器组密切相关。IP 寄存器组由 240 个 8bit的寄存器组成,每个可屏蔽中断占用 8bit,这样总共可以表示 240 个可屏蔽中断。而 STM32F407只用到了其中的 82 个。IP[81]-IP[0]分别对应中断 81~0。而每个可屏蔽中断占用的 8bit 并没有
全部使用,而是只用了高 4 位。这 4 位,又分为抢占优先级和子优先级。抢占优先级在前,子优先级在后。而这两个优先级各占几个位又要根据 SCB->AIRCR 中的中断分组设置来决定。

//----------以上是常用的NVIC寄存器,对NVIC的配置实际上就是配置这几个寄存器----------//

ISPR[8]:全称是:Interrupt Set Pending Registers,是一个中断使能挂起控制寄存器组。每个位对应的中断和 ISER 是一样的。通过置 1,可以将正在进行的中断挂起,而执行同级或更高级别的中断。写 0 是无效的。
ICPR[8]:全称是:Interrupt Clear Pending Registers,是一个中断解挂控制寄存器组。其作用与 ISPR 相反,对应位也和 ISER 是一样的。通过设置 1,可以将挂起的中断解挂。写 0 无效。
IABR[8]:全称是:Interrupt Active Bit Registers,是一个中断激活标志位寄存器组。对应位所代表的中断和 ISER 一样,如果为 1,则表示该位所对应的中断正在被执行。这是一个只读寄存器,通过它可以知道当前在执行的中断是哪一个。在中断执行完了由硬件自动清零。

优先级的定义

1.优先级只有主优先级和子优先级
2.所谓的优先级分组是决定了IP寄存器的高4bit,其中哪几位代表主优先级,几位代表子优先级
3.数值越小所代表的优先级就越高
4.抢占优先级:抢占优先级高的中断可以打断正在执行的抢占优先级低的中断。
5.响应优先级:抢占优先级相同,响应优先级高的中断不能打断响应优先级低的中断。

还有一种情况就是当两个或者多个中断的抢占式优先级和响应优先级相同时,那么就遵循
自然优先级,看中断向量表的中断排序,数值越小,优先级越高。
先比较主优先级,再比较sub优先级,再按中断向量表的优先级序号比较
在这里插入图片描述
中断优先级寄存器 NVIC_IPRx,用来配置外部中断的优先级,IPR 宽度为 8bit,原则上每个外部中断可配置的优先级为 0~255,数值越小,优先级越高。但是绝大多数CM3芯片都会精简设计,以致实际上支持的优先级数减少,在F103中,只使用了高 4bit。而这高4bit也会根据CB->AIRCR 寄存器的 bit10~8 的配置来决定主优先级占几位,子优先级占几位。
在这里插入图片描述
优先级的分组由内核外设 SCB 的应用程序中断及复位控制寄存器 AIRCR 的PRIGROUP[10:8]位决定,也就是说用于表达优先级的这4bit还需要根据优先级分组的配置,再进行主优先级和子优先级的配置。

优先级分组的设置是由 SCB->AIRCR 寄存器的 bit10~8 来定义的.在这里插入图片描述在这里插入图片描述

举个例子_设置优先级

设置优先级:设置优先级分组之后,再设置主优先级和子优先级
1.设置优先级分组
2.设置主优先级
3.设置sub优先级

例如SCB->AIRCR 寄存器的 bit10~8将优先级分组设置为3,那么此时所有的 82 个中断,每个中断的中断优先寄存器的高四位中的最高 3 位是抢占优先级,低 1 位是响应优先级。每个中断,你可以设置抢占优先级为 0~7,响应优先级为 1 或 0。抢占优先级的级别高于响应优先级。而数值越小所代表的优先级就越高。

举个例子_中断的打断

抢占优先级:抢占优先级高的中断可以打断正在执行的抢占优先级低的中断。
响应优先级:抢占优先级相同,响应优先级高的中断不能打断响应优先级低的中断。

假定设置中断优先级分组为 2,然后设置中断 3(RTC_WKUP 中断)的抢占优先级为 2,响应优先级为 1。中断 6(外部中断 0)的抢占优先级为 3,响应优先级为 0。中断 7(外部中断 1)的抢占优先级为 2,响应优先级为 0。那么这 3 个中断的优先级顺序为:
中断 7>中断 3>中断 6。
上面例子中的中断 3 和中断 7 都可以打断中断 6 的中断。而中断 7 和中断 3 却不可以相互打断!

NVIC 中断相关的库函数都在库文件 misc.c 和 misc.h 中

中断编程要点

一般情况下不使用库函数封装好的函数

编程时主要进行三步

1.使能中断

使能外设某个中断,比如USART的传输完成中断,接受完成中断等,这些由相关外设的控制寄存器进行控制,配置控制寄存器进行使能。这边是允许外设的具体某个中断,还需要在NVIC操作 NVIC_ISER 和 NVIC_ICER 这两个寄存器,进行中断的使能

2.配置NVIC

初始化 NVIC_InitTypeDef 结构体
在这里插入图片描述
2.1 设置中断源

在这里插入图片描述
在这里插入图片描述
2.2设定主优先级和sub优先级

2.3中断使能(ENABLE)或者失能(DISABLE),操作的是 NVIC_ISER 和 NVIC_ICER 这两个寄存器。

3.编写中断服务函数

启动文件 startup_stm32f10x_hd.s 中预先定义了中断服务函数,可以在里面进行编写。

NVIC 相关函数

NVIC 中断相关的库函数都在库文件 misc.c 和 misc.h 中(stm32f1系列)
把 core_cm4.h 文件的 NVIC 相关函数封装到 stm32f4xx_hal_cortex.c 文件中(stm32f4系列)

以外部中断EXTI为例

代码差不多就是这个意思,具体使用时需要修改
配置GPIO PA0引脚作为外部中断的流程

1) 使能 IO 口时钟。

使用 GPIO 之前必须开启 GPIO 端口的时钟;用到 EXTI 必须开启 AFIO 时钟。

GPIO_InitTypeDef GPIO_InitStructure;//
EXTI_InitTypeDef EXTI_InitStructure;//

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);//打开GPIO的时钟,打开AFIO的时钟,

2)配置中断优先级(NVIC)

NVIC_InitTypeDef NVIC_InitStructure;
/* 配置 NVIC 为优先级组 1  所有82个中断源都属于优先级组1,主优先级0-1,子优先级0-7*/
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

/* 配置中断源:exti1 */
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;

/* 配置抢占优先级:1 */
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;

/* 配置子优先级:1 */
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

/* 使能中断通道 */
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

3) 设置 IO 口模式,触发条件,设置 IO 口与中断线的映射关系,并使能中断。

# 设定GPIO模式
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;#浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure);

#设定EXTI触发条件
/* 选择 EXTI 的信号源 */
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);

EXTI_InitStructure.EXTI_Line = EXTI_Line0;
/* EXTI 为中断模式 */
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
/* 上升沿中断 */
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
/* 使能中断 */
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);

4) 编写中断服务函数。

void EXTI0_IRQHandler(void){

	//确保是否产生了 EXTI Line 中断
	if (EXTI_GetITStatus(EXTI_Line0) != RESET){
	//Todo
	EXTI_ClearITPendingBit(EXTI_Line0);
	}
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【STM32】中断与NVIC以外部中断为例 的相关文章

  • 如何利用AJAX技术提高网站搜索引擎排名(4)

    四 使用XmlHttpRequest 如果你的用户主要使用Internet Explorer的较新版本或基于Gecko的浏览器 Mozilla Firefox Netscape 7 那么你可以决定使用XmlHttpRequest对象来把其它
  • 阴影LightMode = ShadowCaster

    阴影 实现原理 使用Shadow Map技术 把摄像机与光源位置重合 光源的阴影部分就是摄像机看不到的地方 前向渲染路径中 最重要的平行光如果开启了阴影 Unity就会为光源计算阴影映射纹理 shadowmap 本质就是深度图 记录光源出发
  • Android Studio出现:Your project path contains non-ASCII characters.

    公司设备需要自己开发安卓软件 我这就想自己研究下 开始想用IDEA 因为本身搞Java 后一番蒸腾没成功 在同事建议下装了Android Studio 4 X 一路跟着视频配置挺顺 没想到在创建项目上那里翻车了 如下图 自己没截图 用的别人

随机推荐

  • BitLocker自动解锁的密钥保存在哪里?

    当使用BitLocker加密Windows操作系统的系统分区时 可以选择让操作系统自动解锁系统盘 这通常需要将加密密钥保存在计算机上 以便系统能够自动解密系统盘并启动操作系统 在这种情况下 BitLocker会将密钥存储在计算机的TPM芯片
  • CUDA和C++混合编程及CMakeLists.txt

    1 概要 首先认识一个问题 单从CMakeLists txt的角度来看 无法同时使用两种编译器编译两种语言 不过直接编写Makefile是可以的 通过设置不同的任务 可以实现一个Makefile编译两个语言 但这不是这里要讨论的重点 使用C
  • Mybatis的$和#的区别

    1 是将传入的值当做字符串的形式 eg select id name age from student where id id 当前端把id值1 传入到后台的时候 就相当于 select id name age from student w
  • 在BIOS中开启虚拟化技术

    电脑不能在虚拟机中安装操作系统时 需要在BIOS中开启虚拟化技术 什么是BIOS BIOS 是一个内置于个人计算机的程序 当您打开计算机时该程序启动操作系统 也称为系统固件 BIOS 是计算机硬件的一部分 不同于 Windows 如何进入B
  • PCL1.8.0+VS2013环境配置

    一 PCL环境配置 1 下载PCL 1 8 0 AllInOne msvc2013 win32exe和PCL 1 8 0 AllInOne msvc2013 win32exe pdb然后解压 配置环境变量PATH 下载链接 https pa
  • Windows 11最新版:任务管理器性能参数详解,什么是分页缓冲池和句柄

    首先 可以确定的一点是 大部分电脑都至少有一个CPU 内存 硬盘 网卡 显卡 Win11的任务管理器和Win10的任务管理器除了UI不同外 参数显示上是几乎一样的 所以Win10的用户也可以参考一下 CPU 通常 任务管理器的性能页面中 C
  • java JVM - 垃圾回收机制

    垃圾的定义 只要对象不再被使用了 那我们就认为该对象就是垃圾 对象所占用的空间就可以被回收 怎么判断对象不再被使用的呢 常用的算法有两个 引用计数法 和 可达性分析法 引用计数法思路很简单 当对象被引用则 1 引用释放时计数则 1 当计数器
  • 推荐一款最强Python自动化神器!不用写一行代码!

    搞过自动化测试的小伙伴 相信都知道 在Web自动化测试中 有一款自动化测试神器工具 selenium 结合标准的WebDriver API来编写Python自动化脚本 可以实现解放双手 让脚本代替人工在Web浏览器上完成指定的操作 虽然se
  • vue实现点击按钮刷新页面的方法:

    1 简单方法 第一种 使用location对象的reload 方法 window location reload 第二种 使用编程式导航 this router go 0 2 使用vue中provide和inject 推荐 在app vue
  • YOLO技术概要学习笔记3——YOLOV4到YOLOV8

    目录 一 前言 二 YOLOv4 1 一个集成了 Bag of Specials BoS 的增强架构 2 集成了Bag of freebies BoF 的高级训练方法 3 自我对抗训练 SAT 4 遗传算法进行超参数优化 三 YOLOv5
  • 如何反转一个单链表java

    目标 反转前 1 gt 2 gt 3 gt 4 反转后 4 gt 3 gt 2 gt 1 思维 思维关键点 1 关键点一 本质 两两相邻的节点 的指向变反了而已 清晰的抓本质 箭头方向的改变 这样才能写出简单代码 2 关键点二 指针工具 做
  • 【FPGA约束详解】——从入门到精通

    FPGA约束详解 从入门到精通 FPGA约束是FPGA设计中非常重要的一环 它能够限制和规范电路的行为 确保信号的稳定性和正确性 在FPGA的设计过程中 约束有许多种类 本文将对常见的五种约束进行详细介绍 时钟约束 时钟约束是最基本也是最重
  • Spring JPA @CreatedDate和@LastModifiedDate

    Spring Data JPA提供了注解 CreatedDate和 LastModifiedDate 用来保存创建时间和修改时间 大大降低了开发成本 一 使用步骤 1 启动类需要添加注解 EnableJpaAuditing SpringBo
  • Linux-编写一个自己的命令

    前言 1 在Linux中 我们对文件路径进行操作都需要输入命令 那么 有人可能就会有疑惑了 命令是什么东西 我们是否也可以创造出自己的命令呢 答案是可以的 命令本身其实就是可执行文件 但是 与普通的可执行文件的不同之处在于 命令的可执行文件
  • unity 内置图标

    lt 转 Unity内建图标列表 weixin 30878361 2018 11 14 12 32 00 211 收藏 文章标签 游戏 移动开发 ui 最后发布 2018 11
  • 一款好用的富文本编辑器

    目录 项目功能介绍 资源介绍 swagger接口文档 编辑器功能展示 项目目录讲解 前端 后端 部分代码展示 前端 富文本编辑器页面App vue 后端 文章查询保存 serviceImpl 功能演示 源码分享 给大家分享一个好用的富文本编
  • apt-get update和 upgrade的区别

    update update is used to resynchronize the package index files from their sources The indexes of available packages are
  • 【腾讯云 Cloud Studio 实战训练营】提升开发效率与协作:探索腾讯云 Cloud Studio 的强大功能与优势

    文章目录 一 前言 二 认识腾讯云 Cloud Studio 2 1 什么是云端开发环境 2 2 CDE 的特点与优点 2 2 1 提高效率 开发环境一键运行 2 2 2 提高生产力 可以并行的工作 2 2 3 开发更加规范 2 2 4 提
  • vscode设置sdk_1 visual studio code 配置C++开发环境 (windows 开发环境)

    0 引言 最近帮GF 不幸变成ex了 配置C 开发环境 一开始想给她装个visual studio13完事 但是一想到自己安装以及使用时的诸多麻烦 就有点退却 觉得没有这个必要 正好了解到vscode大行其道 决定按照官网指示配置一版 由于
  • 【STM32】中断与NVIC以外部中断为例

    前言 在stm32中姑且可以认为 异常就是中断 单片机上电之后 首先执行启动文件 开辟堆栈之后 开始初始化中断向量表 NVIC NVIC NVIC是嵌套向量中断控制器 控制着整个芯片中断相关的功能 它跟内核紧密耦合 是内核里面的一个外设 三