안녕하세요?
오늘은 Basic Timer에 대해 알아보겠습니다.
위의 표를 보시면 타이머는 크게 3종류로 나뉘어 집니다.
1) Basic 타이머 : 단순한 형태의 16 bit 타이머로써 input/output 핀 없이 순수 time base generator 동작 수행
2) General Purpose 타이머 : 16/32 bit 타이머로써 input Capture, Output Compare, PWM 모드 등의 기능을 제공함
3) Advanced 타이머 : General Purpose타이머의 기능을 모두 제공하며, 추가적인 기능을 제공함
각 데이터 시트 마다 타이머 설정이 다르니 사용하는 MCU의 데이터시트를 참조 바랍니다.
위의 그림을 보시게 되시면 타이머 인터럽트 발생시키는 시점을 알 수 있습니다.
타이머 인터럽트 발생시키기 위해서는 Prescaler, Auto Reload Register를 설정해야 합니다.
먼저 Prescaler는 사용하는 CLK을 분주하기 위해 사용합니다.
즉. Prescaler를 10000으로 설정한다면 CLK을 카운트하여 10000번이 카운트되면 Auto Reload Register를 1을 증가킵니다.
Auto Reload Register는 현재 8400으로 설정되어 있는데 Prescaler를 통하여 Auto Reload Register가
8400이 되면 타이머 인터럽트가 발생되고 Auto Reload Register가 초기화가 됩니다.
현재 84MK CLK을 사용한다고 가정하고 1s마다 타이머 인터럽트를 발생시키기 위해서 Prescaler를 10000을 설정하고 Auto Reload Register를 8400으로 설정하면 됩니다.
위의 그림을 보시게 되면 먼저 사용할 Clock을 설정해야 합니다.
Timer에 사용되는 Clock은 APB timer clock이므로 Clock Configuraion에 들어가 원하는 Clock속도를 설정합니다. (저는 사용하기 위해 16MHz를 사용했습니다.)
인터럽트를 발생시키기 위한 NVIC Setting에서 현재 사용하는 Timer를 체크해 주면 됩니다.
STM32CubeMX를 위와 같이 설정을 하기 자동으로 Timer 초기화 함수들이 생성된 것을 볼 수 있습니다.
이제 Timer 인터럽트 발생했을 떄 Application 영역만 작성을 하면됩니다.
Timer 인터럽트를 발생하게 되면 핸드러를 통해 Callback함수를 호출하게 되어 있습니다.
Main.c에 콜백함수를 작성하고 안에 원하는 동작을 작성하면 됩니다.
저는 1s마다 타이머 인터럽트 발생 시 LED를 점등과 소등을 반복했습니다.
감사합니다.