| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> 轻松搞懂STM32F407之中断及NVIC与EXTI -> 正文阅读 |
|
[嵌入式]轻松搞懂STM32F407之中断及NVIC与EXTI |
什么是中断和异常: 首先要了解什么是内核,什么是外设。内核就如Cortex_M4,是ARM公司开发的。ST公司在拿到这个内核后,做了一些东西,如GPIO和RTC以及USART等等等等,都是外设。 那么异常是对所有能打断程序正常执行的统称,中断属于一种异常。在内核中,异常就叫异常,而在外设中,异常被称为中断。(下面统称中断); 中断的概念与组成: 现在我们把单片机看做是一个正在做饭的少妇。他正在做饭(去除食物,放入锅里,煎炒...),就在这时,他的孩子发出了一声啼哭,并且这时她发现家里的盐所剩不多了,他不得不放下手头的铲子去哄孩子睡觉,并记住她做饭做到哪里了。等她哄完孩子后,再去超市买盐回来,又继续做饭。 如果把这个少妇看作是一个单片机, 1:那么她做饭的过程我们称为程序正常的运行流程 2:孩子的啼哭和她发现盐不够了被称为中断触发。 3:《哄孩子》,《买盐》被称为中断向量 4:她准备处理孩子的啼哭和盐不够这两个事件,被称为中断响应 5:她先哄孩子,再去买盐就是处理多个中断的优先级。 6:当她哄孩子时,她必须记得接下来去买盐。那么买盐这个事情就称为中断悬空 总结一下:程序运行流程,中断触发,中断响应,中断向量,中断优先级,中断悬空 中断的管理: 在单片机中,对于中断的管理是由NVIC实现的,也就是一个中断管理器。它负责管理如下事务 1:中断的使能(我是否对这个事件进行中断响应,也就是我是否将这个中断送入内核处理) 2:中断优先级选择(我该先选择处理那个中断?) 3:中断源的选择(中断向量是什么) 通过对这三点进行配置,即可对一个中断向量进行管理 NVIC优先级: 在Cortex内核中,由八个位决定中断优先级,但是在Cortex低版本如Cortex_M4中,只使用了4个位。共0-15个优先级。因为低版本内核如Cortex_M4根本用不了这么多的优先级。但是还有一个问题出现了,当一个中断服务函数正在执行的时候,又来了个中断,那么内核是先把当前中断服务函数执行完了呢,还是先去执行新来的中断呢? 这时就提出了中断分组的概念。及将现有的表示优先级的4位化为两个部分,高位部分用于表示抢占优先级(主优先级),低位部分用于表示响应优先级(子优先级)。高位部分和地位部分的长度由优先级组号表示。优先级组号在寄存器钟用了三个位表示。8组,但是实际上在低版本Cortex中,只用了0-5个组。这个优先级组号决定了抢占优先级在优先级位数中所占的长度,如3组,就是抢占优先级占高三位,响应优先级剩下1位。如果是组0,那么不使用抢占优先级,只使用响应优先级。 在实际运行过程中,先响应抢占优先级低的(注意,这里是数值越低,优先级越大),如果抢占优先级相同,则处理响应优先级低的,如果都相同,则处理中断向量号低的(实际上,中断向量存储在一个中断数组中,中断向量号就是它的数组下标。)。 当一个中断服务函数A正在运行时,出现一个抢占优先级高(值低)于于A的中断B,则先去处理中断B,处理完成后,再处理A没完成的部分。如果A正在运行,那么出现的B的抢占优先级相同或者小A,则先处理完A,再去响应B。 EXTI外部中断以及事件控制器 提到NVIC用于管理中断,中断的形式有很多种,有定时器中断和外部中断等等。那么用于管理外部中断的东西就叫做EXTI,它和NVIC的关系可以看作是上下级的关系,EXTI检测到GPIO等外设发生的变化来决定是否触发中断或事件。 我们如何来定义NVIC和EXTI的关系? EXTI统筹外部中断,并将这些中断发送给NVIC处理。 来看一组GPIO中断发生的流程 GPIO口的电平发生变化,EXTI检测到了这个事件,由EXTI向NVIC发送一个中断请求。 这就是外部中断发生的流程,外部的事件本质并不会向NVIC产生中断信号,而是由EXTI检测到这个事件从而向NVIC发送中断请求。 祭出官方框图 这里我分为了几个部分, 先解决7这个,EXTI是挂在APB2上的,APB2的时钟就是PLCK2。EXTI所谓片上外设,无非就是一些挂在总线上的控制寄存器与一些实现电路。EXTI分为1-23给中断线.图上的23就是表示其为23号中断线,中断线的作用就是EXTI连接总线时钟和NVIC以及边上外设的。 1:首先输入线检测到跳变电平。 2:边沿检测电路检测这是个啥电平,通过上面两个寄存器决定上升沿有效还是下降沿有效,也可以都设置,上升下降都触发。 3:是个门电路,软件中断和硬件中断都可通过 然后就到了事件和中断的分界点了,先看中断 4:又是个门电路,中断信号来了并没有进行中断屏蔽中断信号才能继续 5:进入中断悬空,之后交由NVIC处理,所谓EXTI挂起就是把寄存器的某个位设1,标记该中断线处于中断中,执行完中断服务函数后需要软件复位。 6:产生事件,就是产生个电平啥的。 EXTI中断线: EXTI中断线共23条,从0-22号。前16条连接GPIOPin,无论GPIO_ABCDEF..其对应的GPIOPin号就等于中断线号。后几条连了一些外设啥的,现在不用管 来自野火手册 EXTI中断向量有如下几条 中断线0-4分别有各自的中断向量,5-9用一条,10-15用一条,其他的先不管。 以下是配置部分 NVIC配置
EXTI配置
EXTI中断服务函数实例
各位观众老爷打个赏,不多,一瓶护发素即可 |
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
89C51单片机与DAC0832 |
基于51单片机宠物自动投料喂食器控制系统仿 |
《痞子衡嵌入式半月刊》 第 68 期 |
多思计组实验实验七 简单模型机实验 |
CSC7720 |
启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
STM32初探 |
STM32 总结 |
【STM32】CubeMX例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/27 10:37:23- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |