앞서 ESP32 환경설정 단계에서 간단한 샘플을 통해서 동작을 확인해 봤을 것으로 이해하고 계속 진행하고자 한다. 아.. 배워먹은게 도둘질이라, 잠깐 써봤는데... 정말 쉽게 사용할 수 있도록 잘 만들어졌다는 생각이든다. 아직은 별 내용이 없어서 그럴지도 모르겠지만, 향후에 필요하겠다 싶어 이런저런 기능을 만들어봤는데... 기본만 적당히 되어있다면, 취미생활로 사용하기에 아주 훌륭한 마이크로 프로세서가 될것 같다.
우선 처음 하고자하는 것은, Hello World 프로젝트를 만들어서 하나씩 테스트를 해보자는 것이다. 프로젝트를 여러개 만들어도 귀찮으니까. 실행하고 다른 내용할 때 삭제하면서 진행하는 것이 좋을 것 같다 따라서 당분간 예제를 위한 프로젝트는 myexample로 지정하도록하겟다.
1. 프로젝트 생성
Visual Studio Code(이하, VSCode 또는 VSC)를 실행하고 ESP 플러그인을 선택하면, Quick Action 이 표시된다. 신규 프로젝트를 만들기 위해서 New Project를 클릭한다.

1.1. ESP-IDF 버전 설정
프로젝트가 생성될 때 화면 상단의 ESP-IDF를 선택해주어야 한다.

1.2. 프로젝트 정보 입력
프로젝트 정보는 앞서 설명한대로 진행한다. 독자들은 알아서 프로젝트를 생성하면서 테스트 해보면된다. 필자는 이번 취미 생활을 위해서 2가지 종류의 보드를 구매했다. 그래서 손에 잡히는데로 프로젝트를 생성하므로 본인이 가지고 있는 보드에 맞춰서 설정해주면 된다. 프로젝트를 생성할 때 장치는 USB를 통해 연결해두고 사용해야 COM포트가 출력된다. 시작 이후에 다시 연결하니 바로 지정이 안되니 조금 귀찮더라도 시작할 때 연결해 두자.

1.3. 탬플릿 설정
그냥 바로 생성되어도 될텐데, 템플릿을 선택하지 않으면 프로젝트 생성이 안된다. 그러니 Choose Templete를 클릭하여 helloworld 프로젝트를 선택해주자. blank 나 empty 형태로 지정되어있는게 있다면 좋았을거 같은데...

New Project화면이 보이면, Create Project using template hello_world를 선택하여 프로젝트를 시작한다. 시작할 때 새로운 윈도우를 사용할 것인지 표시되면 yes를 눌러서 새 창에서 작업하면된다.
1.4. 소스이름 변경
기본 소스이름에서 마우스 좌클릭후 이름바꾸기(rename)를 선택하여 원하는 소스이름으로 변경한다.
Project > main > myexample.c로 바꾸면 CMakeLists.txt의 내용도 변경됨을 볼수 있다.

1.5. 빌드 테스트
빌드 테스트를 진행해서 정상적으로 빌드가 되는지 확인한다. 스페너아이콘을 클릭하여 정상적으로 빌드되는지 확인하여 ESP-IDF가 정상적으로 연결되는지 확인을 하고 오류가 발생된다면 처리하도록 하자. 필자는 별다른 오류가 발생되지 않았다.

1.6. 소스 정리
프로젝트 설정이 정상적임을 확인했으므로, 이제 소스 내용을 삭제하도록 한다. 기본적으로 esp_로 시작하는 함수들과 딜레이등을 제외하고는 대부분 기본적인 C관련 함수이므로, C언어를 조금 공부했다면, 기본적인 사용방법 자체에는 크게 문제가 없을 것 같다. 우선 전체 다 지우도록 하자.
2. 코드작성
2.1. 소스 입력
자 이제 스스로 만든 Hello World 문자열을 출력해 보도록 하자. hello world는 c언어든 c++언어든 가장 먼저 배우는 아주 단순한 예제코드이므로 특별한 설명이 필요없을 것으로 예상하고 있다.
ESP-IDF는 FreeRTOS에 기반하고 있으므로, FreeRTOS를 사용할 수 있도록 헤더를 추가한다. 그리고 이 하나의 app_main()을 가진 펌웨어는 FreeRTOS에서 하나의 Task를 기준으로 하므로 관련 헤더도 추가해주어야 한다.
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
int app_main(void)
{
printf("Hello World!\n"); // 표준 출력으로 Hello World! 문자열을 출력한다.
while(1)
{
vTaskDelay(1000/portTICK_PERIOD_MS); // 1초간 대기
}
fflush(stdout); // While에 종료조건이 없으므로 여기까지 올 일이 없다.
return 0;
}
2.2. 빌드 및 플래싱
코드 작성이 완료되였으면 빌드를 진행한다. 정상적으로 빌드가 되었다면, 아래와 같이 Build Successfully가 표시된다. 오류가 있다면 수정해 주도록 하자.

빌드가 정상적으로 성공했다면 플래시를 하기 위해서 번개표시를 선택하도록 한다. 이때 VSC하단의 통신설정 확인하고, 장치 설정도 확인하여야 한다. 필자는 현재 esp32-s3 시리즈를 사용하고 있으므로, esp32를 클릭하여 올바른 장치를 선택하여야 한다.

설정정보에 문제가 없다면 플래시(번개모양) 버튼을 클릭하여 장치에 기록할 수 있다. 그리고 터미널을 이용해서 모니터링 하면된다. 이 모든 걸 한번에 하고 싶다면, Build & Flash & Monitor (불꽃모양)을 클릭한다.
빌드하다가 플래시 할때 아래의 그림과 같이 어떤 인터페에스를 쓰는지 확인해주어야 한다. 필자는 UART를 선택해서 진행하였다. JTAG가 있긴하지만 대부분 보편적으로 UART를 이용해서 플래싱 가능하니까 말이다. 대신 소스가 길어지면 오래 걸릴 수 있다. (사실 케이블을 찾아야 하는데 귀찮아서...)

3. 결과확인
결과를 예측하자면, 터미널 화면에 Hello World! 만 표시되면 된다. 만약 위의 소스의 printf() 가 while문 안에 있다면 1초에 한번씩 출력되는 결과를 보게 될것이다.

결과를 확인해 봤는가? 만약 터미널에서 확인하고 싶다면 Teraterm이나 Putty등을 이용해서 확인할 수 있다. 이 경우에는 시리얼 포트의 속도를 115200으로 설정하면된다.

어찌되었건, 작성한 소스코드가 정상적으로 실행되는 것을 확인할 수 있었다.
독자께서도 이정도 하셨다면, 이제 진정한 MCU 프로그래머가 되었다고 생각한다. 이 것은 웬만한 것들은 그냥 넘어가겠다는 필자의 의도가 있고, 필자가 궁금한 것들 위주로만 하겠다는 굳은 의지가 있음을 미리 알리기 위한 포석이다.
다음에는 두개의 Task, Task 간 데이터 통신방법에 대해서 알아보도록 하겠다. 이런 기본적이 내용 이후에 하드웨어 제어로 넘어갈 예정이다. 그러면 여러 Task에 각 하드웨어 기능을 넣어서 뭉쳐서 사용할 수 있게 되니까... 시간을 줄일 수 있어서 나쁘지 않기 때문이다.
최근댓글