stm32개발보드를 이용하여 타이머 인터럽트 실습을 진행하고 정리한 글이다.
위 그림에서 x축은 시간, y축은 Counter Register의 값이다.
stm32f4xx family 기준으로 Counter Register는 16bit로 0 ~ 의 값을 갖는다.
ARR은 Auto Reload Register의 약자로 Counter Register의 값이 ARR과 동일해질때,
Update Interrupt가 발생한다. ARR역시 16bit이다.
( Period 라고도 한다.)
Counter Register는 0에서 시작해 1씩 증가하는데, 이때 1 증가하는데 걸리는 시간은 system Clock에 의해 결정된다.
계산은 만약 system Clock이 라고 가정한다면 아래와 같다.
이므로 1증가하는데 약 시간이 걸린다고 계산가능하다.
문제..
값이 1이 증가하는데 매우 적은시간이 소모되므로 금방 ARR의 값에 도달하게 되고,
자연스레 Interrupt가 자주 발생하게 된다.
Interrupt가 수행되는 동안 다른 작업을 할 수 없기때문에 이는 System의 입장에서는 좋지 않다.
때문에 Prescaler 라는 개념을 도입한다.
Prescaler를 이용하여 Counter Register의 값이 1증가하는데 걸리는 시간이
가 된다.
만약 이라고 가정했다면 로 많이 커졌다.
정리하면 Counter Register값이 1증가하는데 걸리는 시간은 이므로
인데, 이때 ARR(Period)의 값을 으로 설정한다면
Update Interrupt가 일어나는 주기가 1초가 된다.
데이터시트에는 해당 칩에 대한 모든 내용이 나와있다. 꼭 잘 읽어야 한다. (근데 양이 너무 많음..)
이번에 사용할 Timer는 Tim7이다. stm32f4xx의 데이터시트를 들여다 보면 다음과 같다.
앞서 설명한 Counter register, Prescaler, Auto-Reload register를 포함한다는 사실을 알 수 있다.
세 레지스터 모두 16bit임을 확인할 수 있고, reset value도 확인할 수 있다.
TIM7은 APB1 Bus를 이용한다. 이와 관련하여 AMBA Bus에 대한 개념을 다루어야 하는데
이는 나중에 자세히 다루도록 하겠다.
글이 너무 길어져서 2부에서 다루겠습니다.
https://www.inflearn.com/course/stm32f4/unit/15634?tab=curriculum