你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32中断详解

[复制链接]
STMCU 发布时间:2020-10-22 14:33
STM32中断详解


1 异常类型

CM3内核支持256个中断,其中 16个内核中断和240个外部中断,并具有256级可编程中断设置。STM32并没有使用CM3的全部内容,而是使用了一部分。STM32有84个中断,包括16个内核中断和68个可屏蔽中断,具有16级可编程中断优先级。STM32F103 在内核水平上搭载了一个异常响应系统,支持为数众多的系统异常和外部中断。其中系统异常有 8 个(如果把 Reset 和 HardFault 也算上的话就是 10 个),外部中断有 60个。除了个别异常的优先级被定死外,其它异常的优先级都是可编程的。有关具体的系统异常和外部中断可在标准库文件 stm32f10x.h 这个头文件查询到,在 IRQn_Type 这个结构体里面包含了 F103 系列全部的异常声明。F103系统异常清单见下表。

11.png

F103 外部中断清单见下表。
12.png
13.png



2 NVIC简介

在讲如何配置中断优先级之前,我们需要先了解下 NVIC。 NVIC 是嵌套向量中断控制器,控制着整个芯片中断相关的功能,它跟内核紧密耦合,是内核里面的一个外设。但是各个芯片厂商在设计芯片的时候会对 Cortex-M3 内核里面的 NVIC 进行裁剪,把不需要的部分去掉,所以说 STM32 的 NVIC 是 Cortex-M3 的 NVIC 的一个子集。


NVIC 寄存器简介
在固件库中, NVIC 的结构体定义可谓是颇有远虑,给每个寄存器都预留了很多位,恐怕为的是日后扩展功能。不过 STM32F103 可用不了这么多,只是用了部分而已,具体使用了多少可参考《 Cortex-M3 内核编程手册》的NVIC 寄存器映射。

14.png
[ps]NVIC 结构体定义,来自固件库头文件: core_cm3.h。
在配置中断的时候我们一般只用 ISER、 ICER 和 IP 这三个寄存器, ISER 用来使能中断, ICER 用来失能中断,IP 用来设置中断优先级。

NVIC 中断配置固件库
固件库文件 core_cm3.h 的最后,还提供了NVIC 的一些函数,这些函数遵循 CMSIS 规则,只要是 Cortex-M3 的处理器都可以使用,符合CMSIS标准的NVIC库函数具体如下表。

15.png
这些库函数我们在编程的时候用的都比较少,甚至基本都不用。

3 优先级的定义

优先级定义
在 NVIC 有一个专门的寄存器:中断优先级寄存器 NVIC_IPRx,用来配置外部中断的优先级, IPR 宽度为 8bit,原则上每个外部中断可配置的优先级为 0~255,数值越小,优先级越高。但是绝大多数 CM3 芯片都会精简设计,以致实际上支持的优先级数减少,在F103 中,只使用了高 4bit,F103 使用 4bit 表达优先级如下所示。



用于表达优先级的这 4bit,又被分组成抢占优先级和子优先级。如果有多个中断同时响应,抢占优先级高的就会抢占抢占优先级低的优先得到执行,如果抢占优先级相同,就比较子优先级。如果抢占优先级和子优先级都相同的话,就比较他们的硬件中断编号,编号越小,优先级越高。


优先级分组
优先级的分组由内核外设 SCB 的应用程序中断及复位控制寄存器 AIRCR 的PRIGROUP[10:8]位决定, F103 分为了 5 组,具体如下:主优先级=抢占优先级。优先级分组如下表所示。

16.png
设置优先级分组可调用库函数NVIC_PriorityGroupConfig()实现,有关 NVIC 中断相关的库函数都在库文件 misc.c 和 misc.h 中。优先级分组真值表如下表。
17.png

中断编程
18.png

在配置每个中断的时候一般有 3 个编程要点:
1、使能外设某个中断。这个具体由每个外设的相关中断使能位控制。比如串口有发送完成中断,接收完成中断,这两个中断都由串口控制寄存器的相关中断使能位控制。
2、初始化 NVIC_InitTypeDef结构体,配置中断优先级分组,设置抢占优先级和子优先级,使能中断请求。 NVIC_InitTypeDef结构体在固件库头文件 misc.h 中定义。

  1. typedef struct {
  2.     uint8_t NVIC_IRQChannel; // 中断源
  3.     uint8_t NVIC_IRQChannelPreemptionPriority;// 抢占优先级
  4.     uint8_t NVIC_IRQChannelSubPriority; // 子优先级
  5.     FunctionalState NVIC_IRQChannelCmd; // 中断使能或者失能
  6. } NVIC_InitTypeDef;
复制代码


有关 NVIC 初始化结构体的成员我们一一解释下:
1) NVIC_IROChannel:用来设置中断源,不同的中断中断源不一样,且不可写错,即使写错了程序也不会报错,只会导致不响应中断。具体的成员配置可参考 stm32f10x.h 头文件里面的 IRQn_Type 结构体定义,这个结构体包含了所有的中断源。

  1. typedef enum IRQn {
  2.      //Cortex-M3 处理器异常编号
  3.      NonMaskableInt_IRQn = -14,
  4.      MemoryManagement_IRQn = -12,
  5.      BusFault_IRQn = -11,
  6.      UsageFault_IRQn = -10,
  7.      SVCall_IRQn = -5,
  8.      DebugMonitor_IRQn = -4,
  9.      PendSV_IRQn = -2,
  10.      SysTick_IRQn = -1,
  11.      //STM32 外部中断编号
  12.      WWDG_IRQn = 0,
  13.      PVD_IRQn = 1,
  14.      TAMP_STAMP_IRQn = 2,

  15.      //限于篇幅,中间部分代码省略,具体的可查看库文件 stm32f10x.h

  16.      DMA2_Channel2_IRQn = 57,
  17.      DMA2_Channel3_IRQn = 58,
  18.      DMA2_Channel4_5_IRQn = 59
  19. } IRQn_Type;
复制代码


2)NVIC_IRQChannelPreemptionPriority:抢占优先级,具体的值要根据优先级分组来确定,具体参考表6优先级分组真值表。
3)NVIC_IRQChannelSubPriority:子优先级,具体的值要根据优先级分组来确定,具体参考表6优先级分组真值表。
4)NVIC_IRQChannelCmd:中断使能( ENABLE)或者失能( DISABLE)。操作的是 NVIC_ISER 和 NVIC_ICER 这两个寄存器。

3、编写中断服务函数
在启动文件startup_stm32f10x_hd.s 中我们预先为每个中断都写了一个中断服务函数,只是这些中断函数都是为空,为的只是初始化中断向量表。实际的中断服务函数都需要我们重新编写,为了方便管理我们把中断服务函数统一写在 stm32f10x_it.c 这个库文件中。关于中断服务函数的函数名必须跟启动文件里面预先设置的一样,如果写错,系统就在中断向量表中找不到中断服务函数的入口,直接跳转到启动文件里面预先写好的空函数,并且在里面无限循环,实现不了中断。





收藏 评论0 发布时间:2020-10-22 14:33

举报

0个回答

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版