找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

帖子
查看: 3431|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

STM32開關(guān)總中斷

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:75263 發(fā)表于 2015-6-9 02:58 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
在 STM32/Cortex-M3 中是通過(guò)改變 CPU的當(dāng)前優(yōu)先級(jí)來(lái)允許或禁止中斷。   
PRIMASK 位:只允許 NMI 和 hard  fault異常,其他中斷/  異常都被屏蔽(當(dāng)前 CPU優(yōu)先級(jí)=0)。  
FAULTMASK 位:只允許 NMI,其他所有中斷/異常都被屏蔽(當(dāng)前 CPU 優(yōu)先級(jí)=-1)。  

在 STM32 固件庫(kù)中(stm32f10x_nvic.c 和 stm32f10x_nvic.h) 定義了四個(gè)函數(shù)操作 PRIMASK位和

FAULTMASK 位,改變 CPU 的當(dāng)前優(yōu)先級(jí),從而達(dá)到控制所有中斷的目的。  

下面兩個(gè)函數(shù)等效于關(guān)閉總中斷:  
void NVIC_SETPRIMASK(void);  
void NVIC_SETFAULTMASK(void);
   

下面兩個(gè)函數(shù)等效于開放總中斷:  
void NVIC_RESETPRIMASK(void);  
void NVIC_RESETFAULTMASK(void);
   

上面兩組函數(shù)要成對(duì)使用,不能交叉使用。  

例如:  

第一種方法:  
NVIC_SETPRIMASK();      //關(guān)閉總中斷  
NVIC_RESETPRIMASK();     //開放總中斷   

第二種方法:  
NVIC_SETFAULTMASK();    //關(guān)閉總中斷  
NVIC_RESETFAULTMASK();   //開放總中斷   

常常使用  

NVIC_SETPRIMASK();                // DisableInterrupts  
NVIC_RESETPRIMASK();               // EnableInterrupts

-------------------------------------------------------------------------------------------------
在 3.0 的庫(kù)中   已經(jīng)沒(méi)有  
第一種方法:  
NVIC_SETPRIMASK();    //關(guān)閉總中斷  
NVIC_RESETPRIMASK();   //開放總中斷   

第二種方法:  
NVIC_SETFAULTMASK();    //關(guān)閉總中斷  
NVIC_RESETFAULTMASK();   //開放總中斷   

補(bǔ)充  可以用  
#define CLI()    __set_PRIMASK(1)  
#define SEI()    __set_PRIMASK(0)  

來(lái)實(shí)現(xiàn) (野火的例程用的庫(kù)版本是3.0的,需要使用補(bǔ)充的方法)
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表