NVIC(Nested vectoredinterrupt controller)嵌套向量中断控制器;

中断管理办法:

对STM32中断进行分组,组0-4,对每一个中断设置一个抢占优先级和响应优先级。

中断优先级设置步骤:

1、系统运行后先设置中断优先级分组

void NVIC_PriorityGroupConfig(uint32_t NVIC_Priority_Group);

2、对于每个中断,设置相应的抢占优先级和响应优先级;

NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)

typedef struct NVIC_InitTypeDef{uint8_t NVIC_IRQChannel; //中断通道uint8_t NVIC_IRQChannelPreemptionPriority;  //抢占优先级uint8_t NVIC_IRQChannelSubPriority;   //响应优先级FunctionalState NVIC_IRQChannelCmd;   //中断通道使能}

1)抢占优先级越小,优先级越高;相同抢占优先级的中断不能嵌套;

2)相同抢占优先级N个中断发生时,响应优先级越小的中断首先执行(不能嵌套),如果响应优先级也均相同,则根据各中断对应向量表的位置来确定,向量表中越靠前的中断先响应

void NVIC_Init(NVIC_Init TypeDef* NVIC_InitStruct);

NVIC基础知识:

1. cortex-m3支持256个中断,其中包含了16个内核中断,240个外部中断。(本博文只介绍60个外部可屏蔽中断) 
2. stm32只有84个中断,包括16个内核中断和68个可屏蔽中断 
3. stm32f103上只有60个可屏蔽中断,f107上才有68个中断 
4. 先占优先级也就是抢占优先级,概念等同于51单片机中的中断。假设有两中断先后触发,已经在执行的中断先占优先级如果没有后触发的中断 先占优先级更高,就会先处理先占优先级高的中断。也就是说又有较高的先占优先级的中断可以打断先占优先级较低的中断。这是实现中断嵌套的基础。 
次占优先级,也就是响应优先级,只在同一先占优先级的中断同时触发时起作用,先占优先级相同,则优先执行次占优先级较高的中断。次占优先级不会造成中断嵌套。 如果中断的两个优先级都一致,则优先执行位于中断向量表中位置较高的中断。

NVIC是嵌套向量中断控制器;用于为中断分组,从而分配抢占优先级和响应优先级;

中断相关寄存器:

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 这三个寄存器,ISER 用来使能中断,ICER用来失能中断,IP 用来设置中断优先级;

中断优先级和中断优先级分组的区别在于:

中断优先级分组的设定是在NVIC_Type和NVIC_InitTypeDef结构体初始化的前面。

中断优先级的设定是NVIC->IPRx寄存器(共8bit,只使用高4bit)

中断编程的步骤:

1、使能中断请求;

2、配置中断优先级分组;

3、配置NVIC寄存器,主要运用NVIC_InitTypeDef函数;

4、编写中断服务函数;

typedef struct
{uint8_t NVIC_IRQChannel;uint8_t NVIC_IRQChannelPreemptionPriority;uint8_t NVIC_IRQChannelSubPriority;FunctionalState NVIC_IRQChannelCmd;
}NVIC_InitTypeDef;

贴一段例程:

//外部中断初始化函数
void EXTIX_Init(void)
{   EXTI_InitTypeDef EXTI_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//外部中断,需要使能AFIO时钟KEY_Init();//初始化按键对应io模式//三个按键分别连到了PC5、PA15、PA0,以下对三个引脚进行配置//GPIOC.5 中断线以及中断初始化配置GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource5);EXTI_InitStructure.EXTI_Line=EXTI_Line5;//上面说了PA0,PB0为EXTI0,这里PC5中断线应该为EXTI5EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器//GPIOA.15  中断线以及中断初始化配置GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource15);EXTI_InitStructure.EXTI_Line=EXTI_Line15; // PA15中断线为EXTI15EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器//GPIOA.0   中断线以及中断初始化配置GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);EXTI_InitStructure.EXTI_Line=EXTI_Line0;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;    //使能按键所在的外部中断通道;EXTI0~4单独有自己的中断号(中断服务函数),所以这里是EXTI0。NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;    //抢占优先级2,NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;   //子优先级1NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;  //使能按键所在的外部中断通道;EXTI5~9共享一个中断号,所以这里是EXTI9_5_IRQn。NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;    //抢占优先级2,NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;   //子优先级1NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道NVIC_Init(&NVIC_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;    //使能按键所在的外部中断通道;EXTI10~15共享一个中断号,这里EXTI15的中断号当然是EXTI15_10_IRQn。NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;    //抢占优先级2,NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;   //子优先级1NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道NVIC_Init(&NVIC_InitStructure);
}

