티스토리 뷰

Clock 설정 글에서 최대로 동작 가능한 시스템 클럭이 56MHz라고 설명하였다.  그리고 이후에 구현되는 기능에서는 최대 48MHz까지만 동작 가능한것을 알게 되었다.

분명히 문서에는 최대 동작 속도가 72MHz라고 되어 있고, 클럭 설정도 문서에 나와 있는대로 해주었음에도 불구하고 48MHz 이상에서는 제대로 동작되지 않아 이상하다고 생각했었는데, 왜 그런지 그 이유를 알게 되었다.

Reference manual을 보면 다음과 같은 내용이 나온다.

풀어서 설명하자면 다음과 같은 내용이다.

프로그램이 동작하는데 필요한 명령어들은 flash 메모리 안에 저장 되어 있다.  CPU core에서는 프로그램을 실행하기 위하여 명령어들을 flash 메모리로부터 읽어 오는데 CPU의 동작 속도에 비해서 flash 메모리의 동작 속도가 상대적으로 무척느리게 동작 된다.  이렇게 동작 속도가 차이가 나기 때문에 CPU에서 Read 신호를 flash 메모리에 인가한 다음 명령어 데이터를 읽어 오는데 속도 차이로 인해서 미처 제대로 된 값을 읽어 가지 못하는 현상이 발생하게 된다.  결국 프로그램이 정상적으로 수행될 수 없게 되는 것이다.

이러한 문제를 해결하기 위하여 시스템 클럭 속도 범위에 따라 zero wait, one wait, two wait에 해당되는 값만큼 latency를 주도록 하고 있다.  즉, Read 신호를 인가한 다음 최대 2클럭 후에 명령어를 읽어 가도록 하는것이다.

이렇게 함으로써 제시간에 명령어를 못읽어 가는것을 해결하게 되는 것이다.  

그러나 한가지 문제가 발생하게 된다.  기껏 동작 속도를 높이고자 하였으나 latency를 강제로 주도록 하였기 때문에 그만큼 명령어를 읽어 가는 시간이 늦어지게 되고 전체적으로 동작 성능이 낮아지게 되는것이다.

그래서 이 문제를 보상하기 위하여 prefetch buffer라는 것을 제공한다.  Flash 메모리에서 명령어를 읽어 올 때 단 하나의 명령어만 읽어 오는것이 아니라 한번에 16바이트씩 데이터를 읽어 오는 것이다.

조건문이 없는 경우라면 순서대로 명령어가 수행될 것이므로 한번에 16바이트 명령어를 prefetch buffer에 읽어 와서 그 안에서 하나씩 명령어를 꺼내오게 되면 flash 메모리에 접근하는 회수를 상당히 감소 시킬수 있기 때문에 latency에 의한 성능 저하 문제를 해결할 수 있게 되는 것이다.

일반적인 CPU에 있는 I-cache와 같은 개념이라고 보면 될것 같다.

Prefetch 설정과 latency 설정은 FLASH_ACR이라는 레지스터를 이용하면 된다.

Flash 메모리와 관련된 레지스터 들은 위의 표와 같다.

FLASH_ACR의 비트별 설명은 위와 같다.  Prefetch buffer를 사용하기 위한 PRFTBE 비트는 CPU가 동작 될 때부터 enable되도록 되어 있으므로 latency 값만 시스템 클럭 속도에 맞추어서 설정해 주면 될 것이다.

시스템 클럭 설정을 위한 코드를 다음과 같이 수정하였다.

10번 줄은 보드에서 사용되는 reference clock source의 동작 주파수를 MHz 단위로 변환한 값이다.

27번 줄은 PLL을 사용할 경우 reference clock에 pll mul 값을 곱해주는 코드이다.

31번 줄은 clock source가 HSI인 경우 PLL로 들어오는 값이 2로 나눈값이 들어오므로 클럭 속도를 2로 나누어 주는 코드이다.

55번 줄에서 prefetch buffer enable 비트를 설정하도록 하고, 시스템 클럭 속도 범위에 따른 latency 값을 계산하여 latency bit 값을 넣어주는 부분이다.

위의 코드를 적용해서 Timer에서 만들었던 프로그램을 실행하면 다음과 같은 결과를 볼 수 있다.  72MHz로 동작 시키기 위하여 board.h 파일에서 BD_PLLMUL값을 9로 설정하였다.

위의 그림에서 보는것처럼 각 클럭들이 제대로 설정되고 있는것을 확인할 수 있다.

그리고,

over clock으로 설정할 때 최대 얼마까지 동작되는지 궁금해서 PLLMUL 값을 크게 해보았더니 다음값까지 동작 되는 것을 볼수 있었다.

위의 그림은 PLLMUL 값을 16으로 설정하였고, APB1 Prescaler 값을 4로 설정한 결과이다.



'ARM Cortex-M' 카테고리의 다른 글

SPI  (3) 2017.05.03
I2C  (0) 2017.04.22
ADC  (3) 2017.04.15
ST-Link/V2 SWD 연결 문제 해결  (4) 2017.04.15
PWM  (0) 2017.04.08
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함