티스토리 뷰
AVR의 경우 클럭 설정은 fuse bit의 값을 조정함으로써 이루어졌다면, STM32F103은 프로그램으로 설정해 주어야된다는 차이점이 있다.
AVR이 H/W 적인 설정에 가깝다면, STM은 S/W 설정이라고 보면 될 것이다.
이번 글에서는 STM32F103에서의 클럭 설정 방법에 대해서 설명하도록 하겠다.
먼저, clock 체계가 어떻게 되어 있는지 한눈에 알 수 있는 그림을 찾아보도록 한다.
위의 그림이 STM32F103의 clock 체계를 일목요연하게 보여주고 있다.
처음 보면 다소 복잡해 보일수도 있겠지만, datasheet를 분석해 보면 생각보다 복잡하지 않다는것을 알게 된다.
그림의 빨간 박스로 표시된 HSI와 HSE가 클럭 소스이다. 이 두개 중에 하나를 클럭 소스로 선택하여야 한다. 그림에도 표시되어 있는것처럼 HSI는 8MHz로 고정된 값을 가지고 있고, HSE는 4~16MHz의 값을 가질수 있다고 되어 있다. 하지만 시스템 클럭은 최대 72MHz까지 동작 될 수 있는데, 이렇게 입력보다 높은 주파수를 만들어주는 것이 가능한 이유가 초록색으로 표시된 PLL이라는 것이 있기 때문이다. PLL은 입력으로 들어온 HSI나 HSE 주파수를 최대 16배까지 높여줄수 있다.
파란색으로 표시된 부분이 HSI, HSE, PLL 중에 어떤것을 시스템 클럭으로 사용할 것인지 결정하는 것이다.
보라색으로 표시된 부분이 AHB 버스의 클럭을 조절해주는 역할을 한다. 이곳을 거친후 CPU 코어를 비롯하여 나머지 주변장치의 기준 클럭으로 들어가게 된다.
주황색으로 표시된 부분은 각각의 주변 장치가 안정적으로 동작될 수 있도록 더 낮은 주파수로 변경해 주는 역할을 수행한다.
결론적으로 PLL과 prescaler를 잘 조절하면 원하는 주파수로 동작 시킬수 있게 된다.
클럭 설정시 몇가지 주의할 점이 있는데, PLL의 입력으로 HSI가 선택되면 PLL의 입력 주파수가 HSI의 절반이 되도록 되어 있고, PLL을 동작 시키기 이전에 PLL 설정 값들이 먼저 들어가 있어야 된다. 일단 PLL이 동작된 이후에는 PLL 설정값을 변경할 수 없게 되기 때문이다.
APB1의 동작 주파수는 최대 36MHz이므로 APB1의 입력 주파수가 36MHz보다 높으면 prescaler를 사용하여 36MHz가 넘지 않도록 하여야 한다.
원하는 동작 주파수를 얻기 위해서는 약간의 계산이 필요하긴 한데, 좀더 쉽게 설정값을 알고 싶을때는 STMicroelecronics사에서 제공하는 CubeMX라는 프로그램을 이용하면 된다.
위의 그림은 CubeMX를 이용하여 PLL값과 prescaler를 조정해서 64MHz의 클럭을 만드는 것을 보여주고 있다.
STM32F103의 클럭 설정은 칩의 RCC 블럭에서 담당한다. RCC 블럭 중에 CR, CFGR 레지스터를 이용하면 원하는 클럭 설정을 할 수 있게 된다.
그럼 실제로 클럭 설정을 수행하는 코드를 만들어 보기로 하겠다.
sysclock_init() 함수는 모두 6개의 입력 argument를 가진다.
첫번째 argument는 클럭소스를 알려준다.
두번째 argument는 PLL의 배수값을 알려준다. 이값이 2~16 일 경우에는 PLL을 동작 시키고 그 외의 값이 들어오면 PLL을 사용하지 않게 된다.
세번째 argument부터는 AHB, APB1, APB2, ADC prescaler 값이 들어오게 된다.
11~15번째 줄은 클럭소스를 HSE를 사용할때 HSE를 켜도록 해주는 코드이다.
클럭소스로 HSI를 사용하는 경우, 위의 레지스터 설명 그림에 보이는 것처럼 reset value값을 보면 이미 HSI는 기본적으로 활성화 되어 있는것을 알 수 있다. 따라서 굳이 별도의 코드를 만들어 줄 필요는 없다.
18~36번째 줄은 PLL을 동작 시키는 코드이다. PLLMUL 값이 유효한 범위 내에 들어올때에만 동작시킨다.
35번째 줄은 AHB로 들어가는 클럭이 PLL이 선택될 수 있도록 해주기 위해서이다.
39~45번째 줄은 AHB, APB1, APB2, ADC prescaler값을 설정해 주는 코드이다.
48~53번째 줄은 클럭 설정의 마지막 단계로 HSI, HSE, PLL 중에 하나를 시스템 클럭 소스로 선택하는 코드이다.
main() 함수에서의 가장 첫 부분에 시스템 클럭 설정을 해주는 sysclock_init()함수를 넣어주어야 한다.
위의 예의 경우는 디폴트 값과 동일하게 동작되는 코드이다. 위의 같이 했을 경우 LED의 점멸 속도가 클럭 설정 코드를 넣기 이전과 동일하게 나와야 한다.
세번째 argument인 AHB prescaler값을 HPRE_2로 바꾸어서 보드에서 실행 시켜 보면 LED 점멸 속도가 2배로 느려지는 것을 볼 수 있을 것이다.
CPU 외부에 연결되어 있는 8MHz의 크리스털로 부터 클럭을 받아 72MHz로 동작 시키려면 다음처럼 해주면 된다.
그러나 위와 같이 설정해서 동작 시켜 보았더니 LED가 점멸하지 않았다. 그 이유는 왜 그런지 잘 모르겠다. 하드웨어적인 문제가 없을것이라고 가정하면 datasheet 문서를 제대로 이해하지 못했거나, 코드에 오류가 있을것이다. 나중에 문제를 찾으면 수정하도록 하겠다.
PLLMUL 값을 7로 설정하니까 제대로 동작되었다. 즉, 56MHz로 동작 된다는 뜻이다.
클럭 소스를 HSI로 설정하였을때도 역시 최대 56MHz까지만 동작되는 것을 확인하였다.
가지고 있는 보드로는 56MHz를 최대 동작 속도로 간주하고 나머지 프로젝트를 진행해 나가도록 하겠다.
'ARM Cortex-M' 카테고리의 다른 글
UART - STDIO (5) | 2017.02.18 |
---|---|
UART (0) | 2017.02.18 |
GPIO를 통한 LED 제어 (0) | 2017.02.12 |
Start up 2 (6) | 2017.02.12 |
Start up (17) | 2017.02.11 |