안녕하세요 L입니다.
오늘은 ARM7 의 Timer Count 를 구현해 보았습니다.
전 AIC 포스팅 예제에서 Timer Count 를 추가하고 수정하시면 되겠습니다.
★ Timer Count ( TC )
※ spec :: 389p
ㆍ3개의 체널에 구별되는 타이머 카운터를 가지고 있다. ( 16Bit)
ㆍ계산할수 있는 한계는 64K 이다.
ㆍATmega는 8bit ~ 16bit 사이이다.
ㆍ외부 PLL 에 의해 48M 로 증폭 된다.
ㆍ즉 48M 에 1초이다.
ㆍ계산이 편하기 위해 묶어서 계산하는 것을 프리스케일러(분주비)라 한다.
ㆍ위 표의 나누기 2 ~1024 는 분주비 이다.
ㆍ즉 5가지의 분주비를 지원한다.
※ spec :: 390p
ㆍPMC, AIC, PIO가 관련되어 있다.
[ 레지스터 base address ]
※ spec :: 20p
[ 메모리 맵 ]
※ spec :: 405p
Ex) Init_timer(void) 함수 구성
[ 타이머 카운터 0을 사용을 위한 PMC활성화 ]
[ 타이머 클럭 비활성화 (TC_CCR설정) ]
※ spec :: 408p
[ 타이머 인터럽트 비활성화 (TC_IDR 설정) ]
※ spec :: 421p
[ 인터럽트 상태 정보 초기화 (TC_SR읽기) ]
※ spec :: 418p
ㆍ읽으면 사용후 지워진다.
[ 분주비 1024, 비교 방식 레지스터 설정 ]
( TC_CMR, TIMER_CLOCK5, TC_CPCTRG )
※ spec :: 409p
[ TC_RC 를 1초로 설정 ]
※ spec :: 417p
ㆍ48kHz / 1024 = 49.152 :: 1ms
ㆍ 49.152/4 = 12.288 :: 0.25ms
[ 타이머 카운터 0 인터럽트 비활성화 ( AIC_IDCR, TC0 ) ]
[ 타이머 카운터 0 인터럽트 핸들러 등록 ]
(AIC_SVR :: TC0, timer_handler)
ㆍ위와 같은 세련된 방식
[ 타이머 카운터 0 인터럽트 모드 설정 ]
(AIC_SMR :: TC0, AIC_SRCTYPE :: HIGH LEVEL, AIC_PRIOR :: LOWEST)
ㆍ위와 같은 세련된 방식
ㆍ최종 수정
[ 타이머 카운터 0 인터럽트 클리어 ]
(AIC_ICCR, TC0)
※ spec :: 204p
[ TC_RC 값 비교 타이머 인터럽트 활성화 ]
(AIC_IER, TC_CPCS)
※ spec :: 420p
ㆍwaveform 을 사용할 경우 A, B를 설정하고 사용하지 않을경우 C로 설정한다.
[ 타이머 카운터 0 인터럽트 활성화 ]
(AIC_IECR, TC0)
※ spec :: 203p
[ 타이머 클럭 활성화 ]
(TC_CCR, TC_CLKEN)
※ spec :: 203p
[ 타이머 시작 ]
(TC_CCR, TC_SWTRG)
Ex) void timer_handler(void) 함수 구성
[ 인터럽트 상태 정보 초기화 ]
( TC_SR 읽기 )
[ LED 토글 프로그래밍 ]
[ 인터럽트 상태 정보 초기화 ]
( TC_SR 읽기 )
Ex) 전 AIC포스팅의 헤더파일에 Timer/Counter 추가 |
/*======================================================================== #define COVFS 0 |
Ex) timer 헤더 파일 |
#ifndef __TIMER_H__ |
Ex) 위 과정대로 함수 구성 |
#include "timer.h" |
Ex) main 함수 |
#include "arm.h" |
< 실행 결과 동영상 참고 >
궁금하신 점은 댓글로 남겨주세요 !!
오늘도 좋은 하루 되세요
ARM 강좌 ( TST 사용법 ) [20120704] (0) | 2016.11.16 |
---|---|
ARM7 자료 ( 인터럽트, 타이머, LED 응용 / ARM 전원공급 ) [20120725] (0) | 2016.11.15 |
ARM7 자료 ( AIC / AIC Interrupt Controller ) (0) | 2016.11.15 |
ARM7 자료 ( 광센서 활성화 및 사용 ) [20120718] (0) | 2016.11.15 |
(0) | 2016.11.15 |