关于STM32 (Cortex-M3) 中NVIC的分析

  一、STM32 (Cortex-M3) 中的优先级概念

  STM32(Cortex-M3)中有两个优先级的概念:抢占式优先级和响应优先级,也把响应优先级称作“亚优先级”或“副优先级”,每个中断源都需要被指定这两种优先级。

  1. 何为占先式优先级(pre-emption priority)

  高占先式优先级的中断事件会打断当前的主程序/中断程序运行—抢断式优先响应,俗称中断嵌套。

  2. 何为副优先级(subpriority)

  在占先式优先级相同的情况下,高副优先级的中断优先被响应;

  在占先式优先级相同的情况下,如果有低副优先级中断正在执行,

高副优先级的中断要等待已被响应的低副优先级中断执行结束后才能得到响应—非抢断式响应(不能嵌套)。

  3. 判断中断是否会被响应的依据

  首先是占先式优先级,其次是副优先级;

  占先式优先级决定是否会有中断嵌套;

  Reset、NMI、Hard Fault 优先级为负(高于普通中断优先级)且不可调整。

  4. 优先级冲突的处理

  具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断的嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。

  当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。

  5. Cortex-M3中对中断优先级的定义

  既然每个中断源都需要被指定这两种优先级,就需要有相应的寄存器位记录每个中断的优先级;在Cortex-M3中定义了8个比特位用于设置中断源的优先级,这8个比特位可以有8种分配方式,如下:

  所有8位用于指定响应优先级

  最高1位用于指定抢占式优先级,最低7位用于指定响应优先级

  最高2位用于指定抢占式优先级,最低6位用于指定响应优先级

  最高3位用于指定抢占式优先级,最低5位用于指定响应优先级

  最高4位用于指定抢占式优先级,最低4位用于指定响应优先级

  最高5位用于指定抢占式优先级,最低3位用于指定响应优先级

  最高6位用于指定抢占式优先级,最低2位用于指定响应优先级

  最高7位用于指定抢占式优先级,最低1位用于指定响应优先级

  这就是优先级分组的概念。

  6. STM32中对中断优先级的定义

  Cortex-M3允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此STM32把指定中断优先级的寄存器位减少到4位,这4个寄存器位的分组方式如下:

  第0组:所有4位用于指定响应优先级

  第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级

  第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级

  第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级

  第4组:所有4位用于指定抢占式优先级

  AIRC(Application Interrupt and Reset Register)寄存器中有用于指定优先级的 4

bits。这4个bits用于分配preemption优先级和sub优先级,在STM32的固件库中定义如下:

  /* Preemption Priority Group */

  #define NVIC_PriorityGroup_0 ((u32)0x700) /* 0 bits for pre-emption

priority

  4 bits for subpriority */

  #define NVIC_PriorityGroup_1 ((u32)0x600) /* 1 bits for pre-emption

priority

  3 bits for subpriority */

  #define NVIC_PriorityGroup_2 ((u32)0x500) /* 2 bits for pre-emption

priority

  2 bits for subpriority */

  #define NVIC_PriorityGroup_3 ((u32)0x400) /* 3 bits for pre-emption

priority

  1 bits for subpriority */

  #define NVIC_PriorityGroup_4 ((u32)0x300) /* 4 bits for pre-emption

priority

  0 bits for subpriority */

  可以通过调用STM32的固件库中的函数NVIC_PriorityGroupConfig()选择使用哪种优先级分组方式,这个函数的参数有下列5种:

  NVIC_PriorityGroup_0 => 选择第0组

  NVIC_PriorityGroup_1 => 选择第1组

  NVIC_PriorityGroup_2 => 选择第2组

  NVIC_PriorityGroup_3 => 选择第3组

  NVIC_PriorityGroup_4 => 选择第4组

  接下来就是指定中断源的优先级,下面以一个简单的例子说明如何指定中断源的抢占式优先级和响应优先级:

  // 选择使用优先级分组第1组

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

  // 使能EXTI0中断

  NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 指定抢占式优先级别1

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 指定响应优先级别0

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  NVIC_Init(&NVIC_InitStructure);

  // 使能EXTI9_5中断

  NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 指定抢占式优先级别0

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定响应优先级别1

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  NVIC_Init(&NVIC_InitStructure);

  要注意的几点是:

  1. 如果指定的抢占式优先级别或响应优先级别超出了选定的优先级分组所限定的范围,将可能得到意想不到的结果;

  2. 抢占式优先级别相同的中断源之间没有嵌套关系;

  3. 如果某个中断源被指定为某个抢占式优先级别,又没有其它中断源处于同一个抢占式优先级别,则可以为这个中断源指定任意有效的响应优先级别。

  二、开关总中断

  在STM32/Cortex-M3中是通过改变CPU的当前优先级来允许或禁止中断。

  PRIMASK位:只允许NMI和hard fault异常,其他中断/异常都被屏蔽(当前CPU优先级=0)。

  FAULTMASK位:只允许NMI,其他所有中断/异常都被屏蔽(当前CPU优先级=-1)。

  在STM32固件库中(stm32f10x_nvic.c和stm32f10x_nvic.h)

定义了四个函数操作PRIMASK位和FAULTMASK位,改变CPU的当前优先级,从而达到控制所有中断的目的。

  下面两个函数等效于关闭总中断:

  void NVIC_SETPRIMASK(void);

  void NVIC_SETFAULTMASK(void);

  下面两个函数等效于开放总中断:

  void NVIC_RESETPRIMASK(void);

  void NVIC_RESETFAULTMASK(void);

  上面两组函数要成对使用,但不能交叉使用。

  例如:

  第一种方法:

  NVIC_SETPRIMASK(); //关闭总中断

  NVIC_RESETPRIMASK();//开放总中断

  第二种方法:

  NVIC_SETFAULTMASK(); //关闭总中断

  NVIC_RESETFAULTMASK();//开放总中断

  常常使用:

  NVIC_SETPRIMASK(); // Disable Interrupts

  NVIC_RESETPRIMASK(); // Enable Interrupts

  补充:

  可以用:

  #define CLI() __set_PRIMASK(1)

  #define SEI() __set_PRIMASK(0)

  来实现开关总中断的功能。

  最后还是给大家搞一些stm32的资料便于参考学习

(STM32中断系统)

基于STM32-WiFi智能小车机器人开发实战

ARM之中断GIC分析

嵌入式操作系统uC/OS

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,440评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,814评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,427评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,710评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,625评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,014评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,511评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,162评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,311评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,262评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,278评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,989评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,583评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,664评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,904评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,274评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,856评论 2 339

推荐阅读更多精彩内容

  • 在按键学习中,我们有用到查询的方法来判断按键事件是否发生,这种查询按键事件适用于程序工作量较少的情况下,一旦程序中...
    呼啦啦的爱阅读 406评论 0 0
  • 1 异常类型 Cortex-M3内核具有强大的异常响应系统,它把能够打断当前代码执行流程的事件分为异常(excep...
    hackvilin阅读 3,503评论 0 4
  • 首先让我们来看一下关于控制定时器中断的文件timer.c中的源码: 前两行是头文件的声明,这里我们不去理会,我们今...
    Jane_123阅读 11,164评论 0 5
  • 1.STM32中断概述 中断优先级 在使用中断式按键之前,我们先去了解一下STM32的中断。关于这方面可以参考《S...
    东方未曦阅读 3,467评论 1 10
  •   第一:STM32的中断类型分为两种:抢占优先级和响应优先级。抢占优先级决定了抢占行为,即当系统正在响应某中断L...
    yuanliangx阅读 1,782评论 0 1