文档章节

STM32 异常与中断

 奔跑的夕阳_
发布于 2017/08/17 10:35
字数 1056
阅读 64
收藏 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
破坏STM32中断机制引发的异常

破坏STM32中断机制引发的异常 现象描述 我将一个具有实时任务切换功能的小型嵌入式操作系统内核成功的从具有ARM7内核的ADUC7024芯片移植到了具有cortex内核的LM3S8962芯片,然而在移植到同样...

ifreecoding
2012/09/08
994
0

没有更多内容

加载失败,请刷新页面

加载更多

支付宝客户端架构分析:自动化日志收集及分析

摘要: 《支付宝客户端架构解析》系列将从支付宝客户端的架构设计方案入手,带领大家进一步了解支付宝在客户端架构上的迭代与优化历程。 小蚂蚁说: 《支付宝客户端架构解析》系列将从支付宝...

阿里云官方博客
7分钟前
0
0
nginx中部署vue打包后的静态文件

如何在nginx中部署静态资源就不描述了, 请看我的这篇博客 将vue脚手架项目打包后的静态文件放到nginx上, 发现有个问题, 即url上有#, 怎么去掉这个#呢. 1 项目中router的mode 路由的mode要为h...

克虏伯
25分钟前
5
0
JS容易理解错误的地方

在这端代码执行的末尾,你会不会hi变量回事函数中的hi了?你会不会认为这不是按引用传递了? 对值传递和引用传递产生质疑了? 1 var hi = {};2 function sayHello(hi) { ...

器石_
27分钟前
3
0
Java开发学习--MongoDB

之前只学过sql,第一次使用非关系型数据库。以前对于关系型数据库与非关系型数据库的概念很模糊,通过这次的学习对这两者有了一个清晰的概念。 主键 在MongoDB中,主键名叫"_id",如果在生成...

微笑向暖wx
30分钟前
1
0
Java8-2-Lambda表达式实战-一句话实现Map中按照Value排序

今天我们来实战一把, 对Map的Value值排序进行简化. 如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:854630135,群...

编程SHA
33分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部