TIMER.c
#include "TIMER.h"
volatile unsigned int ICNT;
void Timer_init()
{
PMC_PCER = (1<<TC0); //클록 허용 레지스터 (12번핀)
TC0_CCR = (1<<CLKDIS); //클록이 공급되지 않도록 금지한다
TC0_IDR = 0xFF; //인터럽트 금지 해제
TC0_SR; //상태 레지스터를 읽기만 한다.(CPU가 읽기만 함)
AIC_IDCR = (1<<TC0); //12번핀 인터럽트 off
AIC_SVR[TC0] = (unsigned int) Mycounter; // AIC_SVR[외부 인터럽트 번호 ]=인터럽트 신호 들어온 장치 ID
AIC_SMR[TC0] = (2<<SRCTYPE | 0<<PRIOR); //10(내부 외부high)
AIC_ICCR = (1<<TC0); //클리어 레지스터를 사용해 다 제거
TC0_CMR = (4<<TCCLKS) |(1<<CPCTRG); //클럭선택에는 MCK/1024 = 48kHz, RC비교가 카운터를 리셋하고 클록 공급
TC0_IER = (1<<CPCS); //인터럽트 허용
TC0_RC = 49; // 4*1024, Mycounter이 49152번敭� 호출
AIC_IECR = (1<<TC0); //12번핀 인터럽트 on
//타이머카운터를 호출
// TC0_CCR = (1<<CLKEN); //클록금지를 공급되도록 허용한다,
// TC0_CCR = (1<<SWTRG); //이후 채널을 소프트웨어적으로 트리거하여 카운터가 리셋되고 클록이 공급되기 시작
return;
}
void Mycounter()
/*{
TC0_SR; //상태 레지스터를 읽기만 한다.
TC0_CCR = (1<<CLKDIS); //클록이 공급되지 않도록 금지한다
//여기에 할일을 코딩할 것
One();
Two();
TC0_CCR = (1<<CLKEN); //클록금지를 공급되도록 허용한다,
TC0_CCR = (1<<SWTRG); //이후 채널을 소프트웨어적으로 트리거하여 카운터가 리셋되고 클록이 공급되기 시작
return;
}*/
{
TC0_SR;
++ICNT;
return;
}
void Delay_ms(unsigned short usValue)
{
ICNT = 0;
TC0_CCR = (1<<CLKEN); //클록금지를 공급되도록 허용한다,
TC0_CCR = (1<<SWTRG); //이후 채널을 소프트웨어적으로 트리거하여 카운터가 리셋되고 클록이 공급되기 시작
while(usValue > ICNT); //인자로 받은 usValue 값만큼 delay 됨
return;
#include "TIMER.h"
volatile unsigned int ICNT;
void Timer_init()
{
PMC_PCER = (1<<TC0); //클록 허용 레지스터 (12번핀)
TC0_CCR = (1<<CLKDIS); //클록이 공급되지 않도록 금지한다
TC0_IDR = 0xFF; //인터럽트 금지 해제
TC0_SR; //상태 레지스터를 읽기만 한다.(CPU가 읽기만 함)
AIC_IDCR = (1<<TC0); //12번핀 인터럽트 off
AIC_SVR[TC0] = (unsigned int) Mycounter; // AIC_SVR[외부 인터럽트 번호 ]=인터럽트 신호 들어온 장치 ID
AIC_SMR[TC0] = (2<<SRCTYPE | 0<<PRIOR); //10(내부 외부high)
AIC_ICCR = (1<<TC0); //클리어 레지스터를 사용해 다 제거
TC0_CMR = (4<<TCCLKS) |(1<<CPCTRG); //클럭선택에는 MCK/1024 = 48kHz, RC비교가 카운터를 리셋하고 클록 공급
TC0_IER = (1<<CPCS); //인터럽트 허용
TC0_RC = 49; // 4*1024, Mycounter이 49152번敭� 호출
AIC_IECR = (1<<TC0); //12번핀 인터럽트 on
//타이머카운터를 호출
// TC0_CCR = (1<<CLKEN); //클록금지를 공급되도록 허용한다,
// TC0_CCR = (1<<SWTRG); //이후 채널을 소프트웨어적으로 트리거하여 카운터가 리셋되고 클록이 공급되기 시작
return;
}
void Mycounter()
/*{
TC0_SR; //상태 레지스터를 읽기만 한다.
TC0_CCR = (1<<CLKDIS); //클록이 공급되지 않도록 금지한다
//여기에 할일을 코딩할 것
One();
Two();
TC0_CCR = (1<<CLKEN); //클록금지를 공급되도록 허용한다,
TC0_CCR = (1<<SWTRG); //이후 채널을 소프트웨어적으로 트리거하여 카운터가 리셋되고 클록이 공급되기 시작
return;
}*/
{
TC0_SR;
++ICNT;
return;
}
void Delay_ms(unsigned short usValue)
{
ICNT = 0;
TC0_CCR = (1<<CLKEN); //클록금지를 공급되도록 허용한다,
TC0_CCR = (1<<SWTRG); //이후 채널을 소프트웨어적으로 트리거하여 카운터가 리셋되고 클록이 공급되기 시작
while(usValue > ICNT); //인자로 받은 usValue 값만큼 delay 됨
return;
}
TIMER.h
#ifndef __TIMER_H__
#define __TIMER_H__
#include "PMC.h"
#include "PIOA.h"
#include "INTERRUPT.h"
#include "DBGU.h"
#define TC0_CCR (*(volatile unsigned int *)0xFFFA0000) // TC0 채날 제어 레지스터
#define TC0_CMR (*(volatile unsigned int *)0xFFFA0004) // TC0 채날 모드 레지스터
#define TC0_SR (*(volatile unsigned int *)0xFFFA0020) // TC0 상태 레지스터
#define TC0_IDR (*(volatile unsigned int *)0xFFFA0028) // TC0 인터럽트 금지 레지스터
#define TC0_IER (*(volatile unsigned int *)0xFFFA0024) // TC0 인터럽트 허용 레지스터
#define TC0_RC (*(volatile unsigned int *)0xFFFA001C) // TC0 레지스터 C
#define TC_BCR (*(volatile unsigned int *)0xFFFA00C0) // TC 블록 제어 레지스터
#define TC_BMR (*(volatile unsigned int *)0xFFFA00C4) // TC 블록 모드 레지스터
#define TC0 12 //Timer Counter 0번(PID12)
#define CLKDIS 1 //클록이 공급되지 않도록 금지한다
#define TCCLKS 0 //MCK/1024
#define CPCTRG 14 //RC비교가 카운터를 리셋하고 클록을 공급하기 시작
#define CPCS 4 // RC
#define CLKEN 0 //클록금지를 공급되도록 허용한다
#define SWTRG 2 //이후 채널을 소프트웨어적으로 트리거하여 카운터가 리셋되고 클록이 공급되기 시작
/* 함수 선언 */
void Timer_init();
void Mycounter();
void Delay_ms(unsigned short usValue);
extern volatile unsigned int ICNT; //중복ㄱ방지를 위해 extern
#endif
#ifndef __TIMER_H__
#define __TIMER_H__
#include "PMC.h"
#include "PIOA.h"
#include "INTERRUPT.h"
#include "DBGU.h"
#define TC0_CCR (*(volatile unsigned int *)0xFFFA0000) // TC0 채날 제어 레지스터
#define TC0_CMR (*(volatile unsigned int *)0xFFFA0004) // TC0 채날 모드 레지스터
#define TC0_SR (*(volatile unsigned int *)0xFFFA0020) // TC0 상태 레지스터
#define TC0_IDR (*(volatile unsigned int *)0xFFFA0028) // TC0 인터럽트 금지 레지스터
#define TC0_IER (*(volatile unsigned int *)0xFFFA0024) // TC0 인터럽트 허용 레지스터
#define TC0_RC (*(volatile unsigned int *)0xFFFA001C) // TC0 레지스터 C
#define TC_BCR (*(volatile unsigned int *)0xFFFA00C0) // TC 블록 제어 레지스터
#define TC_BMR (*(volatile unsigned int *)0xFFFA00C4) // TC 블록 모드 레지스터
#define TC0 12 //Timer Counter 0번(PID12)
#define CLKDIS 1 //클록이 공급되지 않도록 금지한다
#define TCCLKS 0 //MCK/1024
#define CPCTRG 14 //RC비교가 카운터를 리셋하고 클록을 공급하기 시작
#define CPCS 4 // RC
#define CLKEN 0 //클록금지를 공급되도록 허용한다
#define SWTRG 2 //이후 채널을 소프트웨어적으로 트리거하여 카운터가 리셋되고 클록이 공급되기 시작
/* 함수 선언 */
void Timer_init();
void Mycounter();
void Delay_ms(unsigned short usValue);
extern volatile unsigned int ICNT; //중복ㄱ방지를 위해 extern
#endif
main.c
#include "PIOA.h"
#include "LCD.h"
#include "DBGU.h"
#include "INTERRUPT.h"
#include "LED.h"
#include "TIMER.h"
int main(void)
{
LED_init();
Interrupt_init();
Usart_init();
Timer_init();
while(1)
{
Delay_ms(1000);
One();
}
return 0;
}
#include "PIOA.h"
#include "LCD.h"
#include "DBGU.h"
#include "INTERRUPT.h"
#include "LED.h"
#include "TIMER.h"
int main(void)
{
LED_init();
Interrupt_init();
Usart_init();
Timer_init();
while(1)
{
Delay_ms(1000);
One();
}
return 0;
}
'디지털회로 > AT91SAM7S256' 카테고리의 다른 글
초음파 SRF-05 실행시키기 (0) | 2011.09.16 |
---|---|
오늘 바꾼 TIMER / main 외 ULTRA (0) | 2011.09.09 |
AT91SAM7S256 <-> 하이퍼터미널 통신 (0) | 2011.09.07 |
한글입력하기 (0) | 2011.09.06 |
AT91SAM7S256을 이용한 UART 통신설정 (0) | 2011.09.06 |