ST开关总中断的函数在哪呢

[复制链接]
1808|12
 楼主| blong75 发表于 2015-11-23 20:18 | 显示全部楼层 |阅读模式
ST中怎样像51单片机一样,直接使用EA=1或者EA=0来直接开关中断呢?
白丁野老 发表于 2015-11-23 21:35 | 显示全部楼层
STM32的中断源比较多,用到什么中断就使能指定的中断,教程都有讲,如果你想像51一样一次使能所有中断那就用下面这个
INTX_ENABLE();//使能全部中断
冒泡的鱼儿 发表于 2015-11-23 23:01 | 显示全部楼层
__set_PRIMASK();这条语句足够了
麦可可 发表于 2015-11-23 23:01 | 显示全部楼层
白丁野老 发表于 2015-11-23 21:35
STM32的中断源比较多,用到什么中断就使能指定的中断,教程都有讲,如果你想像51一样一次使能所有中断那就 ...

这个函数是什么意思呢?我怎么在库函数中没有找到?
葫芦娃75 发表于 2015-11-24 11:12 | 显示全部楼层
__set_PRIMASK();
是 core_cm3.c 里定义的内核函数. 用于写 PRIMASK 寄存器.
编译后生成一条 mrs R0, PRIMASK 的指令.
september7 发表于 2015-11-24 11:16 | 显示全部楼层
在 STM32/Cortex-M3 中是通过改变 CPU 的当前优先级来允许或禁止中断。  
PRIMASK 位:只允许 NMI 和 hard  fault 异常,其他中断/  异常都被屏蔽(当前 CPU 优先级=0)。  
FAULTMASK 位:只允许 NMI,其他所有中断/异常都被屏蔽(当前 CPU 优先级=-1)。
sunriselight 发表于 2015-11-24 11:24 | 显示全部楼层
下面两个函数等效于关闭总中断:  
void NVIC_SETPRIMASK(void);  
void NVIC_SETFAULTMASK(void);
下面两个函数等效于开放总中断:  
void NVIC_RESETPRIMASK(void);  
void NVIC_RESETFAULTMASK(void);
eggbiscuit 发表于 2015-11-24 11:25 | 显示全部楼层
可以用下面这种办法
#define CLI()      __set_PRIMASK(1)  
#define SEI()      __set_PRIMASK(0)  
蜕变吧 发表于 2015-11-24 22:44 | 显示全部楼层
eggbiscuit 发表于 2015-11-24 11:25
可以用下面这种办法
#define CLI()      __set_PRIMASK(1)  
#define SEI()      __set_PRIMASK(0)   ...

非屏蔽中断也会禁止么?NMI呢?
月正浓 发表于 2015-11-25 10:35 | 显示全部楼层
sunriselight 发表于 2015-11-24 11:24
下面两个函数等效于关闭总中断:  
void NVIC_SETPRIMASK(void);  
void NVIC_SETFAULTMASK(void);

在最新的库中,已经没有这种方法了
月正浓 发表于 2015-11-25 10:36 | 显示全部楼层
蜕变吧 发表于 2015-11-24 22:44
非屏蔽中断也会禁止么?NMI呢?

你可以看看M3的寄存器,这个应该是屏蔽所有中断的。
月正浓 发表于 2015-11-25 10:37 | 显示全部楼层
eggbiscuit 发表于 2015-11-24 11:25
可以用下面这种办法
#define CLI()      __set_PRIMASK(1)  
#define SEI()      __set_PRIMASK(0)   ...

你可以看看6楼的回复,PRIMASK 位:只允许 NMI 和 hard  fault 异常,其他中断/  异常都被屏蔽(当前 CPU 优先级=0)。  
陌小生 发表于 2015-11-26 22:29 | 显示全部楼层
eggbiscuit 发表于 2015-11-24 11:25
可以用下面这种办法
#define CLI()      __set_PRIMASK(1)  
#define SEI()      __set_PRIMASK(0)   ...

那是不是还可以宏定义FAULTMASK这个寄存器呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

83

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部