본문 바로가기
stm 드론 개발 종합프로젝트/Telemetry 무선 통신 환경 개발

3. 주기 조절 - 타이머 인터럽트를 사용

by 홍소연한고기 2023. 10. 5.

받아오는 데이터의 종류가 많기 때문에(센서 인터페이스, GPS, 송신기 etc)

데이터 별 송수신 주기를 할당해야합니다.

여기서 문제점은,

간단하게 HAL 라이브러리의 Delay 함수를 쓰게 된다면 전체 진행이 멈춘다는 (!!) 것입니다.

 

따라서 TIM7이라는 타이머를 사용하여 주기를 만들어 줄 것입니다.

 

문제 해결!

이를 Non-Blocking Mode라고 합디다.

 

TIM7를 활성화해줍니다.

prescaler 41999, CounterPeiod 1 (이후에 조정)

 

실제로 해당 함수를 따라가보면 (stm32f4xx_hal_uart.c) 

non blocking mode라고 주석이 적혀있답니다.

 

메인 코드에 전송할 임시공간을 20바이트 짜리로 선언해줍니다. (이후 변경 예정입니다)

 

인터럽트 소스코드에서 (stm32f4xx_it.c)

20ms 주기의 도착(?)을 안내할 flag라는 변수를 만들어줍니다. -정말 플래그 역할이라 그런 듯

 

 

다시 메인 문으로가서,

flag를 인터럽트 내에 선언했기에 외부 변수를 extern으로 가지고 오고,

TIM7을 활성화해주는 함수를 작성.

 

바이트 별 전송할 데이터를 20바이트의 어레이에 할당해줍니다.

 

맨 앞의 if절에서

TIM720ms 카운터가 작동할 때 (flag ==1) 활성화로 함수 변경되면서 

주기마다 반복 동작하게 된답니다.

 

GCS 프로그램을 통해(M-HIVE Ground Station)

 

GPS, 

드론의 AHRS (피치, 롤, 요 데이터 등) 수신을 확인했습니다.