简介

STM32拥有一个强大的中断系统,几乎所有外设都能产生中断,对于F103系列的单片机,ARM公司在Cortex‐M3 的内核水平上搭载了一个异常响应系统(异常就是中断), 支持为数众多的系统异常和外部中断。对于每一种中断都有一个编号,其中,编号为 1-15 的对应系统异常大于等于 16 的则全是外部中断

Cortex-M3系统异常清单:

Cortex-M3外部中断清单:

Cortex-M3提供了两百多种异常类型,但在STM32中并没有这么多,STM32的中断系统是被阉割裁剪过的,只有六十多个,但相比于51单片机也已经是十分强大了

NVIC嵌套向量中断控制器

NVIC嵌套向量中断控制器,控制着整个芯片中断相关的功能,相当于中断系统的大脑,是内核里面的一个外设,但由于ST官方在设计芯片的时候对Cortex-M3的中断系统进行了裁剪,把不需要用到的部分给去掉。

NVIC的寄存器

寄存器的结构体定义位于core_cm3.h中

typedef struct
{__IO uint32_t ISER[8];                      /*!< Offset: 0x000  Interrupt Set Enable Register           */uint32_t RESERVED0[24];                                   __IO uint32_t ICER[8];                      /*!< Offset: 0x080  Interrupt Clear Enable Register         */uint32_t RSERVED1[24];                                    __IO uint32_t ISPR[8];                      /*!< Offset: 0x100  Interrupt Set Pending Register          */uint32_t RESERVED2[24];                                   __IO uint32_t ICPR[8];                      /*!< Offset: 0x180  Interrupt Clear Pending Register        */uint32_t RESERVED3[24];                                   __IO uint32_t IABR[8];                      /*!< Offset: 0x200  Interrupt Active bit Register           */uint32_t RESERVED4[56];                                   __IO uint8_t  IP[240];                      /*!< Offset: 0x300  Interrupt Priority Register (8Bit wide) */uint32_t RESERVED5[644];                                  __O  uint32_t STIR;                         /*!< Offset: 0xE00  Software Trigger Interrupt Register     */
}  NVIC_Type;

其中
ISER是中断使能寄存器ICER是中断清除寄存器IP是八位8bit中断优先级寄存器,我们在配置中断的时候一般只会用到这三个寄存器

中断优先级

前面的寄存器中有出现IP八位中断优先级寄存器,但在STM32中实际只用了4个bit用于优先级的设置
用于表达的优先级还分为

  • 抢占优先级(pre-emotion priority)
  • 子优先级(subpriority)
    在比较优先级的时候会先比较抢占优先级之后再比较子优先级,抢占优先级相同时比较子优先级,子优先级和抢占优先级都相同时比较中断编号

优先级分组

由于优先级中有抢占优先级和子优先级之分,因此需要对这四个位进行分组,分出对应的bit用于两种优先级的表达

控制优先级分组的是内核外设SCB中的AIRCR寄存器,有五种分配选择

中断的初始化编程

中断初始化函数为:void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);
NVIC_InitTypeDef初始化结构体:

typedef struct {uint8_t NVIC_IRQChannel; // 中断源uint8_t NVIC_IRQChannelPreemptionPriority; // 抢占优先级uint8_t NVIC_IRQChannelSubPriority; // 子优先级FunctionalState NVIC_IRQChannelCmd; // 中断使能或者失能} NVIC_InitTypeDef;

这里边就已经说明了中断编程的一些要点,由于STM32几乎每一个外设都能产生中断,因此使用哪一个外设的中断的时候

  1. 需要把对应外设的负责中断的寄存器给使能

  2. 配置中断源NVIC_IRQChannel
    中断源可以在stm32f10x.h头文件中找到

  3. 配置抢占优先级与子优先级
    NVIC_IRQChannelPreemptionPriority:抢占优先级
    NVIC_IRQChannelSubPriority:子优先级
    在这之前还需要设置优先级分组
    void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);函数配置,具体使用方法可以去msic.h和msic.c查询

  4. 使能中断或失能中断
    NVIC_IRQChannelCmd:中断使能( ENABLE)或者失能( DISABLE)

  5. 编写中断服务函数
    需要注意的是,STM32的中断服务函数名字不能随意取,51中用编号区分,STM32中就没有,需要严格按照头文件中所声明的名称编写,如果函数名称与头文件定义的不一样,在执行中断的时候会跳转到启动文件中的空函数,从而进入死循环

