STM32-TIM_Interrupt_1

이상윤·2022년 8월 26일
1

STM32

목록 보기
1/8
post-thumbnail

stm32개발보드를 이용하여 타이머 인터럽트 실습을 진행하고 정리한 글이다.

배경지식

위 그림에서 x축은 시간, y축은 Counter Register의 값이다.
stm32f4xx family 기준으로 Counter Register는 16bit로 0 ~ 2161{2^{16}-1} 의 값을 갖는다.

ARR은 Auto Reload Register의 약자로 Counter Register의 값이 ARR과 동일해질때,
Update Interrupt가 발생한다. ARR역시 16bit이다.
( Period 라고도 한다.)

Counter Register는 0에서 시작해 1씩 증가하는데, 이때 1 증가하는데 걸리는 시간은 system Clock에 의해 결정된다.

계산은 만약 system Clock이 90MHz90MHz라고 가정한다면 아래와 같다.
1/90,000,000(sec)=1.11108(sec)1/90,000,000(sec) = 1.11 * 10^{-8}(sec) 이므로 1증가하는데 약 11ns11ns시간이 걸린다고 계산가능하다.

문제..

값이 1이 증가하는데 매우 적은시간이 소모되므로 금방 ARR의 값에 도달하게 되고,
자연스레 Interrupt가 자주 발생하게 된다.
Interrupt가 수행되는 동안 다른 작업을 할 수 없기때문에 이는 System의 입장에서는 좋지 않다.
때문에 Prescaler 라는 개념을 도입한다.

Prescaler를 이용하여 Counter Register의 값이 1증가하는데 걸리는 시간이
ClockPeriodPrescalerClock Period * Prescaler 가 된다.
만약 Prescaler=10,000Prescaler = 10,000 이라고 가정했다면 11ns10,000=11105(sec)11ns * 10,000 = 11 * 10^{-5}(sec)로 많이 커졌다.

정리하면 Counter Register값이 1증가하는데 걸리는 시간은 Prescaler/SystemColckPrescaler/System Colck 이므로
1/9,000(sec)1/9,000(sec) 인데, 이때 ARR(Period)의 값을 9,0009,000으로 설정한다면
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

1개의 댓글