본문 바로가기

디지털회로/AT91SAM7S256

AT91SAM7S256 <-> 하이퍼터미널 통신

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)
//병렬 입출력 금지 레지스터 
#define PIOA_PDSR  (*(volatile unsigned int *)0xFFFFF43C)
//핀 데이터 상태 레지스터 

#endif



 PMC.h

#ifndef
 __PMC_H__
#define __PMC_H__

#include "PIOA.h"

#define PMC_PCER   (*(volatile unsigned int*) 0xFFFFFC10)    //주변장치에 
전원을 공급 하는 레지스터

/* 함수 선언 */


#endif


DBGU.h

#ifndef
 __DBGU_H__
#define __DBGU_H__

#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))

#define PIN0    0  //PIOA 0번핀

/* 함수 선언 */
void Usart_init();
void Send_Char(unsigned char usSData);
unsigned char Recv_Char();
void Send_String(void* VtData);
void One();
void Two();

#endif


DBGU.c

#include
  "DBGU.h"

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);  //송수신 활성화
  PIOA_PER = (1<<0);  //PA0핀 입출력 사용

  return;
}

void Send_Char(unsigned char usSData)    //Data 송신용 함수
{
  while (0 == ((DBGU_SR) & (1<<TXRDY))); 
 //(TXRDY 실시간 1확인), TXRDY = 0x00000002
  DBGU_THR = usSData;  
  //TXRDY = 1이 아니라면 요가애 다음에 송신할 문자가 들어있다
  
  return;
}

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

void Send_String(void* VtData)    //문자열 출력 함수
{
  while (0 != *((unsigned char *)VtData))  //값 = 값을 만들어줘야하는데 VtData는 주소를 가르키고.. 그래서 캐스팅후 VtData에 *을 붙여 값으로 변환한다.
  {
    Send_Char(*(unsigned char*)VtData);  //송신함수에 문자열을 입력
    ((unsigned char*)VtData)++;    //문자를 ++하다가 NULL을 만나면 탈출
  }
}

void One()
{
  if(0 !=  (PIOA_PDSR &(1<<PIN0)))  // PA0에 0이 아니면 
//PDSR은 실제핀에서의 로직레벨이기에 해당 비트가 병렬 I/O포트로 동작하든지 주변장치로 동작하던지에 관계 없으며,
//병렬 I/O포트의 경우에도 입출력 어느 방향으로 설정되든 무조건 현재핀의 논리레벨이 읽혀진다.    
  {
    PIOA_CODR=1<<PIN0;    // LED OFF
  }
  else    //PA0에 1이 들어가면
  {
    PIOA_SODR=1<<PIN0;    //LED ON
  }
}

void Two()
{
  Send_String("Hello World");  // 2번 입력시 Hello World 하이퍼터미널에 출력
}


INTURRUPT.h

#ifndef
 __INTURRPT_H__
#define __INTURRPT_H__

#include  "PIOA.h"
#include  "PMC.h"

#define AIC_SMR    ((volatile unsigned int*) 0xFFFFF000)  
  //인터럽트 감지 방식 설정  | 우선 순위 설정
#define AIC_SVR     ((volatile unsigned int*) 0xFFFFF080)   //인터럽트 소스 벡터
#define AIC_IECR    (*(volatile unsigned int *) 0xFFFFF120)
#define AIC_ISCR    (*(volatile unsigned int *) 0xFFFFF12C)
#define AIC_ICCR    (*(volatile unsigned int*) 0xFFFFF128)  
  //AIC Interrupt Disable Command Register
#define AIC_EOICR   (*(volatile unsigned int*)0xFFFFF130)
#define AIC_IDCR    (*(volatile unsigned int*)0xFFFFF124)

#define PIOA    2  // 주변 장치 ID (parallerl I/O Controller A)
#define INT_PIN  7  // 사용할 핀
#define SRCTYPE  5  // (상승에지 사용)
#define PRIOR  0  //우선순위 0번 
#define PIN0    0  //PIOA 0번핀

