본문 바로가기

디지털회로/AT91SAM7S256

AT91SAM7S256을 이용한 UART 통신설정

USART
 
 - 0 , 1 두개 외 DBGU(개발의 용이를 위해 하나 더 지원)로 3개 지원
 - 시리얼 통신 -> PA9, PA10을 사용

 
 

UART 통신설정

 

PIOA.h

#ifndef __PIOA_H__
#define __PIOA_H__

#define PIOA_PER  (*(volatile unsigned int *)0xFFFFF400)
 // Pin enable
#define PIOA_OER  (*(volatile unsigned int *)0xFFFFF410)
 // output enable
#define PIOA_PPUDR  (*(volatile unsigned int *)0xFFFFF460)
 // pull-up resistance disable
#define PIOA_CODR  (*(volatile unsigned int *)0xFFFFF434)
 // 대입하면 0  - clear ouput data
#define PIOA_SODR  (*(volatile unsigned int *)0xFFFFF430)
 // 대입하면 1  - set output data
#define PIOA_ODR  (*(volatile unsigned int *)0xFFFFF414)
 //PIO output Disable Register
#define PIOA_IFER  (*(volatile unsigned int *)0xFFFFF420)
 //PIO Glitch Register
#define PIOA_IER    (*(volatile unsigned int *)0xFFFFF440) 
 //PIO Glitch Register
#define PIOA_ISR    (*(volatile unsigned int *)0xFFFFF44C)
 //몇번에 인터럽트가 발생하는지 알수 있다.

#define PIOA_ODSR  (*(volatile unsigned int *)0xFFFFF438)

 //출력 데이터 상태 레지스터
#define PIOA_IDR    (*(volatile unsigned int *)0xFFFFF444)
//인터럽트 금지 레지스터
#define PIOA_ASR  (*(volatile unsigned int *)0xFFFFF470)
//주변장치 A 선택 레지스터
#define PIOA_BSR  (*(volatile unsigned int *)0xFFFFF474)
//주변장치 B 선택 레지스터
#define PIOA_PDR  (*(volatile unsigned int *)0xFFFFF404)
//병렬 입출력 금지 레지스터 

#endif


 

main.c

#include "PIOA.h"

#define DBGU_CR    (*(volatile unsigned int*)0xFFFFF200)  
  //DBGU 제어 레지스터 (송/수신부)
#define DBGU_IDR  (*(volatile unsigned int*)0xFFFFF20C)  
  //DBGU 금지 레지스터 (관련 인터럽터 비활성화)
#define DBGU_BRGR  (*(volatile unsigned int*)0xFFFFF220)  
  //DBGU 보레이트 발생 레지스터 (포트속도 설정)
#define DBGU_MR    (*(volatile unsigned int*)0xFFFFF204)  
  //DBGU 모드 레지스터 (포트모드 설정)
#define DBGU_SR    (*(volatile unsigned int*)0xFFFFF214)  
  //DBGU 상태 레지스터 
#define DBGU_THR  (*(volatile unsigned int*)0xFFFFF21C)   
 //DBGU 송신 홀딩 레지스터
#define DBGU_RHR  (*(volatile unsigned int*)0xFFFFF218)  
  //DBGU 수신 홀딩 레지스터

#define RSTRX  2
#define RSTTX  3
#define DRXD    9
#define DTXD    10
#define RXEN    4
#define TXEN    6
#define PAR    9
#define CHMODE  14
#define TXRDY  1
#define RXRDY  0

#define MCK    48000000
#define BORETE  115200
#define CD    (MCK/(16*BORETE))

void Usart_init()
{
  DBGU_CR = (1<<RSTRX| 1<<RSTTX);  //송수신부를 리셋, 동작중지
  DBGU_IDR = 0xFFFFFFFF;    //모든 레지스터 1로 설정
  PIOA_ASR = (1<<DRXD | 1<<DTXD);  //PA9, PA10 핀 Peripheral A활성화
  PIOA_BSR = 0x00000000;  //모든  Peripheral B 비활성화
  PIOA_PDR = (1<<DRXD | 1<<DTXD);  //PA9, PA10 핀 Peripheral A비활성화
  DBGU_BRGR = CD;  //cd값 26, MKC = 48MHz
  DBGU_MR = (0<<CHMODE | 4<<PAR);  //포트모드설정(로컬루프백, 패리티 X)
  DBGU_CR = (1<<RXEN | 1<< TXEN);  //송수신 활성화

  return;
}

void Send_Char(unsigned char usSData)    //Data 송신용 함수
{
  while (0 == ((DBGU_SR) & (1<<TXRDY)));  //(TXRDY 실시간 1확인)
  DBGU_THR = usSData;

  return;
}

unsigned char Recv_Char()    //Data 수신용 함수
{
  unsigned char usSData = 0;
  while (0 == ((DBGU_SR) & (1<<RXRDY)));
  usSData = DBGU_RHR;
  
  return usSData;
}

int main(void)
{
  unsigned char buff;
  Usart_init();
  Send_Char('A');
  Send_Char('K');
  Send_Char('I');
  Send_Char('H');
  Send_Char('O');

  while(1)
  {
    buff = Recv_Char();
    Send_Char(buff);
  }
 
  while(1);  
  return 0;
}



 
1. 송/수신부를 리셋 시키고 동작을 중지시킴 

  DBGU_CR 레지스터의 AT91C_US_RSTRX, AT91C_US_RSTTX 비트를 1로 설정

   BGU_CR = (1<<RSTRX| 1<<RSTTX);

 


