본문 바로가기
코스웨어/15년 스마트컨트롤러

20150814 11번 남수진 - ARM(DBGU 수신 인터럽트 사용)

by 알 수 없는 사용자 2015. 8. 14.
728x90
반응형


  • 데이터시트 분석
    • DBGU는 System Controller에 속한다
        • 인터럽트를 사용하기위해서는 System Controller PID(1) 비트의 AIC 인터럽트를 활성화해야함
        • 제어 레지스터
          • System Controller에 해당하는 레지스터 영역를 제어한다
          • AIC_IDCR, AIC_IECR -> 인터럽트 기능 비활성화/활성화
          • AIC_SVR  -> 인터럽트 핸들러 함수 등록
          • AIC_SMR  -> 인터럽트 동작 모드, 동작 edge(or level) 결정
          • AIC_ICCR  -> 이전에 들어온 인터럽트 제거
    • DBGU의 송/수신은 PIO를 통해 외부 통신 핀 PA9, PA10과 연결된다
        • PIO 레지스터를 통해 핀 기능을 DBGU로 설정할 필요가 있다
        • 제어 레지스터
          • PIOA_PDR  -> PA9, 10의 PIO 기능 OFF
          • PIOA_ASR  -> PA9, 10의 Peripheral A 기능 ON
    • DBGU에서 UART 통신을 제어한다
        • UART 통신 설정
        • DBGU 내부에서 인터럽트 enable을 시켜야함
        • 제어 레지스터
          • DBGU_MR, DBGU_BRGR -> UART 설정
          • DBGU_CR  -> DBGU 송/수신 활성/비활성화
          • DBGU_IER -> DBGU 인터럽트 활성화







  • DBGU의 수신인터럽트 동작을 테스트하기위한 프로그램 작성  


    • 기존의 Dbgu_Init() 함수를 3개로 나눈다



  • DBGU 수신 인터럽트를 위한 DBGU 초기화

    1. DBGU로 사용할 핀 설정

      1. PIO기능 OFF

      2. Peripheral A 로 설정

    2. DBGU RX&TX disable

    3. UART 통신 설정

      1. baudrate = 115200

      2. parity = even

      3. mode = normal

    4. System Controller 인터럽트 disable

    5. 인터럽트 호출시 실행할 핸들러 함수 등록

    6. 인터럽트 동작모드, 우선순위 결정

      1. 동작모드 : positive edge에서 인터럽트 발생

      2. 우선순위 : 최하위

    7. Command Register Clear

      1. 이전에 들어온 인터럽트 제거

    8. DBGU 인터럽트 enable

    9. System Controller 인터럽트 enable

    10. DBGU RX&TX enable




  • 문자열 전송 함수 만들기



  • 수신 인터럽트 발생시 실행할 동작 함수



  • DBGU 수신 인터럽트 핸들러




  • 실행결과



 dbgu.c 소스 내용


#include <AT91SAM7S256.h>

#include "project.h"




void Dbgu_Str(char * cpStr)

{

while( 0 != *cpStr )

{

Dbgu_Tx(*cpStr);

++cpStr;

}

}


void Dbgu_Menu(void)

{

Dbgu_Str("1. Lcd Print\n\r");

Dbgu_Str("M. Menu Print\n\r");

}


void Dbgu_Rx_ISR(void)

{

switch(  (*AT91C_DBGU_RHR)&(0x000000FF)  ) // 레기값 제거

{

case 'M' :

case 'm' : Dbgu_Menu();

break;

default : Dbgu_Str("Wrong Command\n\r");

Dbgu_Menu();

break;

}

}


void Dbgu_Init_Polling(void)

{

*AT91C_PIOA_PDR = AT91C_PA9_DRXD|AT91C_PA10_DTXD;

*AT91C_PIOA_ASR = AT91C_PA9_DRXD|AT91C_PA10_DTXD;

*AT91C_DBGU_CR = AT91C_US_RSTRX|AT91C_US_RSTTX;

*AT91C_DBGU_MR = AT91C_US_CHMODE_NORMAL|AT91C_US_PAR_EVEN;

*AT91C_DBGU_BRGR = DBGU_CD;


*AT91C_DBGU_CR = AT91C_US_RXEN|AT91C_US_TXEN;


return;

}


void Dbgu_Init_ISR(void)

{

*AT91C_PIOA_PDR = AT91C_PA9_DRXD|AT91C_PA10_DTXD;

*AT91C_PIOA_ASR = AT91C_PA9_DRXD|AT91C_PA10_DTXD;

*AT91C_DBGU_CR = AT91C_US_RSTRX|AT91C_US_RSTTX;


// DBGU 통신 설정

*AT91C_DBGU_MR = AT91C_US_CHMODE_NORMAL|AT91C_US_PAR_EVEN;

*AT91C_DBGU_BRGR = DBGU_CD;



*AT91C_AIC_IDCR = 1<<AT91C_ID_SYS;


AT91C_AIC_SVR[AT91C_ID_SYS] = (unsigned int)Dbgu_Rx_ISR;

AT91C_AIC_SMR[AT91C_ID_SYS] = 

AT91C_AIC_SRCTYPE_POSITIVE_EDGE|AT91C_AIC_PRIOR_LOWEST;

*AT91C_AIC_ICCR = 1<<AT91C_ID_SYS;


*AT91C_DBGU_IER = AT91C_US_RXRDY;

*AT91C_AIC_IECR = 1<<AT91C_ID_SYS;


*AT91C_DBGU_CR = AT91C_US_RXEN|AT91C_US_TXEN;


return;

}


void Dbgu_Init(void)

{

Dbgu_Init_ISR();

//Dbgu_Init_Polling();

return;

}


unsigned char Dbgu_Rx(void)

{

while( 0 == (*AT91C_DBGU_CSR&AT91C_US_RXRDY) );


return *AT91C_DBGU_RHR;

}


void Dbgu_Tx(unsigned char cData)

{

while( 0 == (*AT91C_DBGU_CSR&AT91C_US_TXRDY) );


*AT91C_DBGU_THR = cData;


return;

}









728x90