TC275 보드에서 Timer를 사용해 내부 Interrupt를 만들어서 LED를 1초에 한번씩 깜빡이게 만들어보자.
Embedded board 에서는 LED blinking이 중요한 프로젝트 중 하나! 아래에 관한 내용을 알아야 하기 때문
Timing + Interrupt
시간을 재면 인터럽트를 발생시킨다.
GPIO
켰다 껐다를 관장
이제 iLLD를 사용해보자
iLLD란?
Infineon Low Level Driver
왜 사용해야 하나?
모든 레지스터를 일일이 제어하는 것은 datasheet를 해석하는 시간과 노력이 들어감
미리 abstraction 되어있는 드라이버를 사용하면 시간을 절약할 수 있음
개발시간 단축!
코드의 가독성이 좋아짐
iLLD 예제
한줄을 해석함으로써 어떻게 동작하는지 살펴봅시다.
* IfxPort_setPinHigh(IfxPort_P10_2.port, IfxPort_P10_2.pinIndex);
Timer 작동방식
Clock을 사용하여 clock의 개수를 센다
Ex. 1MHz라면 한 클럭에 1us, 1kHz 라면 한 클럭에 1ms
보드에서 정확한 clock의 생성은?
Cristal oscillator에서 수행, 이 소자
자세히 들여다보면 20MHz를 생성
CPU 코어는 200MHz 클럭을 가지고 올 수 있음
이 변환은 PLL회로가 수행함
현재 설정된 시스템 클럭 확인
PLL을 통하여 정의된 클럭을 여러 Peripheral에서 분배하여 사용함
Timer 클럭 분석
Timer를 사용하기 위한 모듈 -> UM ch.17
초기화 값은 얼마로? 200MHz / 2 = 100MHz로 설정되어 있다. 초 단위 참고
10ms에 한번씩 STM에 클럭이 들어간다.
Timer 초기화 코드 분석
복잡한 모듈을 사용하기 위해서는? 기존 코드를 분석하는 것이 빠른 길!
전체 코드 구조
config 초기화
config 설정
config 적용, Register 변경
STM Modules
Free running (자동으로 혼자서 돌아가는) 64bit System Timer(counter)를 사용해서 32bit counter 보다 더 큰 시간을 다룰 수 있다.
compare register에 저장해둔 값이 되었을 때 인터럽트를 발생시킨다.
32bit mcu이기 때문에 32씩 잘라서 보여준다.
compare register와 저 32씩 잘라 둔 애들 중 하나랑 비교할 수 있다(?)
-> 시간 단위 별로 다르게 비교할 수 있다.
initCompareConfig()
enable int가 뭐지?
initCompare()
함수 밑에 있는 코드 네 줄이 중요한 부분
config 값에 따라서 비트들을 세팅해준다.
몇 번째 비트 부터 비교할 것이냐 -> 시간의 단위가 달라진다.
Timer Interrupt handler 설정
복잡한 모듈을 사용하기 위해서는? 기존 코드를 분석하는 것이 빠른 길!
실습1) 신호등 만들기
5초에 한번씩 상태(state)가 변하는 신호등을 만들어 봅시다.
필요HW: 2개의 LED
State 0: 빨간불 on
State 1: 파란불 on
State 2: 파란불 점멸 신호 (0.5초에 한번씩 toggle)
실습2) 신호등 만들기
앞의 신호등에서 버튼을 추가하여 버튼이 한번 눌리면 현재상태 그대로 머물러있고, 다시 누르면 신호등 동작을 재개하도록 해봅시다.