2013-10-10 41 views
0

如何在C中使用mspgcc啓用和禁用(清除並設置GIESR位)?如何使用C啓用/禁用mspgcc中的中斷?

+0

可能重複的例子:http://stackoverflow.com/q/47981/694733 – user694733

+0

@ user694733:不重複。通常不使用簡單的按位運算符來訪問MSP430中的GIE SR位,因爲在C中沒有定義代表狀態寄存器的符號。 – tinman

+0

這不是重複的狀態寄存器(SR)是一個處理器寄存器,而不是一個正常的內存映射寄存器。我找到了解決辦法,見下文。 – tylerjw

回答

3
/*interrupt.c 
[email protected] 
GPL 
*/ 
#include <msp430g2553.h> 
#define LED1 BIT0 
#define LED2 BIT6 
#define BUTTON BIT3 
volatile unsigned int i;//to prevent optimization 
void main(void) 
{ 
WDTCTL=WDTPW+WDTHOLD; 
P1DIR |= (LED1+LED2);// 
P1OUT &= ~(LED1+LED2); 
P1IE |= BUTTON; 
P1IFG &= ~BUTTON; 

//__enable_interrupt();//enable all interrupts 
_BIS_SR(LPM4_bits+GIE); 
for(;;) 
{} 
} 

//port1 interrupt service routine 
#pragma vector=PORT1_VECTOR 
__interrupt void Port_1(void) 
{ 
P1OUT ^= (LED1+LED2); 
P1IFG &= ~BUTTON; 
P1IES ^= BUTTON; 
} 

這是中斷 http://importgeek.wordpress.com/tag/msp430-launchpad/

1

您可以使用__eint()/ __dint()內聯函數:

#include <intrinsics.h> 
... 
    __eint(); 
    /* Interrupts enabled */ 
    __dint(); 
    /* Interrupts disabled */ 

或者你可以使用__bis_status_register()/ __bic_status_register()內聯函數:

#include <msp430.h> 
#include <intrinsics.h> 
... 
    __bis_status_register(GIE); 
    /* Interrupts enabled */ 
    __bic_status_register(GIE); 
    /* Interrupts disabled */ 

或一intrinsics.h中的許多其他兼容性定義。請注意,還有一些特殊版本,例如__bis_status_register_on_exit()/ __bic_status_register_on_exit(),它將在從ISR退出時更改標誌的狀態。

+0

我正在使用'mspgcc',並得到'致命錯誤:intrinsics.h:沒有這樣的文件或目錄,'__eint()'和'__dint()'產生錯誤。 – tylerjw

+0

@tylerjw:你使用的是什麼版本的mspgcc?您應該將這些信息添加到問題中,因爲它會改變答案的有效性。 – tinman

+0

適合我的作品,謝謝,完美! (4.6.1在這裏) –

0

通過實驗我發現它可以啓用_BIS_SR(GIE);並禁用_BIC_SR(GIE);而不包括除標準msp430g2553.h文件之外的任何內容。