제목 그대로이다. atmega128을 사용할때는 항상 overflow 를 이용하였다. 하지만 stm32f4로 넘어오니 overfow 인터럽트가 없어지고 update란 녀석이 생겼다.
지금까지는 별 의미 없이 overfow = update 라고 생각하고 사용하고 있었으나 엄밀히 말하면 다르다는걸 시행착오를 통해 깨달았다.
지난번에 올린 소스 PWM input mode를 이용한 리모컨 신호 캡처 (http://selfschool.tistory.com/86)에서
특정값이 이하의 신호를 수신할 경우 (2~3개) 데이터가 하나도 나오지 않는 오류가 발생했다.
그래서 TIM3_IC_Index 를 출력해 본 결과 0 1 이 반복하여 나오는 것을 확인할 수 있었다.
분명히 overflow 인터럽트에서 동작한다면 이러한 일이 발생하지 않을텐데...
내가 원한 동작은 위와같은 동작이다 Update와 overflow는 동일하다 라는..
하지만 동작은 위와같이 일어난듯 싶다. 위에서 reset counter 에서 아마 update 이벤트가 발생하는듯 싶다.
위의 이미지는 데이터시트의 내용이다.
URS를 설정해주면 overflow/underflow 에서만 update 이벤트가 발생한다고 한다.
여기서 update generation 이란 TIMx_CNT 값을 초기화 시켜주는 것으로 예상된다. 따라서 overflow 에서도 그리고 IC의 동작에 의해서도 Update 동작이 발생하는 것으로 예상된다.
따라서 이것을 설정해 주면 해결된다.
TIM_UpdateRequestConfig(TIM3, TIM_UpdateSource_Regular);
TIM_UpdateRequestConfig(TIM3, TIM_UpdateSource_Global);
TIM_UpdateRequestConfig(TIM3, TIM_UpdateSource_Global) 로 설정된 경우
TIM_UpdateRequestConfig(TIM3, TIM_UpdateSource_Regular)로 설정된 경우
줄바꿈의 경우 내부 소프트웨어적인 처리이므로 신경쓰지 않아도 된다.
여기서 보면 위의경우 Update 인터럽트와 Inpucapute 인터럽트가 동시에 발생하지만
아래의 경우 capture 동작이 일어나고 overflow 가 발생하였을때 update 인터럽트가 발생하는 것을 확인할 수 있었다.
이것때문에 한 3시간은 삽질한듯.....