ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • VScode 라즈베리파이 피코 Windows C/C++ 개발환경 구축
    개발환경 구축 2023. 2. 20. 23:22

    라즈베리파이 피코에 대해 검색하면 대부분 마이크로파이썬 자료이고, 그나마 C/C++ 자료를 찾더라도 윈도우 자료는 부족하였다. 이 글이 피코를 C/C++로 코딩하려는 사람들에게 조금이라도 도움이 되면 좋겠다.

     

    참고

    데이터 시트: Getting started with Rasberry Pi Pico

    https://datasheets.raspberrypi.com/pico/getting-started-with-pico.pdf

    다운로드

    • CMake
    • Python 3.10.x
    • Git (다운 안하더라도 직접 Github에 들어가서 다운 받으면 됨)
    • make(BuildTool for Visual Studio가 설치되었다면 nmake를 사용하면 되니 설치안해도 됨)
    • ARM GNU Toolchain

    make.exe

    https://gnuwin32.sourceforge.net/packages/make.htm 

     

    Make for Windows

    • Complete package, except sources Setup  3384653 25 November 2006  8ae51379d1f3eef8360df4e674f17d6d

    gnuwin32.sourceforge.net

    설치된 경로를 환경변수 Path에 추가해야 한다.

    win + R cmd 입력 후 ctrl + shift + enter를 눌러 관리자 권한으로 cmd를 연 뒤

    setx Path "%Path%;C:\Program Files (x86)\GnuWin32\bin" -m

    아래 명령어를 입력하는 것으로 추가할 수도 있고, sysdm.cpl로 들어가서 설정할 수도 있다.

    (아래 툴체인 다운로드 방법에 환경변수 추가 방법이 자세히 나와있다.)

     

    ARM GNU Toolchain 다운로드 방법

    https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads

     

    Arm GNU Toolchain Downloads – Arm Developer

    Download the Arm GNU Toolchain, an open-source suite of tools for C, C++, and Assembly programming for the Arm architecture.

    developer.arm.com

    AVR에 avr-vcc가 있듯, ARM 프로세서인 피코는 ARM용 컴파일러를 사용하여야 한다.

    exe로 되어있는 파일을 다운받으면 따로 환경변수 설정을 할 필요 없지만, zip으로 다운받으면 아래 방식으로 환경변수를 추가해야 한다.

    원하는 곳에 압축해제 후, bin 폴더를 열어보면 컴파일러가 보인다.

    win + R cmd 입력 후 ctrl + shift + enter를 눌러 관리자 권한으로 cmd를 연 뒤

    setx Path "%Path%;(컴파일러 위치)" -m

    아래 방식으로 환경 변수를 추가하거나(set Path로 확인 가능)

     

    win + R sysdm.cpl 입력 후 고급 탭의 환경변수 버튼을 클릭

    이렇게 직접 추가할 수도 있다.

     

    Pico SDK 다운로드

    본인이 원하는 폴더에다 PicoSDK 같은 적당한 이름의 폴더를 만든다.

    Git Bash를 해당 폴더에서 열어준 뒤 아래 명령어를 차례로 입력한다.

     #pico-sdk 다운로드
     git clone https://github.com/raspberrypi/pico-sdk.git --branch master
     #pico-sdk 폴더로 이동
     cd pico-sdk
     #초기화 & 업데이트
     git submodule update --init
     #상위 디렉터리로 이동
     cd ..
     #예제 다운로드
     git clone https://github.com/raspberrypi/pico-examples.git --branch master

    사진처럼 새로만들기를 눌러 PICO_SDK_PATH라는 이름으로 환경변수에 pico-sdk의 경로를 붙여넣기 하면 된다.

    제대로 설정되었다면 위에 처럼 입력하였을 때, pico-sdk 폴더가 열린다.

    Work Space에서 Blink 예제 빌드해보기

    pico 라이브러리를 뜯어보면, pico라는 폴더 안에 헤더가 모여있는게 아니라

    pico-sdk\src\common\pico_stdlib\include\pico 안에 stdlib.h 딱하나 들어있고

    pico-sdk\src\common\pico_time\include\pico 안에 time.h timeout_helper.h 들어있고

    D:\2.Program\PicoSDK\pico-sdk\src\rp2_common\pico_stdlib 안에 stdlib.c 이렇게 식으로 들어있다.

    그래서 제공해주는 pico_sdk_import.cmake를 사용하지 않으면 저 많은 경로를 일일히 찾아서 -I 옵션으로 컴파일 할 때 붙여줘야 한다.

     

    이는 피코가 arm 컴파일러에서 제공하는 라이브러리를 사용하는게 아니라 자체적으로 만든 라이브러리를 사용하기 때문이다. 라이브러리 하나를 포함시킬 때, 기반에 깔려있는 여러 라이브러리를 링크해주어야 하며, 이를 위한 CMakeList.txt가 각 폴더마다 들어가 있다. 추가로 컴파일러 내부에 기본 라이브러리가 미리 컴파일되 있는 것이 아니기 때문에 기본 blink를 컴파일하는데도 꽤 시간이 걸린다. 

     

    pico-example을 복사한 후 이름을 바꿔 pico-workplace를 만든 후, 저정도만 남기고 모두 지운다.

    (워크 플레이스 폴더는 바탕화면 등 어디에다 두든 상관없다. pico-examples도 마찬가지이다.)

    cmake_minimum_required(VERSION 3.12)
    
    # Pull in SDK (must be before project)
    include(pico_sdk_import.cmake)
    
    include(pico_extras_import_optional.cmake)
    
    project(pico_examples C CXX ASM)
    set(CMAKE_C_STANDARD 11)
    set(CMAKE_CXX_STANDARD 17)
    
    if (PICO_SDK_VERSION_STRING VERSION_LESS "1.3.0")
        message(FATAL_ERROR "Raspberry Pi Pico SDK version 1.3.0 (or later) required. Your version is ${PICO_SDK_VERSION_STRING}")
    endif()
    
    set(PICO_EXAMPLES_PATH ${PROJECT_SOURCE_DIR})
    
    # Initialize the SDK
    pico_sdk_init()
    
    include(example_auto_set_url.cmake)
    
    #빌드할 코드가 담긴 폴더 이름 입력
    add_subdirectory(blink)
    
    add_compile_options(-Wall
            -Wno-format          # int != int32_t as far as the compiler is concerned because gcc has int32_t as long int
            -Wno-unused-function # we have some for the docs that aren't called
            -Wno-maybe-uninitialized
            )

    CMakeList.txt도 필요없는 부분을 지우고 이정도만 남기면 된다. (귀찮으면 이걸 복붙하면 됨)

     

    이렇게 해서 cmd를 열어준 뒤, 아래 명령어를 입력하면 빌드가 된다.(참고로 git 콘솔에서는 make 명령어를 실행하다가 C:어쩌고가 내외부 명령어가 아니기 때문에 실행할 수 없다고 뜨면서 에러가 뜨는데, cmd로 하면 문제없이 된다. 이것은 라즈베리파이 피코 컴파일할때만 생기는 문제다)

    mkdir build #build 폴더 생성
    cd build #build 폴더로 이동
    cmake .. -G "MinGW Makefiles"
    make
    #CPU가 n개의 스레드를 가졌다면 make -j n 로 하여 떠 빨리 빌드 할 수 있다.

    cmake 에는 CMakeLists.txt의 경로가 입력되야 하는데, 상위 디렉터리에 있으니 ..을 입력하면 된다.

    j는 job의 약자로 -j 4 로 입력하면 한번에 4개의 작업을 멀티스레딩으로 처리할 수 있게 해준다. CPU는 최대 가진 스레드 수만큼 한번에 작업을 처리할 수 있다.

     

    데이터 시트에는 Visual Studio BuildTool를 설치하여 제너레이터 옵션으로 "NMake Makefiles" 을 사용해서 nmake를 하였지만, VScode를 사용할거라 설치하지 않았기 때문에 nmake가 설치안되있어서, make 프로그램을 설치해서 사용하였다.(make 프로그램이 훨씬 가볍다고 느끼고, nmake는 기본 콘솔에서 못열고 전용 콘솔창을 사용해야 한다.)

     

    혹시 제너레이터 옵션으로 MinGW Makefile이 안되는 경우,

    Visual Studio, MSYS, ninja등 여러 옵션이 있으니 본인에게 맞는 것을 사용하면 된다. 

    이렇게 hex 파일이 생성된다. 라즈베리파이 피코를 부트셋 버튼을 누른채로 연결한뒤(띠링 소리나면 때도 된다.), hex 파일을 넣고, 연결을 해제하고 다시 연결해주면 blink 예제가 작동하는 것을 볼 수 있다.

     

    그렇지만 이미 프로그램이 올라와 있는 상태에서 hex로 넣으면 잘 인식하지 못하는 경우도 있고, 데이터 시트에서도 uf2 파일을 넣었다. uf2 파일을 넣으면 자동으로 인식하고 연결을 해제한다.

     

    참고로 환경변수에 컴파일러가 등록되어 있다면 cmake에서 자동으로 감지한다.

     

    원한다면 build 폴더를 blink 안에다 만들어도 된다. 이경우 cmake ../.. -G "MinGW Makefiles" 로 입력해야 한다.

     

    워크스페이스 폴더 내에 다른 프로젝트를 생성해도 되며, add_subdirectory() 안에 빌드할 코드가 담긴 폴더 이름을 입력해주면 된다.  

     

    다만 프로젝트 폴더 안에 CMakeLists.txt가 있어야 한다. (make하면 targetname.hex로 출력된다.)

     

    또한

    add_subdirectory(blink)

    add_subdirectory(test)

    를 입력해서 한번에 두 개의 프로젝르를 빌드 할 수도 있다. 

     

    • 중요 target_link_library

    피코 라이브러리가 컴파일러 기본제공 라이브러리가 아니기 때문에

    #include "pico/stdlib.h" //pico_stdlib 링크해주어야 함
    #include "hardware/adc.h" //hardware_adc 링크해주어야 함
    target_link_libraries(${projname} pico_stdlib hardware_adc)

    소스 파일과 같이 있는 CMakeLists.txt에(add_executable() 있는 곳) 헤더 파일이 있는 폴더명을 추가해주어야 한다.

    pico/stdlib.h 면 /를 _로 바꿔주기만 하면 된다.

    참고로

    pico/stdlib.h는 pico-sdk\src\common\pico_stdlib\include에 있고

    hardware/adc.h는 pico-sdk\src\rp2_common\hardware_adc\include에 있는데

     

    pico/ 류의 라이브러리는 src/common 안에 있고

    hardware/ 류의 라이브러리는 src/rp2_common 안에 있다.

     

    예제를 참고하면 좋을 것이다.

     

    • 중요 시리얼(UART) 통신

    라즈베리파이 피코에는 UART가 2개 있으며, 이중 USB포트는 UART0와 연결할 수 있다.  피코와 연결한 USB로 시리얼 통신을 하려면 CMakeLists.txt에 추가 설정을 해주어야 한다.

    target_link_libraries(${projname} pico_stdlib)
    
    #printf 출력이 USB CDC(USB Serial)로 되도록함
    pico_enable_stdio_usb(hello_world 1)
    #printf 출력이 UART로 되지 않도록 함
    pico_enable_stdio_uart(hello_world 0)

    VScode 작업용 Project 생성하기

    2023/02/21 수정, 삽질하다가 방법을 찾았음

    BuildTool for Visual Studio 가 없는 경우 Generator 옵션을 자신에게 맞게 바꿔줘야 한다.

    cmake의 -G 옵션과 같다.

     

     

    원하는 곳에 적당한 폴더를 만든다.

     

    이렇게 만들어 준다. src 대신 원하는 이름을 해도 됨 다만 밑에 add_subdirectory 부분도 바꿔줘야 한다.

    cmake_minimum_required(VERSION 3.12)
    
    # Pull in SDK (must be before project)
    set(BToolDIR $ENV{PICO_SDK_PATH}/../pico-examples) #이 경우 pico-sdk와 pico-examples가 같은 폴더 내에 있어야 함
    include(${BToolDIR}/pico_sdk_import.cmake)
    
    include(${BToolDIR}/pico_extras_import_optional.cmake)
    
    project(pico_examples C CXX ASM)
    set(CMAKE_C_STANDARD 11)
    set(CMAKE_CXX_STANDARD 17)
    
    if (PICO_SDK_VERSION_STRING VERSION_LESS "1.3.0")
        message(FATAL_ERROR "Raspberry Pi Pico SDK version 1.3.0 (or later) required. Your version is ${PICO_SDK_VERSION_STRING}")
    endif()
    
    set(PICO_EXAMPLES_PATH ${PROJECT_SOURCE_DIR})
    
    # Initialize the SDK
    pico_sdk_init()
    
    include(${BToolDIR}/example_auto_set_url.cmake)
    
    #빌드할 코드가 담긴 폴더 이름 입력
    add_subdirectory(src)
    
    add_compile_options(-Wall
            -Wno-format          # int != int32_t as far as the compiler is concerned because gcc has int32_t as long int
            -Wno-unused-function # we have some for the docs that aren't called
            -Wno-maybe-uninitialized
            )

    매번 예제 폴더에 있는 pico_sdk_import.cmake 등의 파일을 복사해서 가져오기도 귀찮고, 나중에 예제가 업데이트 되었을 때 다시 다 찾아서 업데이트 해줘야하는 답없는 상황이 발생할 수 있기 때문에, 예제 폴더에서 include 하도록 하였다. 예제 폴더만 업데이트 해주면, 알아서 업데이트가 된다.

    pico-examples가 pico-sdk와 같은 폴더에 있지 않으면 BToolDIR의 경로를 자신에게 맞게 바꿔주면 된다.

    set(projname test)
    
    file(GLOB_RECURSE SRC_FILES CONFIGURE_DEPENDS
            ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp
    )
    
    add_executable(${projname} ${SRC_FILES})
    
    # pull in common dependencies
    target_link_libraries(${projname} pico_stdlib)
    
    # create map/bin/hex file etc.
    pico_add_extra_outputs(${projname})
    
    # add url via pico_set_program_url
    example_auto_set_url(${projname})

    projname = project name이다. 중복되는 부분을 변수로 치환하였다.

    src에 있는 CmakeLists.txt를 이렇게 설정하면 현 위치에 모든 cpp이 자동으로 추가된다.(Cmake에서 권장하는 방법은 아닌데, 어짜피 VScode 열때마다 cmake가 실행되니 딱히 문제가 발생하지 않을 것이다.)

     

    Code로 열어준다.

     

    참고로 이렇게 뜬다면 허용해주면 안된다. Cmake Tools이 InteliSense를 구성해야 한다.(CMake Tool과 Makefile Tool이 같이 설치되있어서 발생하는 문제) 실수로 허용을 눌렀더라도 바꿀 수 있으니 괜찮다.

    허용 안함을 누르면 CMake Tool이 InteliSense를 구성하는 걸 허용할거냐고 물어보는데 그때는 허용을 눌러주면 된다.

    그러면 setting.json에 이런 설정이 생긴다. 혹시 실수로 허용 안함을 눌렀다면 setting.json을 만들어준 다음 아래 코드를 붙여넣으면 된다.

    {
        "C_Cpp.default.configurationProvider": "ms-vscode.cmake-tools"
    }

     

    F1 or ctrl + shift + P 을 눌러 edit를 입력하고 C/C++ 구성편집(JSON)을 누른다.

    includePath에 pico-sdk의 경로를 compilerPath에 arm-none-eabi-g++.exe 컴파일러를 추가해준다.

    컴파일러 경로는 시작할 때, 컴파일러를 arm 껄로 선택했다면 자동으로 추가되어 있을 것이다.

     

    혹시 아까 Makefile Tool을 허용했다면, setting.json의 C_Cpp.default.configurationProvider 옵션과

    c_cpp_properties.json의 configurationProvider 옵션을 ms-vscode.cmake-tools로 바꾸어 주면된다.

     

    F7을 눌러 빌드하면

    제대로 빌드되는 것을 확인할 수 있다.

     

    왜 -j 6인지는 모르겠지만, 자동으로 설정되는 듯 하다

     

    윈도우 시스템 상에 PICO_SDK_PATH 환경변수가 추가되었으면

    setting.json

    이런데서 추가로 설정할 필요 없다. 시스템의 것과 충돌할 우려가 있다. %PICO_SDK_PATH% 같은거는 안먹히고 오류뜬다.

    그냥 includePath만 추가해서는  uint, true 등에 찾을 수 없다면서 오류 표시선이 생긴다.

    pico-sdk 특성상 cmake 가 제대로 설정되있어서 F7을 눌러서 빌드 할 수 있는 상태여야 제대로 InteliSense 가 작동된다.

     

    pico-sdk & pico-example update

    git pull
    git submodule update

    pico-example도 같은 방법 git으로 열어서 하면 된다.

     

    피코 관련 공식 문서

    홈페이지 문서

    https://www.raspberrypi.com/documentation/microcontrollers/raspberry-pi-pico.html

     

    Raspberry Pi Documentation - Raspberry Pi Pico and Pico W

    The official documentation for Raspberry Pi computers and microcontrollers

    www.raspberrypi.com

    핀 배치

    https://datasheets.raspberrypi.com/pico/Pico-R3-A4-Pinout.pdf

     

    Github Raspberry Pi Pico SDK 문서

    SDK에 있는 함수에 대한 설명이 있다.

    https://raspberrypi.github.io/pico-sdk-doxygen/modules.html

     

    Raspberry Pi Pico SDK: API Documentation

    These are the libraries supplied in the Raspberry Pi Pico SDK

    raspberrypi.github.io

    RP2040 DataSheet

    https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf

     

    댓글

Designed by Tistory.