[임베디드 세계로 연결!] 1. 개발 보드 설명서 톺아보기 - MMIO적 관점으로 진입
오래 걸리지만 확실하게.
글을 쓰는 것은 역시 쉽지 않다. 이번 글을 쓰기까지도 오랜 시간이 필요했고, 당초 계획과 약간 바뀐 부분도 생기고 있다. 하지만 불확실한 상황에서도 포기하지 않고 글을 어떻게든 계속 적어보려고 한다. ---'톺아보기' 는 '샅샅이 홅어가며 살피다' 라는 뜻을 가진 순우리말이다. 이번 글에서는 현재 사용중인 개발 보드인 STM32F446RE의 Reference Manual(RM0390)(참고 설명서)의 주요 챕터를 가능한 구석구석 살펴보고 학습한 본인이 개발 보드 안이 어떠한 시스템으로 구성되어 있는지 이 글을 통해 간략하게 설명해보려고 한다.
---
1. MMIO의 관점에서 구석구석
1) MMIO의 정의와 이점
MMIO는 데이터 처리 방식의 하나로, 메모리와 입출력 장치의 주소 공간을 별도로 두지 않고 하나의 동일한 하나의 메모리 공간으로 취급하여 데이터를 배치 및 처리하는 방식을 말한다. 즉 간단하게 말하면 모든 입출력장치를 메모리 주소처럼 다룬다는 뜻이다. MMIO의 이점은 해당 입출력 장치의 주소에 접근하는 것만으로도 하드웨어를 제어할 수 있다는 것과 별도 데이터 입출력 명령어가 없다는 장점이 있다. 이는 메모리 점유의 효율성을 따지는 임베디드 시스템에서 매우 중요한 요소 중 하나이다.
---
2) MMIO의 관점에서 들여다보기
개발 보드를 구매한 뒤에 처음 개발 보드 설명서를 인터넷에서 PDF로 다운로드받아 이것저것 살펴본다면, 목차를 살펴본 뒤에 2. Memory and bus architecture 챕터를 들여다보는 것을 추천한다. 이 챕터에서는 각 메모리 간에 처리되는 데이터를 전송하는 '도로' 인 Bus의 종류와, 모든 메모리와 입출력 장치에 할당된 메모리 주소를 확인할 수 있다.a. Flash Memory와 RAM(RM0390 2.2.3, 3.)
임베디드 시스템에 사용되는 개발 보드들은 대부분 메모리의 크기가 작다. 이유는 앞서 말했듯이 MMIO방식으로 데이터 처리를 효율화했기 때문도 있고, 사실 더 중요한 4가지 이유가 있다.
1. 정해진 작업만을 수행하기 때문에
(ROM에서 코드를 불러옴, Execute-in-Place, XIP방식)
- 전력 소비를 최소화하기 위해서
- RAM에서는 연산에 필요한 변수나 데이터 버퍼(임시 저장)공간의 역할 만을 수행하기 때문
- 물리적인 공간 부족
이러한 이유들이 있음에도 현재 내가 가지고 있는 보드는 그 중에서도 꽤나 큰 배열과 복잡한 연산이 가능한 고성능 보드에 속한다. Flash Memory(비휘발성 메모리)의 크기는 512KB, SRAM(휘발성 메모리, 작업대)은 128KB이며, 이 정도 크기면 임베디드 환경에서는 여유로운 스펙에 해당한다. Flash Memory와 SRAM각각 통으로 하나의 공간을 차지하는 것을 아니며, Flash Memory는 사용 순서 및 용도에 따라 10개의 영역, SRAM은 2개의 영역으로 분리된다. SRAM에 대한 자세한 정보는 2.2.3 Embedded SRAM 챕터에서, Flash Memory에 대한 자세한 정보는 3. Embedded flash memory interface 챕터에서 확인할 수 있다.
b. Bus에 대한 핵심 간략 요약(RM0390 2.1)
Bus는 앞서 말했듯이 CPU와 장치들 간에 데이터를 송수신하는 'n차선 도로망(Matrix)' 역할이다. Bus는 CPU부분에 붙어있다면 Masters(CPU말고도 다른 장치(DMA, OTG)에 붙어 있는 경우에도 Master Bus로 인정되는 경우가 있으나, 이 경우는 여기에서는 설명하지 않겠다.), 장치 및 메모리에 붙어있다면 Slaves라고 부르며, Matrix라는 구조에 대해 이해를 돕기 위해 아래 자료를 첨부한다.
이 사진을 보면 Bus Matrix라는 구조가 더 잘 이해될 것이다. Bus는 단일 차선 도로가 아니라, 신호등과 교차로가 존재하는 다차선 도로망이다. AHB1버스를 통해 APB1, APB2버스로 연결된 하드웨어 장치들을 흔히 Peripheral, 주변 장치라고 부르며, 이 장치에는 통신, 타이머, GPIO등이 존재한다. 그러나 이 주변 장치들 안에서도 세 가지로 종류가 나뉜다.
c. Bus로 연결된 주변 장치들의 종류
주변 장치들의 종류를 설명하기 전에, 버스를 통해 주변 장치를 제어하는 흐름에 대해 설명한다.
- AHB1 버스 위의 RCC에 있는 클록 활성화 레지스터를 켜서, 사용하려는 주변 장치의 클록을 공급한다
- 개방한 뒤에 AHB1버스에 속하는 주변장치인 GPIO에서 주변 장치에 해당하는 핀의 모드를 변경하여 주변 장치를 사용할 수 있는 설정으로 변경한다.
- 사용하려는 주변 장치에 해당하는 레지스터에 실습 환경에 맞는 초기 설정값을 입력한다.
위 순서대로 주변 장치의 설정이 이루어진다. 이렇게 설정되는 주변 장치 안에서도 두 가지 종류가 있다.
첫 번째는 통신, 타이머, ADC(아날로그디지털변환)로 대표되는 General Peripehrals, 일반 주변장치이다. 이 주변장치들이 실질적으로 칩 외부 환경과 직접적으로 데이터를 주고받는, 입출력 주변장치를 담당하는 것이다.
두 번째는 데이터 처리 방식과 전반적인 시스템 인프라를 관리하는 System Peripherals, 시스템 주변장치이다. 이 장치들은 MMIO데이터 처리 방식 하에서 CPU와 주변 장치들 간의 세부적인 데이터 처리 방식을 변경하기도 하고, 시스템의 전력 관리 설정을 변경하기도 한다. 각 버스에 클럭, 즉 심장 박동을 얼마나 빠른 속도로 공급할지 결정하기도 한다. 그래서 이 장치들은 일반 주변장치들보다 더 중요하게 여겨지는 경우가 많다.
위의 경우처럼 주변 장치가 사용되는 역할에 따라 구분되기도 하지만, 주변 장치에 사용될 수 있는 최대 클럭에 따라 구분되기도 한다. 일반 주변장치 내의 통신 장치인 USART만 하더라도, USART중 1번과 6번은 클럭을 높게 설정(90MHz)할 수 있는 AHB1내 APB2에 연결된 장치이고, 나머지 2,3,4,5번 USART는 다소 낮은 클럭(45MHz)으로 설정 가능한 APB1에 연결된 장치이다. 아래 사진을 통해 이 역할 구분에 대해 조금은 이해할 수 있을 것이다.
이렇게 메모리에서 Bus, 주변장치로 이어지는 Reference Manual분석을 마무리지었다. 각 주변장치들에 대한 심층 분석과 실습은 Phase0.5다음 챕터인 Phase1에서 차례차례 진행될 예정이다. 위 글을 통해 임베디드 개발 보드에 대한 이해가 조금이나마 되었으면 좋겠다. 나 또한 글을 쓰면서 MMIO 관점으로 개발 보드의 구조를 심도있게 복습할 수 있었다.
---
3) 이 문서가 끝은 아니다.
RM0390문서 하나로 STM32F446RE보드의 80~90%정도를 이해할 수 있지만, 나머지에 해당하는 부분도 꽤나 중요하다. 총 세 가지 문서를 소개한다.a. 보드 데이터시트(Datasheet - STM32F446xC/E)
RM0390은 기능과 레지스터들을 다루지만, 전기적/물리적 특성은 다루지 않는다. 예를 들면 하드웨어 사양의 한계, 전기적 특성(동작 전압, 허용 전류, 소비 전력, 동작 온도 범위, 각 핀들의 전력 소비량)들은 데이터시트에서만 확인할 수 있다. 본인도 보드에 내장된 풀업/풀다운 저항값을 데이터시트에서 종종 확인한다. 추가적으로 STM32F446RE보드에 약간 다른 STM32F446ZE보드와의 하드웨어 핀 차이점도 확인이 가능하다.
-주변 장치의 전력 소비량(일부)-
b. 프로세서 참고 설명서(Cortex-M4 Technical Reference Manual)
개발 보드의 뇌를 담당하는 프로세서의 설명서를 확인해야만 데이터가 처리되는 방식과 이를 담당하는 프로세서 내 장치에 대해 이해할 수 있다. 특히 앞에서 설명했던 System Peripheral, 시스템 주변장치는 프로세서 참고 설명서와 함께 보지 않으면 호율적인 데이터 처리에 대한 명확한 이해가 어려워진다.
위 사진에는 효율적인 데이터 처리를 하는 데 핵심적인 역할을 하는 프로세서 내 독립적 장치인 NVIC의 레지스터들의 정보들이 나와 있다. 프로세서 참고 설명서에서 이 정보들을 상세하게 확인할 수 있다.
c. 보드 회로도/핀 연결 맵(MB1136)
STM32F446RE보드는 교육용으로 나오는 보드들과는 다르게 동일한 기능을 가진 핀들이 모여있지 않고 다소 흩어져있는 편이다. 그래서 RM0390으로 각 핀들의 기능을 일차적으로 파악한 뒤에, 회로도를 통해 위치를 정확히 확인하는 것이 실습을 할 때 용이하다. 실습할 때 뿐만 아니라, 보드 내 모듈들에서 어떤 방식으로 다른 모듈이나 프로세서와 데이터를 주고받는지도 확인이 가능하여 꽤나 도움이 되는 문서이다. 무엇보다 아직 보드 구조를 이해하기 어려운 사람이 이 회로도를 보고 진입장벽이 낮아지길 기대한다.
---
4) 요즘 학습을 할 때 가지는 자세(잡생각)
임베디드 시스템 학습을 올해 초에 시작할 때, 궁금한 정보는 계속 찾아보고 기록해두자는 생각을 항상 가지면서 지금에 이르렀다. 이 과정에서 AI를 이용한 탐색 뿐만 아니라 직접 참고 문서들을 꼼꼼히 읽어보는 경험도 많은 도움이 되었다. 그저 '찾아본다'기보다 열정과 호기심을 가지고 학습에 임하는 것이 학습을 지속하는 것에 큰 도움이 되고 있다. 아직 진행중이지만, 옵시디언에 기록해둔 학습 노트들을 내 머릿속에 집어넣어 온전한 '지식'으로 가지려고 노력하고있다. 더 나아가 지식들을 활용한 결과물들을 만드려고 열심히 노력하고 있다. 그 중에 하나가 지금 작성 중인 학습 일기이고 최종 목표는 Self-balancing robot을 만드는 것이다.
급하게 휴학을 했고 그 때문에 시간을 헛되게 보내지 말아야 한다는 압박이 있지만, 이 기간 동안 만은 오직 내가 하고 싶었던 공부를 여유로운 마음으로 깊게 파고들고 싶은 바람이다. 그러다 보면 진로에 대한 방향성을 확고히 할 수 있을 것이라는 확신이 점점 커지고 있는 요즘이다.