지난번 GPIO에 이어 이번엔 타이머 인터럽트를 사용하였다.
결론적으로 말하면 2809를 쓸 때와 비슷하다는 것을 느꼈다. 많은 함수들을 거친 결과 결국 레지스터로 값이 입력이 되어 결과가 도출된다는...
그리고 공부에 방법으로 가장 최적화(속성과정)은 CUBEMX로 원하는 소스를 만들어 본 다음, 소스를 타고 들어가서 내가 원하는 것을 하려면 무엇이 필요한 가를 찾아보는 것이 가장 도움이 된다는 것도 느꼈다.
이제 이 레지스터들을 가지고 나만의 소스를 만들어야 하는데....ㅠㅠ 할 일은 항상 태산이다...
일단 큐브맥스로 타이머를 설정하고 소스를 만들어 보았다. 눈이 돌아갈 것 같지만 침착하게 한번 보자.
우선 TIM_HandleTypeDef가 있다. 이것을 타고 들어가보니,
이것들이 있었다. 맨 위에 Instance는 타이머 레지스터들이 쭉 나열되어 있었다. 즉 이것만 설정을 잘 해도 타이머를 사용하는 데는 문제 없다는 뜻이다. 하지만 모든 레지스터를 처음부터 끝까지 설정하는 것은 조금 귀찮은 문제이다. 그래서 두 번째 Init이 있는 것 같다. STRUCT 이름 자체가 TIM_Base_InitTypeDef이다. 즉 기본적인 설정이라는 뜻인거 같은데, 위에 소스처럼 Instance에 어떤 타이머를 쓸지 정하고, 그 밑에 Init에 Prescaler와 Period, CounterMode를 정해주고 HAL_TIM_Base_Init함수를 쓰면 타이머를 사용할 준비는 끝이 난다. 물론 이 타이머를 사용할 때에도 clock_enable은 해주어야 한다. 그래서 __HAL_RCC_TIM7_CLK_ENABLE이 있는 것이다. Error_Handler는 혹시 모를 위험을 막기 위해 있는 듯 하다. 실제로 들어가 보면 while문 안에 갇혀버리는 것을 알 수 있다.
밑에 NVIC는 인터럽트를 인가해주고, 우선순위를 정해줄 수도 있다. 이는 인터럽트끼리 겹치는 Pending현상을 막기 위한 것으로 보이는데 사실 서브까지 필요한 지는 모르겠다. HAL_NVIC_SetPriority함수가 우선순위를 정하고, HAL_NVIC_EnableIRQ가 해당 타이머의 인터럽트를 인가해 준다.소스를 정리해 보았다.
원래는 인터럽트가 발생을 하면 TIM2_IRQHandler라는 함수가 실행이 되고 그 안에 HAL_TIM_IRQHandler라는 함수가 실행이 된다. 그 안에 UPDATE EVENT가 발생이 하면 HAL_TIM_PeriodElapsedCallback함수로 들어가 함수가 실행이 되는 구조이다. 나는 그냥 그것을 끄집어 내와, UPDATE EVENT가 발생하면 함수 Timer_ISR이 실행이 되게 소스를 짜보았다.
현재 Timer_ISR안에 소스는 delay를 사용하지 않고, 인터럽트의 주기를 바꾸어 핀 14번에 있는 LED를 1초 끄고, 5초 켜게 만든 소스이다. 또한 그 밑에 config_Timer_IT함수는 편하게(?) Prescaler와 Period를 바꿀 수 있게 하는 소스이다.
사실 큐브맥스를 보면서 공부해서인지 크게 바뀐 것은 없다. 그냥 필요 없어 보이는 예외처리들을 없애서 오히려 위험성이 높아진 듯 하다. 하지만 일단 깔끔하게 소스를 정리하고 이해했다는 것에 만족을 느낀다.
main문의 소스를 이렇게 짜 보았다. 내가 만든 주기 정하는 함수로 주기를 정하고, 그 밑에 인터럽트 시작 함수를 쓰면 인터럽트가 실행이 된다. 이때, 주의 사항으로는 timer.c에서 선언한 timerInitstruct는 main.c에서 사용이 안된다는 것이다. 그래서 timer.h에서 extern으로 timerInitstruct을 한번 더 선언해 주었다. 결과적으로는 매우 잘 작동 되었다.
STM32F407 2장. 타이머 인터럽트(TRUESTUDIO, HAL_Driver)
serviceapi.nmv.naver.com
오른쪽 LED가 반짝이는 것을 볼 수 있다.
확실히 GPIO를 할 때와는 차원이 다른 어려움이 느껴졌다. 하지면 2809에서 인터럽트를 사용해 보아서 그런지 결과적으로 친숙하게 배울 수 있었고, 어떤 방식으로 접근해야 하는지를 조금이나마 알게 되었다. ADC는 훨월~~씬 어렵다는데 벌써부터 걱정이다.ㅠㅠ
※혹시 틀린 것, 알려주고 싶은 내용, 궁금한 점은 댓글로 달아주세요 ^^.
'공부 > STM32F407(m-4보드)' 카테고리의 다른 글
STM32F407 5장. ADC인터럽트를 Timer와 연동시켜 내가 원하는 타이밍에 ADC값 받기(TRUESTUDIO, HAL_Driver) (0) | 2020.07.28 |
---|---|
STM32F407 4장. DMA(Direct Memory Access)(TRUESTUDIO, HAL_Driver) (0) | 2020.07.28 |
STM32F407 3장. ADC(Analog to Digital Convert)(TRUESTUDIO, HAL_Driver) (0) | 2020.07.28 |
STM32F407 1장. GPIO(TRUESTUDIO, HAL_Driver) (0) | 2020.07.28 |