首页 > 代码库 > STM32_中断

STM32_中断

为什么要用中断?

常用的现实生活中的例子是,如果你正在看电视,门铃响了你该咋整?

这里门铃响了就是一个中断(interrupt),我们放下电视去开门就是一个中断服务子程序(ISP)

STM32的中断介绍

Cortex-M3 内核支持 256 个中断,包括 16 个内核中断和 240 个外部中断;

STM32F10x 有 84 个中断通道,包括 16 个内核中断和 68 个可屏蔽中断,也就是只用了 Cortex-M3 中断的一部分;

中断可以分配优先级,有的是固定死的,有的可以自定义。

中断会分配到具体外设,这在 stm32f10x 文档中中断向量表中可查找;

NCIV介绍

STM32 中断这么多,我们该怎么管理呢?

NVIC(Nested Vectored Interrupt Controller),嵌套向量中断控制器就是用来管理中断的,它是 M3 内核的一个外设;

STM32 并没有用 Cortex-M3 NVIC 的全部功能,而是对它进行了裁剪;

NVIC 相关的定义在 misc 和 core_cm3 中;

NVIC 寄存器结构体的定义就在 core_cm3 中;

中断优先级

STM32F103 芯片支持 60 个可屏蔽中断通道,每个中断通道都具备自己的 8 位中断优先级控制字节;

但 STM32 只用其中的高四位,还把这 4 位分成了抢占式优先级和响应式优先级,每个中断源都要指定这两种优先级;

抢占式优先级比响应式优先级优先级还高,也就是说在后者相同的情况下,前者级别高的中断先执行;

高抢占式优先级的中断会打断正在运行的主程序或低抢占式的中断,也就是可以中断嵌套;

但如果它们抢占式优先级一样,那不能嵌套,只能排队,一个一个来(两者都一样的话根据中断向量表中的顺序,靠前的先执行);

中断优先级分组

前面说,STM32 用四位来设置两种优先级,那就有以下五组情况:
第 0 组:4 位都用来设置响应优先级;

第 1 组:高 1 位指定抢占式,低 3 位指定响应式

第 2 组:高 2 位指定抢占式,低 2 位指定响应式

第 3 组:高 3 位指定抢占式,低 1 位指定响应式

第 4 组:4 位都用来设置抢占式优先级;

中断配置

中断配置大概有这么几步:
1. 打开对应外设外设

2. 设置中断优先级分组

3. 配置中断优先级

4. 编写中断服务程序 ISP,中断函数有固定的函数名,启动文件可查;

STM32_中断