1. STM32 시리즈
STMicroelectronics사의 STM32 시리즈는 ARM사의 Cortex M4 Core에 기반한 MCU이다.
이름에서 보듯 이 MCU는 32bit 프로세서이다.
32bit인데 반해 Atmel사의 AVR시리즈등 타 MCU와 비교해서 가격면에서 우위를 가지고 있으며 영상분석등 복잡한 연산도 비교적 빠르게 처리할 수가 있다.
STMicroelectronics사의 STM32 시리즈 이외에도 Texas Instruments사의 TM4C12x시리즈등 여러 제조회사에서 Cortex M4기반 MCU를 출하하고 있다.
위 그림은 STMicroelectronics사(이하 ST사)의 홈페이지에서 가져온 STM32시리즈의 종류별 리스트이다.
성능, 저전력, 클럭속도에 따라 다양한 시리즈로 출시되고 있다.
본 블로그에서는 STM32 시리즈중 STM32F4 를 기준으로 작성한다.
모든 종류의 제품들은 S/W측면에서 보면 비슷하다. ARM사의 아키텍처 자체가 종류에 상관없이 호환성을 가지도록 설계되었기 때문이다.
다만 제품별로 약간의 차이는 있다. 예를들어 STM32L시리즈의 경우 저전력에 특화된 시리즈인데 S/W적으로 Low Power Mode로 진입시 STM32F4 시리즈와 동작에 약간의 차이가 있다.
(그리고 STM32F429에 비해 STM32F439는 "GCM, CCM, Triple DES 및 해시(MD5, SHA-1, SHA-2)지원과 함께 AES-128, -192, -256에 대한 하드웨어 가속 제공" 이라는 기능이 통합되어 있다고 홈페이지에 기술되어 있다. 따라서 각종 통신관련 암호화 작업시 별도 암호화 관련 코딩없이 빠른 하드웨어 지원을 받을 수 있다.)
다른 시리즈의 경우 해당 개발보드를 구매하는대로 별도 기록할 예정이다.
위 그림에서 보듯 STM32F429ZI/439ZI 는 내부에 2M의 Flash Memory와 256Kb의 RAM을 가지고 있다.
다음은 STM32F429ZI/439ZI의 Spec이다.
- 최대 180Mhz의 클럭속도
- LCD-TFT 컨트롤러
- 최대 20개의 통신 인터페이스(8개의 UART, 6개의 SPI, 3개의 I2C, 2개의 CAN, SDIO)
- 2개의 12bit DAC, 3개의 12bit ADC
- 최대 17개의 타이머
STM32F429/439 - STMicroelectronics
Arm Cortex-M4-based microcontrollers from STM32F429/439 lines feature 180 MHz CPU, 225 DMIPS, 2 MB dual-bank Flash, DSP and FPU adds audio interface and LCD-TFT controller. Full development ecosystem includes boards, embedded software and support.
www.st.com
2. 개발보드
본 블로그에서 사용된 STM32 개발보드는 NUCLEO-F429ZI 와 NUCLEO-F439ZI이다(144핀). 둘다 동일한 사양이므로 아무거나 써도 무방하며 이외에 다른 시리즈들도 약간의 차이만 있을뿐 크게 다르지 않다.
F429ZI, F439ZI는 시중에서 4만원대에 구매할 수 있다.
ST사에서 발매하는 이들 개발보드의 장점은 ST-LINK 디버거/프로그래머 모듈이 보드에 통합되어 있다는 것이다. 따라서 ST-LINK를 별도 구매하지 않아도 PC에 USB로 바로 연결해 테스트할 수 있다는 것이다.(정품 ST-LINK를 단독으로 구매하면 이 개발보드보다 비용이 더 비싸다...)
위 그림을 보면 위쪽부분에 보드가 분리되어 있는것이 보인다. 이 윗부분이 ST-LINK부분이고 아래쪽이 실제 개발보드이다. (CN4 딥스위치 유무에 따라 보드의 ST-LINK를 사용할 수도 있고 CN6을 통해 별도 SWD(Serial Wire Debug)를 사용할 수도 있다.)
그리고 User LEDs(LD1, LD2, LD3)가 각각 PB0, PB7, PB14핀에 연결되어 있어 별도 외부 LED없이 테스트가 가능하며 User Button(B1)이 PC13핀에 연결되어 있다.
무엇보다 편리한 기능중에 하나는 JP5(Idd Measurement) 딥스위치가 있다는 것이다.
회로의 전류를 측정하려면 회로를 단락시켜야 한다. 하지만 이 보드는 JP5 딥스위치를 제거하고 거기에 멀티미터를 연결하기만 하면 된다. 나중에 Low Power Mode테스트시 전류값을 알아보기 위해 이 기능을 사용할 예정이다.
<NUCLEO-F429ZI 보드 Specification>
NUCLEO-F429ZI - STMicroelectronics
NUCLEO-F429ZI - STM32 Nucleo-144 development board with STM32F429ZI MCU, supports Arduino, ST Zio and morpho connectivity, NUCLEO-F429ZI, STMicroelectronics
www.st.com
보드 뒷면에는 SBn이라고 적혀진 Solder Bridge들이 있는데 이들을 납땝으로 연결하거나 끊어주면 보드를 자신에게 맞게 커스터마이즈할 수 있는 기능도 제공한다.
예를들어 User LED LD1(Green)은 현재 MCU의 PB0에 연결되어 있는데 만일 PB0를 다른 용도로 사용해야 한다면 뒷면에서 SB120, SB119를 찾아 연결을 끊어주면 된다.(출하시에는 SB120 On, SB119 OFF로 되어 있다. 따라서 SB120번만 끊어주면 된다.)
그외 자세한 내용은 ST사의 홈페이지에서 해당 보드의 매뉴얼을 다운로드 받아 참조하기 바란다.
3. 소프트웨어 개발환경
STM32F MCU 환경에서 프로그램을 작성해 실행하기 위해서는 별도의 컴파일러와 IDE환경이 필요하다.
IAR, Keil, STM32CubeIDE등 여러가지 프로그램이 존재하므로 자신에게 맞는 프로그램을 사용하면 되나 IAR, Keil등은 상용 프로그램이므로 비용을 지불해야 한다.
나같이 배우는 입장에서는 무료로 사용할 수 있는 프로그램이 필요한데 다행히 ST사에서 STM32CubeIDE 를 무료로 제공하고 있다.
앞의 두 프로그램은 ST사의 MCU뿐 아니라 타사의 MCU등도 지원하나 STM32CubeIDE는 오직 STM32 MCU만 지원된다.
어차피 STM32만 사용할것이므로 본 블로그에서는 STM32CubeIDE만을 사용하도록 하겠다.
그리고 IDE환경 이외에 STM32CubeMX라는 별도의 프로그램이 존재한다.
이 프로그램은 Visual Studio에서 MFC프로그램을 작성할 때의 Application Wizard와 비슷하다.
프로젝트를 처음 만들면 기본적으로 MCU를 어떻게 사용할 지를 결정하고 이에 대한 코딩을 일일이 해줘야 한다. 하지만 CubeMX는 GUI환경에서 클릭만으로 이에 대한 소스를 자동으로 생성해준다.
물론 자신의 입맛에 따라 직접 코딩해도 되지만 프로젝트를 새로 만들때 마다 이런것들을 일일이 다시 작성해야 한다면 굉장히 귀찮아진다.
IAR, Keil등을 사용한다면 CubeMX만 별도로 설치해서 사용하면 되고 CubeIDE를 사용한다면 CubeIDE설치시 CubeMX도 같이 설치되므로 별도 설치할 필요가 없다.
CubeIDE설치 파일은 아래 링크를 통해 다운로드 받고, 설치 방법은 별게 없으므로 필요하다면 다른 사이트를 참고하기 바란다.
STM32CubeIDE - STMicroelectronics
STM32CubeIDE - Integrated Development Environment for STM32, STM32CubeIDE-RPM, STM32CubeIDE-Lnx, STM32CubeIDE-Win, STM32CubeIDE-DEB, STM32CubeIDE-Mac, STMicroelectronics
www.st.com
그리고 다음은 CubeMX 매뉴얼이므로 참고하자.
참고로 CubeIDE에 내장된 C/C++ 컴파일러는 GNU C계열의 ARM 전용 gcc 컴파일러이다.
C와 C++모두 지원하므로 원하는 언어를 선택해서 사용하면 된다.
본 블로그에서는 예제작성시 C를 주로 사용하나 C++에 대해서도 기술할 예정이다.
그리고 CubeIDE 설치후 한글깨짐을 방지하기 위해 다음과 같이 세팅하자.
세팅하지 않으면 코딩중에 CubeMX로 다시 세팅을 바꾸면 기존에 입력됐던 한글이 깨지는 현상이 발생한다.
먼저 CubeIDE의 메뉴에서 "Windows-Preference"를 선택해 Preference창을 띄운다.
그리고 창왼쪽 트리에서 General-Content Types를 선택하고 오른쪽 리스트에서 "Text"를 선택한 뒤 제일 아래쪽에 있는 Default encoding란에 UTF-8을 입력하고 Update버튼을 누른다.
그리고 윈도우 환경변수에서 JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8 을 추가해야 한다.
- 먼저 Windows키 + R 키를 눌러 실행창을 띄우고 sysdm.cpl ,3 을 입력하면 환경변수 창이 뜬다.
- 환경변수 창에서 고급탭의 제일 아래 환경변수 버튼을 클릭한다.
- 시스템 변수의 새로만들기 버튼을 클릭해 새 시스템변수 창을 띄우고 거기에서 변수이름에 JAVA_TOOL_OPTIONS를 입력하고 변수값에 -Dfile.encoding=UTF-8 을 입력한다.
(만일 이 작업중에 CubeIDE가 열려 있었다면 새로 시작해주어야 해당 환경변수가 반영된다.)
4. 블로그의 목적
이 블로그를 작성하는 이유는 세가지다.
인간은 망각의 동물이다.
나도 STM32F MCU에 대해 배우고 있는 입장이지만 이전에 익혔던것도 시간이 지나면 까먹어 버린다. (나이가 드니 기억력이 나빠지는게 확실히 느껴진다.)
그래서 배웠던 내용을 내 나름대로 정리하고 이후에 참조할만한 자료를 손쉽게 찾을 수 있는 방법이 필요했다.
이게 블로그 작성하는 첫번째 이유다.
그리고 시중에 나와있는 STM32F관련 서적들도 구매해서 보고 있는데 아무래도 S/W와 H/W중 무게중심을 H/W에 맞춘듯한 느낌이 강하다.
한개의 챕터를 읽고 막상 프로그램을 만들어 볼려면 관련 함수등의 설명이 많이 부족해 또다시 구글링으로 다른 사이트들을 참조해야 한다.
그리고 이들 서적들은 독자가 H/W에 대한 어느정도의 지식을 가지고 있다는 가정하에 쓰여져 있다. H/W나 전자공학에 대해 잘 모르는 나같은 사람은 그 개념들을 찾아가며 일일이 책에 적으며 공부해오고 있는데 옆에 적어놓을 지면도 부족할 뿐더러 옆에 끄적여 놓은게 눈에 잘 들어오지 않는다.
사실 나같은 사람은 전자쪽 H/W는 잘 모르지만 간혹 S/W개발만 의뢰가 들어오는 경우가 생긴다. 이런 종류의 일은 H/W, S/W둘다 알면 제일 좋긴 하지만 현실적으로 어렵기 때문에 전자쪽 기술적인 부분은 H/W개발자에게 물어가며 진행하면 되고 나는 S/W에만 집중하면 된다.
따라서 나같은 사람은 MCU의 기본적인 제어 방법만 알면 그 다음 알고리즘 구현이나 코딩은 늘 하던 일이기 때문에 S/W적으로 제어하는 방법만 중점적으로 익히면 된다.
이게 두번째 이유다.
마지막 이유는 새로운 지식을 습득하고 나서 이를 확실히 이해했는지를 확인하려면 그 내용을 다른 사람에게 설명해보면 된다.
설명하다보면 당연히 알고 있다고 생각한 내용도 불확실해지는 경우가 있고 뭔가를 더 보완해서 익혀야 할 필요성을 느끼기 때문이다.
그래서 이 블로그는 익혔던 내용을 복습하고 나중에라도 쉽게 찾아볼 수 있도록 하기 위한 일종의 강의노트이자 배웠던 내용을 다른 사람에게 보이기 위해 정리하고, 이 과정에서 놓친 부분을 보완하기 위해 작성한 것이다.
그리고 부수적으로 내가 익힌 내용을 또다른 초보자들이 보고 약간의 길잡이가 될 수 있다면 이 또한 보람된 일이 아니겠는가...
5. 블로그의 방향
나는 S/W개발자이다. 예전에 몇차례 AVR이나 라즈베리파이로 프로젝트를 진행한 적은 있으나 대부분의 경력은 일반 응용프로그램 개발이다.
따라서 H/W나 전자쪽은 잘 알지 못한다.
물론 MCU제어라는게 H/W와 S/W를 분리해서 생각할 수 없기 때문에 한쪽으로 치우칠 수가 없다.
하지만 잘 모르는 내용을 설명할 수는 없으므로 이 블로그는 소프트웨어와 S/W 소스쪽에 중점을 둘 계획이지만 필요한 경우 간략하게나마 내가 이해한 내용을 기술할 예정이다.
하지만 H/W나 전자회로쪽은 정확하지 않을 수 있으므로 양해바란다...
'임베디드 > STM32' 카테고리의 다른 글
6. [STM32] GPIO 기초 (0) | 2024.07.25 |
---|---|
5. [STM32] NUCLEO F429/439 보드 Pinmap (0) | 2024.07.22 |
4. [STM32] Entry Point (0) | 2024.07.12 |
3. [STM32] 디버깅 (0) | 2024.07.12 |
2. [STM32] Hello World! (0) | 2024.07.09 |