/* 함수 선언 */
void inturrupt_init();
void handler();

#endif



INTURRUPT.c

#include  "INTURRUPT.h"

void inturrupt_init()
{
  PMC_PCER = 1<<PIOA;    //PID2 주변장치 클록 허용 레지스터 활성화 
  PIOA_ODR = 1<<INT_PIN;  //7번 출력을  비활성화 
  PIOA_PER = 1<<INT_PIN;  //7번 입력을 활성화 
  PIOA_IDR = 1<<INT_PIN;
  AIC_IDCR = 1<<PIOA;    //인터럽트 관리(all off)
  AIC_SVR[PIOA] = (unsigned int) handler;  
  // AIC_SVR[외부 인터럽트 번호 ]=인터럽트 신호 들어온 장치 ID
  AIC_SMR[PIOA] = (2<<SRCTYPE | 0<<PRIOR);  //10(내부 외부high)
  AIC_ICCR = 1<<PIOA;    //클리어 레지스터를 사용해 다 제거
  PIOA_IFER = 1<<INT_PIN; //7번 Glich filter  (신호 입력시 잡음 최소화 위한 필터 )
  AIC_ISCR = 1<<PIOA;    //7번 핀, 에지 검출기 사용.
  PIOA_IER = 1<<INT_PIN; 
  //해당 비트의 입력 변화 인터럽터를 허용한다.(7번 핀, PIO 인터럽트 허용)
  AIC_IECR = 1<<PIOA;    //대응하는 인터럽트를 허용한다.(7번 핀, AIC 인터럽트 허용)

  return;
}

void handler()  //인터럽트 신호 들어온 장치 ID 찾는 함수
{
  static volatile unsigned int ISR; 
 //여기서 값 대입하면 static변수라 한번만 사용하게 됨!!
  volatile unsigned int cnt;
  ISR = PIOA_ISR; 
 //신호 들오온 장치 번호 저장 (한번 읽으면 레지스터내용은 지워지므로 변수에 저장)

  if(0!=((1<<INT_PIN) & ISR))  //7번 비트 &  읽어온 번호 , 7번에 들어오면  1
  {
    if(0!=((1<<PIN0) & PIOA_ODSR))  // 1
    {
      PIOA_CODR = 1<<PIN0;
    }

    else
    {
      PIOA_SODR = 1<<PIN0;
    }
    for(cnt=0;1000000>cnt;cnt++);//인터럽트를 못들어오게 막아서 안정적으로 돌게함
  
    ISR=PIOA_ISR;  
    AIC_EOICR=0;    //인터럽터 종료 레지스터 
  }
}



LED.h

#ifndef __LED_H__
#define __LED_H__

#include  "PIOA.h"

#define PIN0    0  //PIOA 0번핀

/* 함수 선언 */
void LED_init(void);

#endif




LED.c

#include
  "LED.h"

void LED_init()
{
  PIOA_OER = 1<<PIN0;
  PIOA_PER = 1<<PIN0;
  PIOA_PPUDR = 1<<PIN0;
  PIOA_CODR = 1<<PIN0;
}



main.c

#include
 "PIOA.h"
#include "DBGU.h"
#include "INTERRUPT.h"
#include "LED.h"

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

  while(1)
  {
    buff = Recv_Char();  //버퍼에 수신

    switch(buff)
    {
      case '1':    // 1을 입력하면 LED ON/OFF
        One();
        break;

      case '2':    // 2을 입력하면 문자열 출력
        Two();
        break;      
    }
  }
  return 0;
}




1번 키를 입력시



2번 키를 입력시

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

오늘 바꾼 TIMER / main 외 ULTRA  (0) 2011.09.09
타이머카운터  (0) 2011.09.08
한글입력하기  (0) 2011.09.06
AT91SAM7S256을 이용한 UART 통신설정  (0) 2011.09.06
1~8번까지 순차적으로 LED 깜빡거리기  (0) 2011.06.21