原创 (转载)Cortex-M0/M0+屏蔽优先级低于BASEPRI设定的中断

2020-7-23 10:44 114 1 1 分类: MCU/ 嵌入式 文集: STM32应用

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(最低优先级)。

中断号优先级值优先级
10x00最高
170x00最高
180x40
190x40
140x80
250x80
80xc0最低
310xc0最低
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、定义中断使能控制宏
// 仅使能优先级值小于0x40的中断源(最高优先级中断源) 
// 相当于 BASEPRI = 0x40
#define SET_BASEPRI_40 NVIC->ICER = 0xffffffff;  NVIC->ISER = BASEPRI_0x40

// 使能优先级值小于0x80的中断源
/ 相当于 BASEPRI = 0x80 
#define SET_BASEPRI_80 NVIC->ICER = 0xffffffff; NVIC->ISER = BASEPRI_0x80

// 使能优先级值小于0xc0的中断源 
// 相当于 BASEPRI = 0xc0 
#define SET_BASEPRI_C0 NVIC->ICER = 0xffffffff; NVIC->ISER = BASEPRI_0xc0

// 使能所有中断源 
// 相当于 BASEPRI = 0x00 
#define SET_BASEPRI_00 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条评论)

登录后参与讨论
相关推荐阅读
RLink 2020-09-10 14:49
rtthread scons使用备注
1. 更改默认环境变量使用scons编译时,RTT_CC环境变量用于标识编译时使用的工具链,默认配置使用gcc,如果需要修改为iar,则可以编辑文件env_released_1.2.0\env\too...
RLink 2020-07-23 16:20
(转载)中断控制及basepri 与 basepri_max
转载自https://www.cnblogs.com/qiyuexin/p/8921718.html目录FAULTMASKPRIMASKBASEPRIBASEPRI_MAX 正文1、总开关每...
RLink 2020-07-23 11:27
(转载)ucos中的三种临界区管理机制
熟悉ucos,或者读过Jean.J.Labrosse写过的ucos书籍的人,一定会知道ucos中著名的临界去管理宏:OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()。同样是...
RLink 2020-07-09 15:12
STM32L系列I2C应用注意
噪音滤波器I2C模块包含模拟噪音滤波器和数字噪音滤波器,其中模拟噪音滤波器可以抑制尖峰宽度高达50ns(满足快速模式协议规格),用户可以选择关闭这一特性;数字滤波器抑制尖峰噪音的长度可以通过软件配置,...
RLink 2020-07-04 06:23
STM32L系列电源管理
电源供应1. VDD -> 1.8V~3.6V,用于内部电压调整器和IO供电,通过外部管脚引入2. Vcore -> 1.2V~1.8V ,用于内部的各数字外围模块、SRAM和FLASH供电,通过内部...
广告
EE直播间
更多
我要评论
0
1
广告
关闭 热点推荐上一条 /6 下一条