안녕하세요 L입니다.
오늘은 ARM7의
전원공급에
대해
정리하였습니다.
그리고
지금까지
사용해본 AIC, Timer, LED 를
종합하여
실습해
보았습니다.
레귤레이터 LM1117-3.3 스팩PDF 파일은
첨부파일에
있음돠 !!
LM1117-3.3datasheet.pdf
★ ARM7
엣지,하이,로우 -> AIC -> handler ( 인터럽트가
있을경우 ) -> 함수 ( C에서 )
-> IRQ 함수 ( 인터럽트
리퀘스트 )
ㆍARM은 32개 pin을
모두
인터럽트로
사용할
수
있다.
ㆍATmega 는 8개의
외부
인터럽트를
사용할
수
있다.
[ USB ]
ㆍ4개의
납땜다리 = 도면의S1 ~ S4
ㆍ5개의 선 = 도면 1~5번
ㆍ S1~S4 : Ground
ㆍ 1 = VBUS
ㆍ 3 = DDP
ㆍ 2 = DDM
ㆍ 5 = Ground
ㆍ C4, C5 : 잡음을
없애는
역할
[ 스위치 ]
ㆍ 1 = VBUS
ㆍ 2 = VCC5
ㆍ 3 = EVCC
[ 전원공급 ]
ㆍ USB 1 :: POWER 2(VCC5)
< 도면의 J4 >
ㆍ J4 = 2pin 몰렉스
ㆍ몰렉스를 통해서도 전원공급이 가능하다
ㆍV에 ( + )전력 :: G에 ( - )전력을 연결.
[ 레귤레이터 (Regulator) ]
레귤레이터란? |
전압 조절기 (레귤레이터 : Regulator) 는 파워 서플라이로 공급되는 전압을 다운시켜 메인 보드로 공급하는 장치 |
< LM1117-3.3 >
ㆍ굵은선은 전력공급선을 나타낸다.
ㆍ3.3볼트 Pin에 연결되어 있다.
ㆍ얇은선은 신호선을 나타낸다.
ㆍADJ 들어오는 전압에따라 유동성있게 변환하여 사용할 수 있다.
Ex) 인터럽트가
들어왔을
때
타이머가
작동하여 1초후 LED 켜고 / 끄기.
헤더파일
이전
포스팅
참고
◈ LED 토글 |
#include "arm.h" #include "led.h"
void Init_LED(void) { PMC_PCER = 1 << PIOA; PIO_OWER = 1 << LED_Pin; PIO_PER = 1 << LED_Pin; PIO_OER = 1 << LED_Pin; PIO_SODR = 1 << LED_Pin; return ; }
void LED_toggle(void) { if(0 != (PIO_ODSR & (1<<LED_Pin))) // LED off 이면... { PIO_CODR = 1 << LED_Pin; } else // LED on 이면... { PIO_SODR = 1 << LED_Pin; } return ; } |
◈ AIC (인터럽트) |
#include "arm.h" #include "aic.h" #include "led.h"
void Init_AIC(void) { PMC_PCER = 1 << PIOA; // System Clock Enable PIO_ODR = 1 << IRQ_Pin; // Output Disable PIO_PER = 1 << IRQ_Pin; // PIO Enable PIO_IDR = 1 << IRQ_Pin; // Interrupt Disable AIC_IDCR = 1 << PIOA; // Interrupt Disable Command // AIC_SVR2 = (unsigned int)AIC_IRQ_Led; AIC_SVR2 = (unsigned int)AIC_IRQ_Timer_Led; AIC_SMR2 = (1 << SRCTYPE) | (0 <<PRIOR); AIC_ICCR = 1 << PIOA; // AIC Interrupt clear Command PIO_IFER = 1 << IRQ_Pin; // Glitch Filter AIC_ISCR = 1 << PIOA; // AIC Interrupt Set PIO_IER = 1 << IRQ_Pin; // PIO Interrupt Enable AIC_IECR = 1 << PIOA; // AIC Interrupt Enable return ; }
void AIC_IRQ_Timer_Led(void) { volatile unsigned int dly;
if((1<<IRQ_Pin)==PIO_ISR) { TC_CCR = 1 << CLKEN; // 타이머 클럭 활성화 TC_CCR = 1 << SWTRG; // 타이머 start !! }
for(dly = 0;200000 > dly; dly++); PIO_ISR; // 이레지스터는 사용후 스스로 자신을 지운다. AIC_EOICR = 0; // End of Interrupt return ; }
|
Ex) 타이머 |
#include "timer.h" #include "arm.h" #include "led.h"
void Init_timer(void) { PMC_PCER = 1 << TC0; TC_CCR = 1 << CLKDIS; // Counter Clock Disable Command
TC_IDR = (1 << COVFS)| (1 << LOVRS)| (1 << CPAS)| (1 << CPBS)| (1 << CPCS)| (1 << LDRAS)| (1 << LDRBS )| (1 << ETRGS); TC_SR; TC_CMR = (TIMER_CLOCK5 << TCCLKS) | (1 << CPCTRG);
TC_RC = 49152;
AIC_IDCR = 1 << TC0;
AIC_SVR[TC0] = (unsigned int)timer_AIC_handler; AIC_SMR[TC0] = (AIC_SRCTYPE_INT_HIGH_LEVEL << SRCTYPE) | (AIC_PRIOR_LOWEST <<PRIOR); AIC_ICCR = 1 << TC0;
TC_IER = 1 << CPCS; AIC_IECR = 1 << TC0;
/* 인터럽트에 사용하기 위해 주석 */ // TC_CCR = 1 << CLKEN; // 타이머 클럭 활성화 // TC_CCR = 1 << SWTRG; // 타이머 start !!
return ; }
void timer_AIC_handler(void) { TC_CCR = 1 << CLKDIS; // Counter Clock Disable Command TC_SR; LED_toggle(); TC_SR; return ; } |
◈ 메인함수와 함수 호출 |
#include "arm.h" #include "led.h" #include "aic.h"
void Init(void); // 함수 호출 함수
int main() {
Init();
while(1); return 0; }
//[ 함수 선언부 ]==================== void Init(void) { Init_LED(); Init_AIC(); Init_timer(); return ; } |
< 실행
결과
동영상
참고 >
궁금하신
점은
댓글로
남겨주세요 !!
오늘도
좋은하루
되세요