好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

stm32中的nvic.doc

8页
  • 卖家[上传人]:第***
  • 文档编号:31082908
  • 上传时间:2018-02-04
  • 文档格式:DOC
  • 文档大小:120.50KB
  • / 8 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • STM32 中的 NVIC(向量中断控制器)STM32(Cortex-M3)中 NVIC 的理解NVIC 共支持 1 至 240 个外部中断输入(通常外部中断写作 IRQs) 具体的数值由芯片厂商在设计芯片时决定此外,NVIC 还支持一个“永垂不朽”的不可屏蔽中断(NMI)输入NMI 的实际功能亦由芯片制造商决定在某些情况下,NMI 无法由外部中断源控制 NVIC 的访问地址是 0xE000_E000 所有 NVIC 的中断控制/状态寄存器都只能在特权级下访问不过有一个例外——软件触发中断寄存器可以在用户级下访问以产生软件中断中断的使能与失能中断的使能与失能分别使用各自的寄存器来控制------与传统的 使用单一比特的两个状态来表达使能与失能是不同的CM3 中可以有 240 对使能位/失能位,每个中断拥有一对这 240 个对子分布在 8 对 32 位寄存器中欲使能一个中断,你需要写 1 到对应 SETENA 的位中;欲失能一个中断,你需要写 1 到对应的 CLRENA 位中;如果往它们中写 0,不会有任何效果从而实现每个中断都可以自顾地设置,而互不侵犯如上所述,SETENA 位和 CLRENA 位可以有 240 对,对应的 32 位寄存器可以有 8 对,因此使用数字后缀来区分这些寄存器,如 SETENA0, SETENA1…SETENA7。

      如果你使用的芯片只支持 32 个中断,则只有 SETENA0/CLRENA0 才需要使用又因为前 16 个异常已经分配给系统异常,故而中断 0 的异常号是 16SETENA/CLRENA 寄存器族SETENAs: 0xE000_E100 – 0xE000_E11C CLRENAs: 0xE000E180 - 0xE000_E19C 中断的悬起与解悬如果中断发生时,正在处理同级或高优先级异常,或者被掩蔽,则中断不能立即得到响应此时中断被悬起中断的悬起状态可以通过“中断设置悬起寄存器(SETPEND)”和“中断悬起清除寄存器(CLRPEND)”来读取,还可以写它们来手工悬起中断悬起寄存器和“解悬”寄存器也可以有 8 对SETPEND/CLRPEND 寄存器族:SETPENDs:0xE000_E200 – 0xE000_E21CCLRPENDs:0xE000E280 - 0xE000_E29C STM32(Cortex-M3)中优先级的概念优先级每个外部中断都有一个对应的优先级寄存器,每个寄存器占用 8 位,但是允许最少只使用最高 3 位4 个相临的优先级寄存器拼成一个 32 位寄存器。

      如前所述,根据优先级组设置,优先级可以被分为高低两个位段,分别是抢占优先级和亚优先级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 位用于指定抢占式优先级在 STM32F10x_StdPeriph_Lib_V3.5.0 中的 misc.h 有如下定义:(1)/*!NVIC_IRQChannel:中断通道的选择NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority:中断通道的抢占式优先级的级别。

      NVIC_InitStruct->NVIC_IRQChannelSubPriority:中断通道的亚优先级的级别NVIC_InitStruct->NVIC_IRQChannelCmd:失能或者使能中断通道设置 NVIC 中断的向量表地址void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset)需要注意的几点:1.如果指定的抢占式优先级的级别或响应优先级的级别超出了选定的优先级组所限定的范围,则可能导致意想不到的结果2.抢占式优先级别相同的中断源之间没有嵌套关系3.如果某个中断源被指定为某个抢占式优先级别,又没有其他的中断源处于同一个抢占式优先级别,则可以为这个中断源指定任意有效的响应优先级别开总中断和关总中断在 STM32F10x_StdPeriph_Lib_V3.5.0 中的 core_cm3.h 有如下定义:/*!< global Interrupt enable */#define __enable_irq __enable_interrupt/*!< global Interrupt disable */#define __disable_irq __disable_interrupt 王飞2011-03-14郑州市国家大学科技园 。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.