안녕하세요 EZ-x5 사용자 입니다.
Ezboot를 수정해서 펌웨어에서 시리얼 인터럽트를 사용하려고 하는데 펌웨어를 돌려도 인터럽트가
걸리지 않아서 고수분들께 문제 해결에 대해 도움을 요청합니다.

* 프로그램 구성
메인은 초기화가 끝나고 폴링형태로 시리얼 입력이 있는지 기다립니다.
시리얼 입력이 있으면 PC로 값을 되돌려 줍니다.
인터럽트는 시리얼 인터럽트와 gpio인터럽트를 사용합니다.
어떤 인터럽트든 인터럽트가 걸리면 LED에 일정시간 표시하도록 되어 있습니다.

* 문제점
일단 프로그램을 돌리고 gpio 인터럽트가 걸리도록 gpio에 신호를 넣으면
LED가 들어옵니다. (인터럽트가 걸림)
시리얼 통신을 이용해 한문자를 보내면 보낸 문자가 되돌아 옴니다.(메인루틴 처리)

문제는 이때 수신 인터럽트가 걸려 LED도 같이 들어와야 할 것 같은데 안들어 와서요...
제 생각으로는 시리얼 인터럽트 설정상에 문제라고 생각이 들어서 내용을
내용을 발취해서 첨부했습니다.

보시고 조언 좀 부탁드립니다. 꾸벅


#define __REG(x)                      (x)
static volatile Word *UART = (volatile Word *) STUART; // UART 베이스 어드레스

#define UART_DATA   ((volatile Word) UART[0] )  // 데이타
#define UART_IER        ((volatile Word) UART[1] )  // 인터럽트 허가
#define UART_FCR        ((volatile Word) UART[2] )  // 인터럽트 상태
#define UART_LCR        ((volatile Word) UART[3] )  // 라인 콘트롤
#define UART_MCR        ((volatile Word) UART[4] )  // 모뎀 콘트롤
#define UART_LSR        ((volatile Word) UART[5] )  // 라인 상태
#define UART_MSR        ((volatile Word) UART[6] )  // 모뎀 상태
#define UART_SPR        ((volatile Word) UART[7] )  //
#define UART_ISR        ((volatile Word) UART[8] )  // 적외선 포트 선택

#define UART_DLL        ((volatile Word) UART[0] )  // UART 라인 상태
#define UART_DLH     ((volatile Word) UART[1] )  // UART 라인 상태

/* ====================================
        Irq Handler
==================================== */
void __HandlerIntGpio(void)
{
        LED_Blink();
}

/* ====================================
        Serial Irq Init
==================================== */
void IntInitSerial( void )
{
        Word tmp;

        UART_FCR = FCR_TRFIFOE;                                // Transmit and Receive FIFO Enable
        UART_FCR = ( FCR_TRFIFOE | FCR_RESETRF | FCR_RESETTF );
        UART_FCR = 0;                                                                                        

    /*                                                                                                                          
     * Clear the interrupt registers.                                                                                            
     */                                                                                                                          
    tmp = UART_LSR;                                                                                              
    tmp = UART_DATA;                                                                                              
    tmp = UART_FCR;                                                                                              
    tmp = UART_MSR;                                                                                              
                                                                                                                                    
    /*                                                                                                                          
     * Now, initialize the UART                                                                                                  
     */                                                                                                                          
     UART_LCR = 0x03;                        // N.8.1
                                                                                                                                    
    /*                                                                                                                          
     * Finally, enable interrupts.  Note: Modem status interrupts                                                                
     * are set via set_termios(), which will be occuring imminently                                                              
     * anyway, so we don't enable them here.                                                                                    
     */
        UART_IER = ( IER_UUE | IER_RTIOE | IER_RLSE | IER_RAVIE );

    /*                                                                                                                          
     * And clear the interrupt registers again for luck.                                                                        
     */                                                                                                                          
    tmp = UART_LSR;                                                                                              
    tmp = UART_DATA;                                                                                              
    tmp = UART_FCR;                                                                                              
    tmp = UART_MSR;                                                                                              

}

/* ====================================
        MAIN
==================================== */
int main(int zero, char* arch[])
{

        InitGPIO();                                // GPIO 초기화
        IntInitSerial();                        // SERIAL 인터럽트 초기화

        GFER0 = INT_PIN;                        // 하강에지에서 인터럽트 발생
        ICLR &= ~(INT_GPIO | INT_STUART);       // IRQ 익셉션
        ICMR |= (INT_GPIO | INT_STUART) ;        // GPIO, 시리얼 통신 인터럽트 가능
        
        while(1) {
                if( STLSR & LSR_DR ) {
                        RegValueDump();                // 시리얼 값을 읽기 전 레지스터 값 표시
                        SerialOutChar(STRBR);                // 시리얼 값 표시
                        RegValueDump();                // 시리얼 값을 읽은 후 레지스터 값 표시
                        SerialOutStr("nr",2);        
                }
        }
        return 0;
}