STM32F407 2장. 타이머 인터럽트(TRUESTUDIO, HAL_Driver) :: 찬찬히 로봇 메이커
반응형

지난번 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을 한번 더 선언해 주었다. 결과적으로는 매우 잘 작동 되었다.

 

serviceapi.nmv.naver.com/flash/convertIframeTag.nhn?vid=D81EF661D8D436303480BB9EAD3D6B3A7A4A&outKey=V1248770e4c0851ecd8fb346ff3fb11fe605ac099a51f3c05f70d346ff3fb11fe605a&width=544&height=306

 

STM32F407 2장. 타이머 인터럽트(TRUESTUDIO, HAL_Driver)

 

serviceapi.nmv.naver.com

오른쪽 LED가 반짝이는 것을 볼 수 있다.

 

확실히 GPIO를 할 때와는 차원이 다른 어려움이 느껴졌다. 하지면 2809에서 인터럽트를 사용해 보아서 그런지 결과적으로 친숙하게 배울 수 있었고, 어떤 방식으로 접근해야 하는지를 조금이나마 알게 되었다. ADC는 훨월~~씬 어렵다는데 벌써부터 걱정이다.ㅠㅠ

 

※혹시 틀린 것, 알려주고 싶은 내용, 궁금한 점은 댓글로 달아주세요 ^^.

반응형

+ Recent posts