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로 동작하게 될 것임
auto-reload = 반복적인 인터럽트 발생하도록.
타이머 타운터가 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토글
변수 선언 시 주의점
인터럽투 루틴에서 처리되는 전역 변수는
volatile 변수로 꼭 선언해야 함.
이렇게 하면 이 변수를 사용 시 항상 메모리에 접근하게 됨.
즉, 이 변수는 값이 바뀔 수 있으니 항상 메모리에 접근해야 함
2) 1초를 이용하여 타이머 만들기
1초가 지나면 UART, CLCD로 시간 출력됨
시간 간격 잘 맞는 것 확인
추후 보강: 1분 단위로 세어보며 오차 범위 확인하기
3) 타이머에 시작 버튼 동작 추가하기
추가 동작:
초기 상태에서 NUCLEO 보드의 B1(Blue PushButton, PC13)를 누르면 타이머가 시작되도록 하기
짧게 다시 누르면 일시정지
어떤 상태에서든 버튼을 2초이상 길게 누르면 타이머가 0:0:0으로 초기화됨
알고리즘:
- timer on flag를 만든다
- 해당 flag는 0으로 초기화되어 있다
- button을 누르면 인터럽트에 의해 버튼을 누른 시간을 체크함
- 그 체크한 시간으로 timer on flag값을 toggle함
- 1일때만 타이머가 동작하도록 한다.
버튼이 Falling edge에서만 동작하도록 하려다가,
버튼 1개로 타이머 동작을 모두 나타내기 위해 버튼 누른 시간을 체크하려고
Rising, Falling엣지 둘 다 인터럽트가 발생하도록 했다.
버튼이 눌렸을 때 인터럽트가 발생할 수 있도록 NVIC설정을 변경한다.
외부 인터럽트 발생 시 함수 호출 순서는
EXT15_10_IRQHandler()
HAL_GPIO_EXTI_IRQHandler()
HAL_GPIO_EXTI_Callback()
과 같다.
추후 보강: CLCD 확인 추가하기
+) STM Studio 프로그램으로도 시간 변수의 변화를 확인했다.
'프로젝트 기록 > 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 |