본문 바로가기
3. 개발 관련/정리 :: issue 와 resovle

MSP430 중첩 인터럽트 P2IFG와 GIE

by kyuho.choi 2009. 7. 9.
728x90
반응형
내용을 정리하다 보니 복잡해져서 다시 정리 -_-

오늘은 진실로 정리가 필요하구나.

P1/P2인터럽트 플래그와 관련하여 P2IFG 레지스터가 존재하는 데,

이레지스터의 셋팅값에 따라 인터럽트 pending여부를 설정할 수 있다.

Bit = 0 -> No interrupt is pending
Bit = 1 -> An interrupt is pending

GIE의 경우(r2 레지스터 셋팅 값)

Bit = 0 -> An interrupt is pending
Bit = 1 -> No interrupt is pending

으로 정의가 된다.

위의 내용으로 보아 P2IFG(Port Interrupt Flag)와 GIE(General Interrupt Enable)가 상반된 값을 이용하지만

결과적으로 동일한 설정을 하 게 됨을을 알 수 있다.

머릿속이 복잡해지지만 Texas Instruments는 이런 나의 이해를 돕기위하여 매뉴얼을 배포하고 있었다.

====== clear P2IFG reg and set GIE =======

MOV.B &P2IFG, r5 ; read int flag
BIC.B r5, &P2IFG ; clear int flag
EINT ; set GIE to enable Monitor and nested int

그렇다!!

P2IFG를 클리어 시킴은 GIE를 nesting에 대하여 enable로 설정한다는 것을 알 수 있다.

위에서 r5 는 범용 레지스터로 사용되며 0000h, 즉 0으로 클리어 되어 있다.

또한 EINT(Enable Interrupt)의 설정 내용은 아래와 같다.

/* Enable/Disable interrupts */
#define eint() __asm__ __volatile__("eint"::)
#define dint() __asm__ __volatile__("dint"::)

/* IAR compatibility functions */
#define _EINT() eint()
#define __enable_interrupt() eint()
#define _DINT() dint()
#define __disable_interrupt() dint()

마찬가지로 EINT가 있으니 DINT도 위와 같이 정의되어 있다.
728x90
반응형

댓글