Systick Timer를 활용해 0.5초마다 LED를 켰다 끄고, LED가 켜진 횟수를 count 하여 TFT-LCD상에 출력하는 간단한 프로그램을 구성해보았습니다.
Systick Timer에 대한 개념은 추후 추가
아래는 코드입니다.
#include "stm32f767xx.h"
#include "OK-STM767.h"
void SysTick_Handler(void); /* SysTick interrupt function */
volatile unsigned int count = 0;
volatile unsigned int LED_flag = 0;
void SysTick_Handler(void) /* SysTick interrupt function */
{
LED_toggle(); // toggle LED
LED_flag++;
if(LED_flag % 2 == 1){
count++;
TFT_xy(21,15);
TFT_unsigned_decimal(count,1,3);
}
}
int main(void)
{
Initialize_MCU(); // initialize MCU and kit
RCC->AHB1ENR |= 0x00000004; // port C clock enable(GPIOCEN = 1)
GPIOC->MODER &= 0xFFFFFCFF ; // set PC4(LED) to output
GPIOC->MODER |= 0x00000100;
GPIOC->ODR &= 0xFFFFFFEF; // PC4(LED) = 0
Delay_ms(50); // wait for system stabilization
Initialize_TFT_LCD(); // initialize TFT-LCD module
TFT_string(1, 4, White,Magenta, " SysTick 타이머 인터럽트 이용 LED 점멸 ");
TFT_string(1,10, White, Magenta, " 0.5초 간격으로 LED 점멸");
TFT_string(1,15, Yellow, Magenta, "LED 깜빡거린 횟수 : 000");
SysTick->LOAD = 13499999; // 0.5초 계산하기 :: 2Hz = 27MHz / ( 13499999 + 1 )
SysTick->VAL = 0; // SysTick Counter 초기화
SysTick->CTRL = 0x00000003; // 216MHz/8 = 27MHz로 SysTick 타이머 초기 설정
while(1){
SysTick->LOAD = 13499999; // 0.5초 계산하기 :: 2Hz = 27MHz / ( 13499999 + 1 )
}
}
헤더파일은 위 키트 판매처에서 제공하는 헤더파일을 활용하였습니다.
0.5초마다 LED가 Toggle, 즉 점등 여부가 전환되기 때문에 LED가 켜진 횟수를 count 하기 위해서 LED_flag 라는 임의의 변수를 하나 만들었습니다.
Systick Timer의 counter가 0이 되어 인터럽트가 발생하면, Systick_Handler 내의 명령들이 수행되게 됩니다.
Systick_Handler 내부에 LED 점등 횟수를 계산하여 TFT_LCD상에 출력하는 코드를 추가해두었습니다.
LED_toggle 함수는 Exclusive OR 연산자 ^ 를 활용하여 특정 비트를 반전시키는 역할을 합니다.
Systick Timer와 TFT_LCD, GPIO에 대해 공부하면서 위 내용들을 묶어 연습해볼 수 있는 간단한 프로그램이었습니다 !
아래 블로그는 함께 공부하는 친구의 블로그입니다.
https://blog.naver.com/tiger1877