文档章节

STM32 异常与中断

 奔跑的夕阳_
发布于 2017/08/17 10:35
字数 1056
阅读 48
收藏 0

    Cortex_M3的内核编号1-15为系统异常,大于等于16的为外部中断。

    所有能打断正常执行流的事件都称为异常。异常是因为内核活动产生的(执行指令或访问存储器),对CM3来讲是同步的。

    中断对CM3核来说是意外突发事件,是来自外设的请求信号,对CM3来讲是异步的。

 

    异常分为不同的优先级,优先级的数值越小,优先级越高。

    CM3支持中断嵌套,使得高优先级异常会抢占低优先级的异常。

    有三个系统异常:复位、NMI、以及硬fault。它们优先级固定且都是负数,使得它们优先级最高。其余的异常的优先级都是可编程的。

    原则上,CM3支持3个固定的高优先级和256个可编程的优先级,支持128级抢占。最少使用三位表达优先级,即最少支持8级优先级。

抢占优先级与子优先级

优先级组把优先级分为高低两段。

    子优先级最少是一位,抢占优先级最多能有7位表示。也就是说CM3原则上支持128级抢占。

    例子:如果只使用 3 个位来表达优先级([7:5]),并且优先级组的值是 5(从比特 5 处分组),则得到 4 级抢占优先级,且在每个抢占优先级的内部有 2 个子优先级。

向量表

    当系统发生异常并要响应该异常的时候,CM3要定位其服务例程的入口地址,这些入口地址就存在向量表中。缺省时,默认位于零地址,各向量占用4字节,故各表项占用4字节。

    零地址一般用于存储引导代码。所以一般将向量表映射到FLASH或者RAM,它们的值在运行时不得被改变。

    为了支持动态重分发中断, CM3 允许向量表重定位——从其它地址处开始定位各异常向量。这些地址对应的区域可以是代码区,但更多是在 RAM 区。在 RAM 区就可以修改向量的入口地址了。为了实现这个功能, NVIC 中有一个寄存器,称为“向量表偏移量寄存器”(在地址 0xE000_ED08 处),通过修改它的值就能重定位向量表。但必须注意的是:向量表的起始地址是有要求的:必须先求出系统中共有多少个向量,再把这个数字向上“圆整”到 2 的整次幂,而起始地址必须对齐到后者的边界上。例如,如果一共有 32 个中断,则共有 32+16(系统异常) =48 个向量,向上圆整到 2 的整次幂后值为 64,因此向量表重定位的地址必须能被 64*4=256 整除,从而合法的起始地址可以是: 0x0, 0x100, 0x200 等。向量表偏移量寄存器的定义如表 7.7 所示。

  

    如果需要动态地更改向量表,则对于任何器件来说,向量表的起始处都必须包含以下向量:
 主堆栈指针(MSP)的初始值
 复位向量
 NMI
 硬 fault 服务例程
    后两者也是必需的,因为有可能在引导过程中发生这两种异常。
    可以在 SRAM 中开出一块空间用于存储向量表。在引导期间先填写好各向量,然后在引导完成
后,就可以启用内存中的新向量表,从而实现向量可动态调整的能力。

  中断悬起

    

    当中断输入脚被置为有效(asser) t 后,该中断就被悬起。即使后来中断源撤消了中断请求,已经被标记成悬起的中断也被记录下来。到了系统中它的优先级最高的时候,就会得到响应。
    但是,如果在某个中断得到响应之前,其悬起状态被清除了(例如,在 PRIMASK 或 FAULTMASK置位的时候软件清除了悬起状态标志),则中断被取消。

© 著作权归作者所有

共有 人打赏支持
粉丝 1
博文 11
码字总数 3649
作品 0
杭州
STM32F10xxx20xxx21xxxL1xxxx Cortex-M3程序设计手册 阅读笔记二(5):Cortex-M3处理器能量管理

Stm32和Cortex-M3处理器睡眠模式降低能量损耗: 睡眠模式停止处理器时钟,所有其它系统和外设时钟保持运行。 深度睡眠模式停止了大部分stm32系统和外设时钟。在产品级别,可能相应的为停止模...

qq_35014146
03/28
0
0
STM32之SysTick定时器

SysTick-------操作系统的心跳 SysTick是系统滴答定时器,可以说是操作系统的的“心跳”,它被绑在NVIC中,用于产生SysTick异常(异常号:15)。一旦产生SysTick异常,就会产生滴答中断,这个...

panrenqiu
04/14
0
0
STM32系统滴答_及不可不知的延时技巧 - (上)

我想每个单片机爱好者及工程开发设计人员都有过点灯的经历。流水灯是个好东西,尤其是在调试资源有限的环境中,有时会帮上大忙。 然在最初入门时,如何让这些小灯们按照我们的想法欢快地跑起...

小汉憨憨
2014/04/29
0
0
SysTick的优先级是高还是低

SysTick系统嘀嗒定时器并非STM32独有的,它是Cortex内核的部分,CM3为它专门开出一个异常类型,并且在中断向量表中占有一席之地(异常号15)。这样它可以很方便的移植到不同厂商出CM3内核...

OceanStack
2015/01/24
0
0
[Beautifulzzzz的博客目录] 快速索引点这儿O(∩_∩)O~~,红色标记的是不错的(⊙o⊙)哦~

3D相关开发 [direct-X] 1、direct-X最小框架 [OpenGL] 1、环境搭建及最小系统 [OpenGL] 2、企业版VC6.0自带的Win32-OpenGL工程浅析 51单片机 [51单片机] 1602液晶显示控制代码 [51单片机] 1...

史迪奇2号
2017/08/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

人生苦短:Python里的17个“超赞操作

人生苦短,我选Python”。那么,你真的掌握了Python吗? 1. 交换变量 有时候,当我们要交换两个变量的值时,一种常规的方法是创建一个临时变量,然后用它来进行交换。比如: # 输入 a = 5 b ...

糖宝lsh
42分钟前
4
0
咕泡-spring中常用设计模式概述

设计模式就是经验之谈,供后人借鉴,解决一些具有代表性的问题 设计模式来源于生活,反过来帮助我们更好生活 设计模式提升代码的可读性、可扩展性、维护成本、复杂业务问题 千万不要死记硬背...

职业搬砖20年
今天
2
0
day59-20180817-流利阅读笔记-待学习

假·照骗,真·社交焦虑 雪梨 2018-08-17 1.今日导读 发朋友圈之前,不少人为了展现更美好的生活状态会对照片加以“微调”,或是加个滤镜显得逼格更高,或是磨个皮瘦个脸拉个大长腿。现在,国...

aibinxiao
今天
19
0
OSChina 周五乱弹 —— 姑娘在这个节日里表白你接受么?

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @Sharon啊:完全被这个小姐姐圈粉了,学两首她的歌去哈哈 分享王贰浪的单曲《往后余生(翻自 马良)》 《往后余生(翻自 马良)》- 王贰浪 手...

小小编辑
今天
949
16
为什么HashMap要自己实现writeObject和readObject方法?

为什么HashMap要自己实现writeObject和readObject方法? 如果你有仔细阅读过HashMap的源码,那么你一定注意过一个问题:HashMap中有两个私有方法。 private void writeObject(java.io.Objec...

DemonsI
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部