- 데이터시트 분석
- 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 초기화
DBGU로 사용할 핀 설정
PIO기능 OFF
Peripheral A 로 설정
DBGU RX&TX disable
UART 통신 설정
baudrate = 115200
parity = even
mode = normal
System Controller 인터럽트 disable
인터럽트 호출시 실행할 핸들러 함수 등록
인터럽트 동작모드, 우선순위 결정
동작모드 : positive edge에서 인터럽트 발생
우선순위 : 최하위
Command Register Clear
이전에 들어온 인터럽트 제거
DBGU 인터럽트 enable
System Controller 인터럽트 enable
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; } |
'코스웨어 > 15년 스마트컨트롤러' 카테고리의 다른 글
20150819-18번-안해운-일일업무일지 - 초음파센서 SRF05, Timer/Counter (5) | 2015.08.20 |
---|---|
20150818-16번-박태인-일일업무일지 - select 함수로 입출력 다중화 구현 (7) | 2015.08.18 |
업무일지 작성 순서 (0) | 2015.08.18 |
20150817-13번-박서연-일일업무일지 - 어셈블리 레지스터 (5) | 2015.08.17 |
2015-08-13 9번 김태현 업무일지 해커스쿨 level1, VMware 셋팅 (4) | 2015.08.14 |
ARM 인터럽트소스 (1) | 2015.07.31 |
20150730-7번-김재홍-IPC(내부 프로세스 간 통신 설비)통신 (4) | 2015.07.31 |
20150729-6번-김성현-ARM7 (6) | 2015.07.30 |