본문으로 바로가기
728x90
반응형

 STM에서 Timer는 꽤 많은 수의 Timer를 내장하고 있다. 대부분 10개 내외의 Timer를 가지고 있는 것 같고 Timer 의 기능을 달리한 Timer가 존재한다. 사용하기 좋게 PWM을 출력하는 Timer나 비교 기능을 가지는 Timer 등등 여러가지 모드를 가지고 있다.

 여기서는 간단하게 기본적인 Timer 방법을 다루도록 한다. HAL과 LL 둘다 사용해서 간단하게 구현해보겠다.

 먼저 핀 설정을 한다. TIM6과 7이 일반 Timer니까 이걸 사용하도록 한다.

 일단 Timer를 사용하려면 타이머에 사용되는 클락을 알아야 한다. 확인해보면 TIM6은 APB1 Timer Clocks을 사용한다. (각 소자 데이터 시트 참조) 32MHz이다.                                 

 이후 설정을 한다. TIM6을 활성화 시키고 카운터를 셋팅한다. 32MHz이므로 Prescaler(분주기)를 32로 하여 1MHz로 만들고 Up Counter로 설정, Counter Period를 220으로 하여 220us에서 Timer가 동작하도록 셋팅한다. Autoreload는 자동으로 타이머를 순환시켜 준다. 

1. HAL

 HAL_TIM_Base_Start : 타이머를 시작하는 함수로 인자에 타이머 핸들러 주소를 넣어준다.

 __HAL_TIM_CLEAR_FLAG : 타이머 플레그를 클리어 시키는 함수. 타이머가 Counter Period 만큼의 수를 세면 UPDATE 플래그가 SET 되므로 초기 시작시 UPDATE 플래그를 클리어 시킨다. 초기 UPDATE 플래그는 SET 상태라 이를 클리어 시키지 않고 시작하면 첫번째 타이머가 바로 동작해 버려서 이거 찾느라 무지 고생했다....(꼼꼼하지 못한 내탓이요...ㅠ.ㅠ)

 폴링을 하는 부분에서 UPDATE 플래그를 확인하고 ISR 함수를 만들어서 호출한다.

 __HAL_TIM_GET_FLAG : 타이머 플래그를 확인하는 함수로 위의 예는 UPDATE 플래그를 확인한다. 

2. LL

 사용법이 많이 퍼져있지 않아서 그렇지 LL 드라이버가 훨씬 깔끔한 느낌이다. 드라이버 함수에 대한 설명은 굳이 필요없을 정도로 함수명에 잘 나타나있다.

 

 Timer를 하면서 플래그를 클리어하는 구문 때문에 고생을 무진장 했다. 1회만 확인하는 프로그램을 해서 이 타이머가 동작이 안되는 것처럼 보이고 제어도 안되는 것 처럼 되어서 한참 해맸었는데 다른 사람들은 고생 좀 덜 했으면 좋겠다.                                 

728x90
반응형