STM32中的NVIC相关推荐

  1. STM32中NVIC_SystemReset()函数的作用?什么时候用?

    STM32中NVIC_SystemReset()函数的作用?什么时候用? STM32软件复位有两种方式 (1)方式一:NVIC_SystemReset()函数用来复位STM32. 注意1:从SYSRE ...

  2. 详解STM32中的ADC

    ADC简介 STM32F103系列有3个ADC,精度为12位,每个ADC最多有16个外部通道.其中ADC1和ADC2都有16个外部通道,ADC3一般有8个外部通道,各通道的A/D转换可以单次.连续.扫 ...

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

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

  4. STM32 中 SysTick时钟的配置

    SysTick_Config(SystemFrequency / 10)   函数的形参就是systick重装定时器的值. systck计数频率为每秒72000000次,所以7200000次就是1/1 ...

  5. 深入浅出地理解STM32中的定时器工作原理

    深入浅出地理解STM32中的定时器工作原理 一.如何实现延时 1 纯硬件电路 2 纯软件编程 3 可编程定时/计数器 二.可编程定时/计数器有哪些功能? 三.STM32F103 的定时器有哪些 1 基 ...

  6. LWIP学习系列(二):STM32中ETH外设的配置与LWIP的结合使用

    目录 一.STM32中ETH外设的配置流程(HAL库) (1)ETH大致初始化与使用流程 (2)访问外部PHY寄存器相关函数 二.LWIP关于ethernet的底层驱动移植 (1)LWIP网卡需要由用 ...

  7. STM32中的独立看门狗和窗口看门狗

    STM32中的独立看门狗和窗口看门狗 在早期的MCU中是没有看门狗这种东西的,所以产品就很容易出现死机,跑飞的情况.为了避免这种情况的出现,后期的MCU都集成了看门狗的功能.但是,目前看门狗发展到今天 ...

  8. STM32中断:NVIC与EXTI

    STM32中断非常强大,每个外设都可以产生中断.异常就是中断,中断就是异常,请不要刻意钻牛角尖较劲. 1.异常类型 F103在内核水平上搭载了一个异常响应系统,支持为数众多的系统异常和外部中断.其中系 ...

  9. STM32中GPIO的8种工作模式

    一.推挽输出:可以输出高.低电平,连接数字器件:推挽结构一般是指两个三极管分别受两个互补信号的控制,总是在一个三极管导通的时候另一个截止.高低电平由IC的电源决定.形象点解释:推挽,就是有推有拉,任何 ...

最新文章

  1. 2017暑期挖坑计划(持续更新中~)
  2. flask执行python程序_Flask app后如何执行代码(应用程序运行)开始
  3. C++ 类的保护继承与构造函数
  4. CSAPP lab2 二进制拆弹 binary bombs phase_6
  5. java 调用远程服务_java调用(请求)远程服务地址
  6. 我是学计算机的上银行考什么条件,计算机专业能报考银行哪些岗位
  7. 最简方式 表格编辑 基于 el-table
  8. 编写数据访问代码测试–单元测试是浪费
  9. 外挂:一个很杯具的关键字
  10. Fragment懒加载预加载
  11. spring5源码-aop
  12. Centos7安装vsftpd (FTP服务器)
  13. 嵌入式培训经验分享——网络编程项目实战(在线电子词典)
  14. 也致第一次安装Rime的你
  15. 我理解的myisam引擎之六 MYI、MYD文件的解析
  16. mysql 查询生日_MySQL,怎么查询一段时间内过生日的员工
  17. 你的电脑或移动设备不支持Miracast
  18. 简述php语言的特点是_PHP是什么语言?有什么的特点?
  19. Python %取模小故事
  20. (附源码)SSM仓库管理系统 毕业设计 061015

热门文章

  1. hibernate 和 jpa简介
  2. 韩国 kakaotalk web网页版第三方登录示例 kakaotalk网页版
  3. TypeScript - 泛型
  4. Ubuntu安装MotionPro
  5. LintCode之玩具工厂
  6. 视觉机器学习20讲-MATLAB源码示例(3)-回归学习算法
  7. Android OpenCV实现图片叠加,水印
  8. 【收藏】Edraw Max(亿图图示)软件快捷键大全
  9. Kubernetes 三节点安装-完整可用
  10. 如何在iPhone上使用Chrome扫描QR码