您的位置:首页 > 其它

STM32的中断和异常

2017-11-17 17:51 197 查看
STM32的中断和异常

我们把能够打断当前代码执行流程的事件分为异常(expection)和中断(interrupt),把他们用一个表管理起来就是中断向量表。中断向量顾名思义就是一个地址,当发生中断的时候,系统的就会跑到这个地址中进行处理,当然实际情况要比这个更加复杂,因为还要做现场保护,堆栈指针SP和程序计数器也要做相应变化,这里既不详细展开了。我们只要明白一个概念就行,那就是中断服务函数的地址就是中断向量的地址。

中断可以分为可屏蔽中断与不可屏蔽中断,其中不可屏蔽中断包括复位(reset)、硬错误等等,这些中断一旦发生,系统必须进行响应处理。

而像定时器中断、外部中断等一些可屏蔽中断,就算中断发生,系统也可以不予理睬。

STM32中的中断非常多,为了让我们管理起来更加方便,他们开发了一个中断控制器(Nested Vector Interrupt Controller)NVIC,它是Cortex内核的一部分,当我们使用中断的时候就需要与NVIC打交道,对于库函数开发而言,我们需要使用到NVIC相关的一些函数。

在ST官方固件库当中有一个NVIC_InitTypeDef类型的结构体,这个至关重要:

NVIC结构体成员
结构体成员变量

描述

NVIC_IRQChannel

需要配置的中断向量

NVIC_IRQChannelCmd

使能或关闭相应中断向量的中断相应

NVIC_IRQChannelPreemptionPriority

抢占优先级

NVIC_IRQChannelSubPriority

响应优先级

前两个结构体成员相信大家都懂,后两个有点特殊。回想一下51单片机,它只有两个优先级,但是并没有区分是抢占优先级还是响应优先级,只要优先级高,中断发生时就会优先响应。MSP430单片机默认不具备优先级配置,这是因为它的中断一旦响应之后会默认先关闭中断标志位,这样是不支持中断嵌套的,但是用户可以手动打开,实现中断嵌套。

在STM32中抢占优先级和响应优先级共同决定了那个中断先发生,抢占优先级决定了谁先抢到机会,这个比响应优先级更加重要,如果两个中断的抢占优先级一样,那么他们就得再比一比谁的响应优先级更高,高的先响应。

抢占优先级和响应优先级的配置是通过一个4位的数字来确定的,这就决定了最多能有16种中断,这里的种类是指抢占优先级与响应优先级各不相同。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: