2011년9월5일_ARM_AT91SAM7S256 DBGU모드와 1Bytes송수신함수, 문자열을 전송하는 함수, 컴퓨터(PC)와 ARM보드간 RS232인터페이스로 연결하여 하이퍼터미널에서 입력한 문자로 ARM보드제어(LED, LCD등등)
● AT91SAM7S256 DBGU모드
AT91SAM7S256 MCU는 시리얼통신에서 통신속도(보레이트), 데이터비트, 정지비트, 핸드쉐이킹 뿐만 아니라 통신모드가 존재한다.
USART장치에는 적외선 통신(IrDA)을 위한 모드도 있으나 DBGU에는 없다.
DBGU은 USART 기능의 일부를 상속받은 것 처럼 상기의 네 가지 모드를 가진다.
※ USART의 기능이 더 많다.
일반적으로 PC와 통신을 하려면 정상 모드를 사용해야 하고,
만약 ARM Board밖에 없는데 테스트를 해야 하는 상황이라면 로컬 루프백 모드를 사용하면 되겠다.
그리고 PC와 ARM Board사이에 전송선과 PC에 작성된 어플리케이션을 테스트하고 싶다면 자동에코나 리모트 루프백 모드를..
사용하면 ARM Board의 F/W와는 무관하니 마음껏 전송라인과 어플리케이션을 테스트할 수 있을 것이다.
★ 루프백은 TCP/IP소켓통신에서의 로컬루프백주소 127.0.0.1과 같은 것이라 보면 된다.
그럼 이를 코드로 표현해 보기 위해 레지스터를 살펴보자.
Datasheet p.224 (2011년 5월판)을 보면 모드설정을 위한 레지스터의 이름이 DBGU_MR이라는 것을 알 수 있다.
DBGU모드 관련 레지스터인 DBGU_MR을 살펴보니 9~11번 비트와 14~15번 비트만 사용하고,
패리티을 없애는 설정을 하려고 보니 1 x x이다. x는 Don’t care로 0 또는 1 어떤 값이 들어가도 상관없다는 뜻이나..
우리는 0을 넣자. 그래서 1 0 0 을 넣어야 하니 이를 십진수로 바꾸면 4이다.
4를 9번 좌측으로 시프트하면 패리티설정은 끝난다.
이제 중요한 모드설정을 해야한다.
노멀모드가 윤교수님 책의 정상모드로 PC와 통신시에 해야 되는 모드이다.
0 0을 넣어야 하니 아무일도 하지 않아도 되나 0을 14번 시프트하자.
이를 코드로 바꾸면 아래와 같다.
// 5. 포트 모드 설정. |
● 1Byte 전송함수 Send_Char()
순서
① DBGU_SR 레지스터의 1번 비트 TXRDY가 1이 될 때까지 대기. 0이면 전송불가. (블로킹)
② DBGU_THR에 전송할 데이터를 쓰기.
설명은 노트참조
● 문자열 전송함수 Send_String()
변수를 쓰지 말고 아래와 같은 원형의 함수를 작성하라.
void Send_String(void *vpData) |
void포인터라 크기를 알 수 없으니 바로 읽어 올 수는 없다.
그러므로 1Byte씩 Send_Char()의 인자의 데이터type과 맞추기 위해 (unsigned char *)로 캐스팅한다.
캐스팅만 하면 그 자체는 아직 주소값이 들어 있으므로 *를 써서 주소값을 참조하여 1Byte씩 읽어 올 수 있도록 한다.
while문의 종료 조건은 문자열의 끝인 NULL문자가 될 때까지이고,
최초부터 검사하여 계속 vpData의 주소값을 1Byte씩 증가시켜 1Byte를 읽어와 Send_Char()로 전송한다.
8행의 캐스팅은 필요없다고 하나 있으면 더 안전해 보인다.
증가연산자 ++을 캐스팅 왼쪽에 두면 경고메시지가 뜬다.
● DBGU관련 함수와 레지스터 모음 DBGU.h와 DBGU.c
● PC와 연결하여 ARM Board에 연결된 LED를 제어하는 소스코드 (전체)
one()는 PA0에 연결된 LED의 상태를 토글시키는 함수로 하이퍼터미널에서 ‘1’을 보내면 수행된다.
two()는 LCD와 터미널로 문자열을 출력하는 함수로 하이퍼터미널에서 ‘2’를 보내면 수행된다.
분할컴파일하니 파일이 많아 올리기 번거러움. 그러니 압축하여 파일을 첨부함.