금요일, 2월 06, 2015

STM32CubeMX와 Eclipse CDT/GNU 툴을 사용한 예제:LED 켜기 (1편 STM32CubeMX 사용법)

STM32CubeMX와 Eclipse CDT/GNU 툴을 사용한 예제:

LED 켜기 (1편 STM32CubeMX 사용법)

목차:

1. 준비사항
2. 기본코드 생성(STM32CubeMX 사용법)
    2-1. 시작
    2-2. 클럭 입력 지정
    2-3. 클럭 설정
    2-4. 입출력 핀 지정
    2-5. 소스코드 생성
----------------------------------------------------------------------

STM32CubeMX와 GNU 툴을 사용한 간단한 예제를 만들어보자. C 언어 처음 배울 때 접하는 "Hello World"격에 해당하는 LED 한개 반짝이는 예제다.

이 마이크로 컨트롤러의 내부구조라 던가 성능이 어떻다 던가 그런류의 복잡한 이야기는 차차 알아보기로 하고 일단 되는지 보기로 하자.

-------------------------------------------------------------
1. 준비사항


-------------------------------------------------------------

이 예제의 목표는 GCC라는 C 컴파일러와 Eclipse라는 무료 개발 환경의 활용법을 익히는 것이다. 준비사항은 다음과 같다.

소프트웨어:

STM32 ARM 개발환경(Eclipse/ARM GCC & GDB) 설치
http://goodkook.blogspot.kr/2015/02/stm32-arm-eclipsearm-gcc-gdb.html

프로그래머의 생명을 연장해 주는 STM32CubeMX

하드웨어:

간단한 개발 보드가 있어야 겠다. STM32 마이크로 컨트롤러는 모든 것이 내장되어 있다. 외부에 필요한 것은 JTAG 다운로드를 위한 JTAG과 클럭용 크리스털만 있으면 된다. 내장된 RC 오실레터를 이용하면 이마져도 필요없다.

그외 응용에 소요될 회로가 있을 것이다. 개발용 보드는 하나 만드는 것도 좋지만 요즘은 워낙 다양한 보드들이 싸게 공급되고 있으니 적당한 것을 하나 구입하는 것도 좋겠다. 그래픽 TFT LCD가 달린 것도 5~6만원에 살 수 있다. JTAG 다운로더 디버거가 2~3만원 정도하니까 넉넉하게 10만원 정도 투자하면 되겠다.


-------------------------------------------------------------
2. 기본코드 생성(STM32CubeMX 사용법)


-------------------------------------------------------------

2-1. 시작

STM32CubeMX 를 실행 시켜 프로젝트를 생성 한다. 적용할 마이크로 컨트롤러를 선택하는 창이 나올 것이다. Series는 STM32F1으로 Cortex-M3 라는 계열의 ARM 코어다. 사용할 컨트롤러 종류는 STM32F103, 패키지(Package)는 100핀이다. 이렇게 고른 마이크로 컨트롤러는 STM32F103VET6 다.



2-2. 클럭 입력 지정

이번 예제에서는 외부에서 크리스털로 클럭을 만들어주는 것으로 한다. 클럭 제어를 RCC(Reset and Clock Control) 라고 한다. 칩 외부에서 고속 클럭 공급을 HSE 라고 한다. "Crystal/Ceramic Resonator"를 지정하면 칩의 해당핀에 표시된다.HSE용 크리스털은 8Mhz 짜리를 사용한다. LSE는 저속 클럭으로 내장 시계에 사용되는 클럭으로 보통 32Khz 이다. 이번 예제에서는 사용하지 않는다.


2-3. 클럭 설정

최근 저전력 마이크로 컨트롤러들은 다양한 기능들이 내장된 만큼 내부 클럭 구조가 아주 복잡하다. CPU 코어가 매우 빠른 속도로 작동한다고 주변장치도 같은 속도로 작동할 수는 없다. 플래쉬 메모리의 작동 속도나 시리얼 통신의 장치의 작동은 이에 비해 한없이 느리기 때문이다. 또한 저전력을 구현하기 위해 사용중이 아닌 주변장치는 작동을 멈춰야 하는데 전원을 끌 수는 없고 클럭을 차단한다.

