본문 바로가기
프로젝트 기록/23SEMA_Control_STM32

[Timer] 스톱워치 만들기

by 소요이 2023. 1. 8.
728x90

0) 요약

1. 최종 목표:

TIM3을 이용해서 스톱워치를 만들기.

 

2. 기능:

- 버튼 짧게 누르면 스톱워치 시작

- 버튼 짧게 누르면 일시정지

- 버튼 길게 누르면 초기화

+구간기록 등 필요한가?

 


 

1) 1초 주기로 LED(LD2, PA5) toggle시키기

 

클럭 설정은 아래와 같이 하였음.

보드에 붙어있는 crystal oscillator 로 LSE, HSE를 모두 사용.

PLLM은 /8, 180, /2로 많이 사용한다고 해서 그렇게 세팅하였고

APB1를 사용하는 타이머는 45MHz, (2~7, 12~14)

APB2를 사용하는 타이머는 90MHz로 동작하게 될 것임

 

 

 

APB1 사용하는 패리패럴

 

APB2사용하는 패리패럴

 

 

 

 

TIM3 분주비, period 설정, auto-reload 설정

auto-reload = 반복적인 인터럽트 발생하도록.

 

 

 

 

TIM3 NVIC설정

타이머 타운터가 Counter Period값과 일치하면 인터럽트 발생하도록 처리

그리고 clock source는 맨 처음 ETR2로 했는데, 동작이 안돼서 Interner clock으로 바꿈

Internal clock이,, 맞나?

clock configuration에서 HSE, LSE로 설정했으니 그걸로 끝인건가

이 개념은 추후 보강할 것

 

 

 

인터럽트 발생 시 함수 호출 순서

TIM3_IRQHandler()

HAL_TIM_IRQHandler()

HAL_TIM_PeriodElapsedCallback()

 

 

 

 

 

1. 타이머 인터럽트 시작 함수 호출

 

 

2. 타이머 인터럽트 콜백 함수 구현 :

1ms주기로 인터럽트 발생 시 변숫값이 1씩 증가하도록.

1000번 발생 시 LED토글

변수 선언

 

 

HAL_GPIO_TogglePin 이용

 

변수 선언 시 주의점

인터럽투 루틴에서 처리되는 전역 변수는 

volatile 변수로 꼭 선언해야 함.

이렇게 하면 이 변수를 사용 시 항상 메모리에 접근하게 됨.

즉, 이 변수는 값이 바뀔 수 있으니 항상 메모리에 접근해야 함

 


2) 1초를 이용하여 타이머 만들기

타이머 동작에 필요한 변수 선언
HAL_TIM_PeriodElapsedCallback함수

 

1초가 지나면 UART, CLCD로 시간 출력됨

teraterm으로 정확한 동작 확인

시간 간격 잘 맞는 것 확인

 

추후 보강: 1분 단위로 세어보며 오차 범위 확인하기

 

 

 


3) 타이머에 시작 버튼 동작 추가하기

추가 동작:

초기 상태에서 NUCLEO 보드의 B1(Blue PushButton, PC13)를 누르면 타이머가 시작되도록 하기

짧게 다시 누르면 일시정지

어떤 상태에서든 버튼을 2초이상 길게 누르면 타이머가 0:0:0으로 초기화됨

 

알고리즘:

- timer on flag를 만든다

- 해당 flag는 0으로 초기화되어 있다

- button을 누르면 인터럽트에 의해 버튼을 누른 시간을 체크함

- 그 체크한 시간으로 timer on flag값을 toggle함

- 1일때만 타이머가 동작하도록 한다.

 

B1 GPIO configuration

버튼이 Falling edge에서만 동작하도록 하려다가,

버튼 1개로 타이머 동작을 모두 나타내기 위해 버튼 누른 시간을 체크하려고

Rising, Falling엣지 둘 다 인터럽트가 발생하도록 했다.

 

 

 

 

 

B1 NVIC Configuration

버튼이 눌렸을 때 인터럽트가 발생할 수 있도록 NVIC설정을 변경한다.

 

 

 

 

 

외부 인터럽트 발생 시 함수 호출 순서는 

EXT15_10_IRQHandler()

HAL_GPIO_EXTI_IRQHandler()

HAL_GPIO_EXTI_Callback()

과 같다.

 

 

 

변수 선언 정리

 

 

while문 안의 코드

 

타이머 돌아가는 기본 코드
버튼 누른 시간 체크하는 외부인터럽트 콜백함수

 

정상적 동작 확인

 

추후 보강: CLCD 확인 추가하기

 

 

+) STM Studio 프로그램으로도 시간 변수의 변화를 확인했다.

https://skook.tistory.com/90

'프로젝트 기록 > 23SEMA_Control_STM32' 카테고리의 다른 글

[LoRa]1- 모듈, SPI인터페이스  (1) 2023.01.09
[STM32] STM Studio 사용법  (0) 2023.01.09
[STM32] LSE 선택하는 법  (0) 2023.01.07
Nucleo board, and dma  (0) 2023.01.05
dma, interrupt, polling방식 차이점  (0) 2023.01.05