2. 관련 인터럽터의 비활성화  

  DBGU_IDR 레지스터의 모든 비트를 1로 설정

 DBGU_IDR = 0xFFFFFFFF;

 



3. DBGU의 외부 연결용 Pin 설정

    아래 그림은 AT91SAM7S의 스펙의 36Page에서 발췌한 부분입니다. 자세히 보면

    Peripheral A에 속해 있고 PA 9, 10번 핀에 대해서 설정해야 한다는 것을 알 수

    있음.

    정리해 보면 PA9, 10번 핀을 Peripheral A 모드 활성화, 그에따라 Peripheral B

    는 당연히 비활성화, 그리고 LED를 점등할 때 쓰이는 병렬 I/O 포트 비활성화 등

    3가지 동작이 이루어 져야 함.

    3-1. PA9, 10번 핀의 Peripheral A 모드 활성화

             PIO_ASR 레지스터의 AT91C_PA9_DRXD, AT91C_PA10_DTXD 비트를

             1로 설정

  PIOA_ASR = (1<<DRXD | 1<<DTXD);

 



3-2. PA9, 10번 핀의 Peripheral B 모드 비활성화

            PIO_BSR 레지스터의 모든 비트를 0로 설정

  PIOA_BSR = 0x00000000;

 




3-4. PA9, 10번 핀의 병렬 I/O 포트 모드 비활성화

           PIO_PDR 레지스터의 AT91C_PA9_DRXD, AT91C_PA10_DTXD

PIOA_PDR = (1<<DRXD | 1<<DTXD);

 



4. 포트 속도 설정

     DBGU_BRGR 레지스터에 115200 bps로 설정


DBGU_BRGR = CD;



5. 포트 모드 설정(정상모드, 패리티 없음)

     DBGU_MR 레지스터에

     AT91C_US_CHMODE_LOCAL, AT91C_US_PAR_NONE 비트를 1로 설정


 DBGU_MR = (0<<CHMODE | 4<<PAR);


 



6. 송/수신 모드 활성화

   DBGU_CR 레지스터의 AT91C_US_TXEN, AT91C_US_RXEN 비트를 1로 설정


DBGU_CR = (1<<RXEN | 1<< TXEN);


 




7. Data 송신용 함수의 제작 : void Send_Char(unsigned char usSData)

    7-1. 폴링 방식으로 제작

    7-2. DBGU_SR 레지스터 폴링

            AT91SAM7S의 스펙 253Page 참조.

            실시간으로 TXRDY 비트가 1로 설정되었는지 확인.

            이 비트는 디버그 유닛이 전송 준비가 되면 1로 설정되므로

            확인 즉시 1byte를 전송하면 시리얼 통신 포트로 문자가 전송

            되게 됨. 여기서 주의 해야 할 것은 ATMEL사가 DBGU_SR

            레지스터를 제공한 헤더파일에서는 DBGU_CSR로 해 놓았다는

            것. 이유는 모르겠으나 이점을 유의해서 프로그램을 작성해야 함.

    7-3. DBGU 유닛에 문자 전송

            AT91SAM7S의 스펙 255Page를 참조.

            DBGU_THR 레지스터에 char Data를 직접 쓰면 1Byte 시리얼 전송이

            이루어 지게 됨.


void Send_Char(unsigned char usSData)  //Data 송신용 함수
{
     while (0 == ((DBGU_SR) & (1<<TXRDY))); //(TXRDY 실시간 1확인)
     DBGU_THR = usSData;

     return;
}

 




8. Data 수신용 함수의 제작 : unsigned char Recv_Char()

    8-1. 폴링 방식으로 제작

    8-2. DBGU_SR 레지스터 폴링

            송신 함수 제작과 마찬가지로 AT91SAM7S의 스펙 253Page를

            참조하면서 작성.

            실시간으로 RXRDY 비트가 1로 설정되었으면 1byte를 수신하면

            시리얼 통신 포트로 1Byte가 수신된 것 임.

    8-3. DBGU 유닛으로부터의 Byte 수신

            AT91SAM7S의 스펙 255Page를 참조.

            DBGU_RHR 레지스터에서 읽어 들이면 쓰면 시리얼 통신을 통해

            1Byte를 실질적으로 수신 되게 됨.


unsigned char Recv_Char()  //Data 수신용 함수
{
     unsigned char usSData = 0;
     while (0 == ((DBGU_SR) & (1<<RXRDY)));
     usSData = DBGU_RHR;
 
     return usSData;
}



9. 하이퍼터미널로 값을 넣었을 때  반응

 
main함수부분

 

int main(void)
{
    unsigned char buff;    //임시저장 변수
    

     Usart_init();
     Send_Char('A');    //하이퍼터미널에 내가 원하는 문자를 전송
     Send_Char('K');
     Send_Char('I');
     Send_Char('H');
     Send_Char('O');

 

     while(1)
     {
          buff = Recv_Char();
          Send_Char(buff);
     }
 

 
 while(1); 

 return 0;
}

 

 

'디지털회로 > AT91SAM7S256' 카테고리의 다른 글

AT91SAM7S256 <-> 하이퍼터미널 통신  (0) 2011.09.07
한글입력하기  (0) 2011.09.06
1~8번까지 순차적으로 LED 깜빡거리기  (0) 2011.06.21
AT91SAM7S256 실행순서  (0) 2011.06.21
ARM-SAM7S  (0) 2011.06.20