본문 바로가기

반응형

뭐라도 만들어보자!!( 프로젝트 )

(44)
5. 임베디드 실습 : GPIO + Systick 이제 드디어 LED를 켜볼 것이다. 간단한 동작을 위해 참 돌아돌아 온 것 같다. 이번 글에서는 보드에 장착되어 있는 LED를 주기적으로 키고 끌 예정이다. GPIO(General Purpose Input Output)는 입력이나 출력을 포함한 동작이 런타임 시에 사용자에 의해 제어될 수 있는, 집적 회로나 전기회로 기판의 디지털 신호 핀이다. GPIO를 조작하기 위해서는 다음과 같으 과정을 거쳐야 한다. 조작할 pin을 포함한 포트에 클럭소스를 배분한다. 해당 pin 입출력을 설정한다. 레지스터를 조작하여 디지털 출력을 조정한다. 사용하는 레지스터는 다음과 같다. 각각의 레지스터에 대해서 간단하게 설명해 보겠다. APB2ENR 레지스터는 입출력 장치에 클럭 소스를 배분할 지 안할 지를 결정한다. CPI..
4. 임베디드 실습 : Main System Clock Source 클럭(Clock)을 설정해야 한다. 기기가 제대로 동작하기 위해서는 시간의 기준이 되는 신호가 필요하다. 이 신호가 바로 클럭이다. 클럭의 속도가 빨라지면 내부에서 명령어를 처리하는 속도가 빨라진다. 게임에 관심이 있는 사람이라면 오버클럭(Over clock)이라는 용어를 들어본 적이 있을 것이다. 기존의 안정성을 고려하여 설정된 클럭 수보다 더 높게 클럭을 설정하여 성능을 끌어올리는 것인데, 여기서의 클럭이 우리가 다룰 클럭과 같은 의미이다. 클럭을 높이면 왜 동작이 빨라지는 것인가? 앞서서 언급했던 것처럼 클럭은 MCU 동작의 기준이 된다. 예를 들어 0과 1의 값을 반복하는 클럭이 있다면, 특정 레지스터에서 다른 레지스터로 값을 넘길 때는 0에서 1로 클럭 값이 전환되어야 한다는 등 하드웨어적으로 ..
3. 임베디드 실습 : NVIC ~ 빈 main() 드디어 코드를 작성할 수 있게 되었다. 그러면 바로 main()에다가 원하는 프로그램을 넣으면 되는가? 그렇지 않다. 우선적으로 .data와 .bss 영역을 초기화 해주어야 한다. .data 섹션의 초기화는 FLASH 영역에 저장된 .data를 RAM으로 복사해주어야하고, .bss 영역은 C 규약에 따라서 정적 심보의 초깃값을 0으로 해주어야 한다. 앞서서 target.ld에서 entry point를 isr_reset()으로 설정했음으로 초기화 작업을 해당 함수에서 해준다. extern unsigned int _stored_data; extern unsigned int _start_data; extern unsigned int _end_data; extern unsigned int _start_bss; ..
2. 임베디드 실습 : ldscript 작성 컴파일한 오브젝트 파일들은 대부분 바로 실행할 수 있는 형태가 아니다. 오브젝트 파일들을 그룹 짓고, 심볼 간 의존성을 해결해야 하는데, 이러한 작업을 링킹(Linking)이라고 한다. 링커 스크립트는 타깃에서의 메모리 섹션의 서술을 담은 파일이다. 링커가 플래시의 올바른 위치에 심볼을 위치시키고, 코드가 참조할 수 있는 메모리 매핑 영역의 특수위치에 대해 소프트웨어 구성요소에 지시하기 위해 사전에 알고 있어야하는 정보이다. 스크립트는 C 코드와 상호작용할 수 있고, 스크립트에 의해 정의된 심볼을 내보낼 수 있다. 다음은 실습에 사용할 스크립트 파일의 내용이다. MEMORY { FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 128K RAM (rwx) : ORIGIN = 0x2..
1. 임베디드 실습 : 전체적인 그림 진짜 코드를 작성하기에 앞서서 작성한 코드가 어떻게 보드에 올라가서 동작하는 지 알 필요가 있다. 그래야 이 실습이 보다 유익하고 의미있어질 것이다. 과정은 다음과 같다. 소스 코드를 작성한다.(주로 C 내지는 C++을 이용하여 작성한다.) 작성한 코드를 컴파일하여 오브젝트 파일을 만든다. 오브젝트 파일들을 링킹하여 실행가능한 형태로 만든다. (ELF 파일 형태로) ELF 파일을 다시 바이너리 이미지로 변환한다. 바이너리 이미지를 JTAG 등을 사용하여 보드 위에 올린다. 1. 코드를 작성한다. 너무 당연한 말이지만 보드를 동작시키기 위해서는 소스 코드를 작성해야 한다. 소스 코드는 컴퓨터를 동작시키기 위한 명령어의 집합이다. 그렇다면 컴퓨터(내지는 마이크로컨트롤러)는 어떻게 코드를 이해하는 가 ? 우리..
0. 임베디드 실습 : 시작 + 환경설정 임베디드 시스템 아키텍처(다니엘 라키메라 저) + 인터넷에 떠도는 자료를 이용해서 실습을 진행하였다. 실습의 목표는 ST의 NUCLEO-F103RB 보드를 이용하여 시스템 클락 설정, 입출력, 인터럽트 설정 등을 해보는 것이다. 실습의 취지에 맞추어 외부 라이브러리를 사용하지 않고, 데이터 시트를 읽으며 실습을 진행할 예정이다. 실습 환경 실습 보드 : NUCLEO-F103RB MCU : STM32F103RB 코드 에디터 : STM32CubeIDE, Vscode 사용 언어 : C 타겟 보드에 대한 간단한 스펙( NUCLEO-F103RB) STM32 microcontroller in an LQFP64 or LQFP48 package 1 user LED shared with ARDUINO® 1 user an..
0부터 시작하는 OS 자작 입문 : ~ ch 2 한창 OS 관련해 공부할 때 단순하게 이론적인 공부만 하고 싶지 않아서, 실습용으로 구매했었다. 한 Chapter 12 까지 하고 어느 순간 안하게 되었는데 이번에는 반드시 끝까지 실습을 마칠 생각이다. 실습 환경 : Ubuntu 20.04 (WSL) 실습 환경 구성 : 처음에 실습 환경을 만드는데 애를 먹었던 기억이 있다. 특히 edk2 버전 관련한 문제를 해결하는 데 애를 먹었었다. 해결책은 어느정도 구버전의 edk2를 git branch 해 사용하는 것이었다. 그런데 굳이 그럴 필요가 없다는 것을 알게 되었다. 저자가 프로젝트를 위한 환경 빌드 파일들을 github에 올려 두었고, 별다른 수정 없이 잘 작동한다는 것을 확인했다. 링크는 다음과 같다. https://github.com/uchan-no..
STM32 개발 환경 ( VSCode + Ubuntu(WSL) ) STM32 개발 IDE인 STM32CubeID를 사용하는 법도 있겠지만, 아무래도 익숙한 VSCode를 사용하고 싶은 사람도 있을 것이다. 인터넷에 자세하게 방법이 올라와 있는 것들을 따라해 봤지만 안되는 경우들이 많았고, 중간 단계로 코드를 컴파일하고 실제 보드에 포팅까지 할 수 있는 유효한 방법을 찾아서 기록하고자 한다. 출처는 다음 영상이다. https://www.youtube.com/watch?v=f4UitJK6an4&list=PLmWLfPrGt9OeacznFrhXTwDNfHK0e9dMf&index=29 원리 자체는 특별한 것은 없다. 우선 CubeMX로 가지고 있는 보드에 맞추어서 Makefile을 포함한 프로젝트를 만들고 WSL 상에서 make 명령어를 이용해 프로젝트를 빌드한다. 그 다음 S..

반응형