본문 바로가기

디지털회로/AT91SAM7S256

타이머카운터

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;
}


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





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;
}