STM32笔记 (七)中断系统与NVIC嵌套向量中断控制器相关推荐

  1. NVIC嵌套向量中断控制器

    首先区分一下中断和异常的关系,其实中断和异常时有差异也有关联的,我们常常所说的中断其实也包含了异常.中断是指系统停止当前正在运行的程序转而其他服务,可能是程序接收了比自身高优先级的请求,或者是人为设置 ...

  2. STM32F10xxx20xxx21xxxL1xxxx Cortex-M3程序设计手册 阅读笔记四(3):嵌套向量中断控制器

    这一部分描述了嵌套向量中断控制器和它使用到的寄存器.NVIC支持: 高达81个中断(根据STM32设备的型号,参照数据手册): 对每个中断可编程优先级级别0-15,一个高的优先级级别相应着较低的优先级 ...

  3. 嵌套向量中断控制器 (NVIC)

    NVIC 是一种片上控制器,可为 ARM Cortex-M MCU 中的中断驱动事件提供快速和低延迟的响应.在本教程中,我们将解释嵌套向量中断控制器(NVIC) 在 ARM Cortex-M 微控制器 ...

  4. 【STM32学习笔记】(12)——NVIC(嵌套向量中断控制器)详解

    NVIC(嵌套向量中断控制器)简介 在讲如何配置中断优先级之前,我们需要先了解下 NVIC.NVIC 是嵌套向量中断控制器,控制着整个STM32芯片中断相关的功能,它跟Cortex-M3 内核紧密联系 ...

  5. 深入浅出地理解STM32中的中断系统——从原理到简单工程示例——保姆级教程

    深入浅出地理解STM32中的中断系统 一.什么是中断?什么是异常? 二.如何管理中断? 三.NVIC 1 NVIC 特点 2 中断优先级 (1) 优先级分组 3 中断向量表 4 中断服务函数 (1)中 ...

  6. 嵌套向量中断控制器NVIC和系统控制块SCB特性

    嵌套向量中断控制器NVIC和系统控制块SCB特性 NVIC:Nested Vectored Interrupt Controller 嵌套向量中断控制器 SCB:System Control Bloc ...

  7. STM32笔记之 NVIC(嵌套向量中断控制器)

    写在前面: 本文章旨在总结备份.方便以后查询,由于是个人总结,如有不对,欢迎指正:另外,内容大部分来自网络.书籍.和各类手册,如若侵权请告知,马上删帖致歉. 目录 一.NVIC简单解释 二.抢占优先级 ...

  8. STM32 (Cortex-M3) 中NVIC(嵌套向量中断控制)的理解

    一.STM32 (Cortex-M3) 中的优先级概念 STM32(Cortex-M3)中有两个优先级的概念:抢占式优先级和响应优先级,也把响应优先级称作"亚优先级"或" ...

  9. 【操作系统笔记】中断系统

    程序中断: 执行现行程序的过程中,出现某些急需处理的异常情况或特殊请求,CPU暂 时中止现行程序,而转去对这些异常情况或特殊请求进行处理,在处理完毕后CPU又自动返回到现 行程序的断点处,继续执行原程 ...

最新文章

  1. 对接钉钉审批_低代码对接钉钉创建外部联系人
  2. ajax async
  3. jquery中如何实现一个li里面一排6张图片进行切换
  4. android缓存框架SimpleCache
  5. 关于struts2漏洞问题及解决办法
  6. 这才是程序员该有的桌面壁纸!
  7. 【2016年第4期】国务院批复建立促进大数据 发展部际联席会议制度
  8. 背景学习模型 —》codebook算法
  9. Strus2 Unti1
  10. 14年第五届蓝桥杯C/C++大学B组真题———史丰收算法
  11. 大数据智能下数据脱敏的思考
  12. Nyoj 954 N!
  13. 网页计算机谈音乐,如何用windows电脑录制网页上或电脑中自己的音乐
  14. C语言学习笔记第五天_项目训练
  15. cad怎么画立体图形教学_cad怎么绘立体图?
  16. 4.Vue指令(Directives)
  17. 【简单应用】STC8+OLED(4P)显示
  18. 艾永亮:疫情之下,名创优品的超级产品战略帮助企业逆势而上
  19. python多线程解决数据安全问题
  20. 山东工商学院 计算机 银行,山东工商学院与中国工商银行成为战略合作伙伴

热门文章

  1. Mac修改shell版本(类型)
  2. 浙大版《C语言程序设计(第3版)》题目集
  3. 给Web应用更换公众号步骤
  4. Android 读取csv格式数据文件
  5. windows下qemu的安装与设置环境变量
  6. 通信系统通信过程仿真(联合信源信道编码)
  7. css元素旋转原点,使用transform-origin属性改变元素变换原点
  8. 数仓架构实践3:苏宁售后体系四层模型架构
  9. python海量数据分析师职业技能_大数据分析师技能图谱详解与零基础自学内容大全...
  10. macosx10.13运行go报dyld: Symbol not found: _SecTrustEvaluateWithError错误的解决办法