Cortex-M3/M4/M7有BASEPRI特殊功能寄存器可以屏蔽优先级低于BASEPRI设定值的中断,但Cortex-M0/M0+没有BASEPRI寄存器,不过仍然可以实现相识的功能。
mingdu.zheng at gmail dot com
http://blog.csdn.net/zoomdy/article/details/79316998
实现方法
虽然Cortex-M0/M0+没有BASEPRI寄存器,但是仍然有NVIC,而且M0/M0+最多只有32个中断源,因此操作一个寄存器就可以影响所有中断源。假设使用了8个中断源,其中1、17中断优先级值为0x00(最高优先级),18、19中断优先级值为0x40,14、25中断优先级值为0x80,8、31中断优先级值为0xC0(最低优先级)。
中断号 | 优先级值 | 优先级 |
---|
1 | 0x00 | 最高 |
17 | 0x00 | 最高 |
18 | 0x40 | 高 |
19 | 0x40 | 高 |
14 | 0x80 | 低 |
25 | 0x80 | 低 |
8 | 0xc0 | 最低 |
31 | 0xc0 | 最低 |
1、定义优先级分组宏
#define BASEPRI_0x40 ((1 << 1) | (1 << 17))
#define BASEPRI_0x80 (BASEPRI_0x40 | (1 << 18) | (1 << 19))
#define BASEPRI_0xc0 (BASEPRI_0x80 | (1 << 14) | (1 << 25))
#define BASEPRI_0x00 (BASEPRI_0xc0 | (1 << 8) | (1 << 31))
2、定义中断使能控制宏
NVIC->ICER = 0xffffffff; NVIC->ISER = BASEPRI_0x40
NVIC->ICER = 0xffffffff; NVIC->ISER = BASEPRI_0x80
NVIC->ICER = 0xffffffff; NVIC->ISER = BASEPRI_0xc0
NVIC->ICER = 0xffffffff; NVIC->ISER = BASEPRI_0xff
3、使用
SET_BASEPRI_40;
...
SET_BASEPRI_00;
...
4、优化
封装成和CMSIS-CORE API一样的实现,这样看起来就像真的在操作BASEPRI了。
static inline void __set_BASEPRI(uint32_t value)
{
if(value == 0) {
SET_BASEPRI_00;
} else if(value <= 0x40) {
SET_BASEPRI_40;
} else if(vlaue <= 0x80) {
SET_BASEPRI_80;
} else {
SET_BASEPRI_c0;
}
}
缺陷
SVCall、PendSV和SysTick中断的使能不是NVIC_ISER控制的,因此这里的方法没有办法处理这三个中断。
文章评论(0条评论)
登录后参与讨论