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
#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
#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
#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 하이퍼터미널에 출력
}
#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
#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; //인터럽터 종료 레지스터
}
}
#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.c
#include "LED.h"
void LED_init()
{
PIOA_OER = 1<<PIN0;
PIOA_PER = 1<<PIN0;
PIOA_PPUDR = 1<<PIN0;
PIOA_CODR = 1<<PIN0;
}
#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;
}
#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 |