STM32 마이크로 컨트롤러의 내부 클럭구성을 보자. 클럭에 붙은 이름만 해도 참 다양하다. CPU에 사용하는 클럭(FCLK), 주변장치에 사용하는 클럭(HCLK)등으로 나뉘어 있다. 매우 고속의 시스템 클럭(SYSCLK)으로 부터 분주해서(클럭 속도를 낮춰서) 용도에 맞게 공급한다. 속도를 낮추는 기능이 프리 스케일러(Prescaler)다.

가정 먼저 할 일은 시스템 클럭(SYSCLK)을 만드는 방법을 선택하는 일이다.

칩 외부에 크리스털을 사용(HSE)하거나 칩내부에 RC 발진기(HSI)를 사용하는 방법이 있다. (1)번 선택으로 HSE와 HSI중 하나를 고른다.

(2)번 선택은 PLL을 통해 생성된 고속의 클럭(PLLCLK) 혹은 HSE나 HSI에서 발진시킨 클럭을 시스템 클럭으로 사용할 수 있다.

CPU 마다 최대 클럭 주파수가 정해 져 있다. 시스템 클럭을 바탕으로 프리스케일러를 통해 적절한 클럭을 생성한다. 허용된 클럭 주파수보다 높게 설정하면 빨간색으로 표시된다. 프리스케일러 값을 조절해 주도록 한다. 높은 클럭이 공급될 수록 전력량은 늘어나므로 고속이 능사는 아니다. 용도에 맞게 조절해 주자.



2-4. 입출력 핀 지정

이번에는 LED를 켜고 끌 범용 입출력 핀(GPIO, General Purpose Input/Output)에 출력용으로 지정한다. 예제에서는 PB5 핀을 사용했다. PB5 핀 위치에 마우스 클릭 하면 기능을 선택할 수 있다. GPIO_Output을 선택 했다.



2-5. 소스코드 생성

이제 C 소스코드를 생성할 차례다. 그전에 생성될 코드를 저장할 위치와 사용할 컴파일러를 고른다. Toolchain/IDE는 아쉽게도 EWARM, ARM_MDK 그리고 TrueSTUDIO 밖에 없다. 세개 모두 상용 소프트웨어다. 앞으로 사용하려는 Eclipse CDT 는 없다. 하지만 TrueSTUDIO에서 사용하는 컴파일러는 GCC 이므로 이를 선택한다. (사실 MDK나 EWARM 에서 사용하는 컴파일러도 GCC 소스를 가져다 자가용으로 재생성한 것이다. 상용화된 것은 IDE 환경과 편이 도구들 이다.)



이제 Project > Generate Code 메뉴를 선택하면 곧바로 소스코드가 생성된다. 소스 코드가 생성된 폴더는 아래와 같다. Drivers 폴더는 ST의 각종 라이브러리 소스들이 있다. 엄청난 양의 .c와 .h 들이 생성되어 있는데 필요한 것만 골라 사용하기로 한다.





댓글 2개:

  1. 안녕하세요. 쓰신글 잘보고 있습니다.
    그런데 제가 작성자님이 하신대로 따라하던도중 마지막단계에서 generate code를 누르고
    생성된 폴더에 가보면 다른 파일들은 다 똑같이 있는데 작성하신 글의 마지막사진중에 GPIO_PB5_LED.ioc라는 파일이 type이 STM32Cubemx로 생성되지가 않는데 왜 그런지 혹시 아실까해서 댓글남깁니다.

    답글삭제
    답글
    1. 답글이 늦었네요. ARM-GCC가 파일명 대소문자를 가립니다. 파일중에 startup.c (? 아마 맞을 겁니다) 가 파일명이 소문자로 되어 있을 겁니다. 대문자로 바꿔 주시면 됩니다.

      삭제