CM3/STM32的中断优先级设定

在STM32的手册里没有提到关于设置中断优先级的情况,只列给出了中断向量表。根据该向量表可以创建一个中断编号的枚举数据,方便设置优先级及使能等的使用。


先说一下如何设置优先级。

优先级的设置在Cortex-CM3中:异常  -> 优先级定义  中有描述;针对优先级的寄存器描述需要查看Cortex-M3编程手册。

可在此处下载手册:http://download.csdn.net/detail/gao_xyz/9780686


1、优先级组的设置

在权威指南 优先级定义中有描述,其优先级由:抢占优先级 和 子优先级组成。

此处需注意:抢占优先级,顾名思义,可以抢占CPU的,当有更高的抢占优先级时,可打断低抢占优先级的中断;同一抢占优先级,当更高的子优先级来临,是不能打断的;当抢占优先级及子优先级都相同时,且中断同时到来,则先执行中断编号小的中断。

(在ucos中就是把PendSV中断和Systick中断设置为抢占及子优先级一致,因此,当在Systick中延时减到零,把其任务放入就绪,并引发调度,而没有立即进入PendSv中断服务函数的原因)


当然既然有抢占优先级和子优先级,那就要看是如何分配的,具体描述可见其编程手册,在权威指南中 优先级定义 部分的中断复位和控制寄存器中也可看书,有个PRIGROUP的位段(8-10,共3位。从0数起),用于设置优先级分组,其分组就对应的抢占优先级及子有限级对应情况如下:

但是并不是所有位都用上的。不同的芯片可能支持的中断级数不一样,有8级,16级,32级等。这个在芯片生产的时候就定好了使用那几位的。如只支持8级中断编程的,只使用3位设置抢占优先级和子优先级。目前使用的是高位,低位不用,如图:

为何使用高位(MSB)对齐呢?具体解释如下:


注:对于设置优先级组寄存,需要先写入访问键值(相当于说对该寄存器的保护作用),之后再写入需要设置的分组数据。


2、各优先级的设置

各中断的优先级的设置只要把设置的数据写入该中断对应的寄存器即可。

具体说一下程序中的设计:

从STM32的手册中断向量部分可以知,各中断向量表的位置是顺序排放的(4字节为单位),看M3编程手册可知,优先级的对应关系与其向量变的排列顺序是一致的,且每8位设置1个优先级。

在上面提到的,根据向量表枚举出各中断的中断编号,需要设置优先级时,通过中断编号来处理就可以了。

注:在设置优先级中,不要随意更改优先级组,不然其他设置的优先级会发生改变,结果不可意料。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值