본문 바로가기

STM32F103ZET 최대 클럭 속도 관련 문제 및 해결

반응형

문제

 STM32F103ZET를 다루면서 RCC 설정 시, STM32F103ZET의 최대 클럭인 72MHz로 설정할 때마다 HardFault Exception 즉, 컴퓨터로 치면 블루스크린과 같은 상황이 계속 발생되었다. RCC 설정의 문제인가? 아니면 RCC 설정의 순서가 문제인가? 이 두가지를 가정하고 다양한 방법을 시도해 보았지만, 여전히 HardFault Exception이 발생했었다. 그런 이유로 최근에 CubeMX의 HAL 코드를 뜯어 고치면서 그 원인으로 생각되는 부분을 오늘에 와서야 발견했다. 바로 FLASH 접근 속도이다. 


문제 해결 

여기서부터는 추측성 글입니다. 

 초기의 RCC 설정으로는 느린 클럭을 공급했기에 Flash에서 데이터를 쓰고 읽는 작업 즉, access 작업에 문제가 없었으나 클럭 속도를 72MHz로 올려버리는 상황으로 인해 Flash access가 정상적으로 이뤄지지 않았던 것으로 추측할 수 있었다. HAL 코드는 이러한 문제를 Flash Access Control Register의 LATENCY 비트를 수정하여 해결했다는 것을 찾을 수 있었다.  Flash Access Control Register는 다음과 같다.

Flash access control register (FLASH_ACR)Address: 0x00Offset: 0x4002 2000

 

그림 01. Flash access control register page 60.

다른 부분은 아직 배우는 단계이기 때문에 건들이지 않았으며, 우리가 봐야하는 LATENCY 부분만 집중해서 보았다. 세 가지 옵션이 존재했으며, SYSCLK에 따라 설정 값이 다르다는 것을 알 수 있었다. 필자는 최대 클럭인 72MHz로 설정하고 싶었기 때문에 LATENCY를 2로 설정했고, 그 결과 정상적으로 동작하는 것을 확인할 수 있었다. 코드 상으로 RCC_CFGR의 SW를 설정하기 바로 전에 LATENCY를 설정했다.

 


결론

 문제의 원인을 정확하게 판단하여 해결한 것은 아니고 그나마 가능성 있는 부분을 고친 것이라고 생각한다. 또한 RCC는 MCU 동작 전반에 영향을 주는 녀석이고, 그렇기 때문에 우리가 알지 못했던 부분에서 문제가 생길 수도 있다는 프로그래밍적 경각심을 일깨워줬다. 따라서 RCC 관련 설정을 할 시, 단순히 RCC 영역만 보는 것이 아닌, RCC와 관련될 여지가 있는 그 모든 부분을 봐야 문제를 해결하는데 한 발자국 더 나아갈 수 있다.

 


 

남은 과제

현재 해결한 문제는 HardFault Exception에 관한 것이었다. 이 과정에서 보다 정확한 동작을 위해 SWS의 상태를 검사하는 코드를 추가했으나, 정상적으로 동작하지 않음을 확인했다. 아직까지 정상적으로 PLL Clock이 SYSTICK으로 설정되었는지는 확인하지는 않았지만, 조만간 TIM 인터럽트를 통해 정확하게 72MHz가 공급되는지 확인할 예정이다.

반응형