본 게시글은 Nordic Semiconductor의 nRF54L15-DK 개발 키트에서 개발을 시작하기 위해 리눅스 환경에서 Zephyr를 설치하는 절차를 다룹니다. 아래 터미널에 있는 명령어들은 설치 과정을 대략적으로 보여줍니다:
sudo apt update
sudo apt upgrade
sudo apt install --no-install-recommends git cmake ninja-build gperf ccache dfu-util device-tree-compiler wget python3-dev python3-venv python3-tk xz-utils file make gcc libsdl2-dev libmagic1
python3 -m venv venv
source venv/bin/activate
(venv) pip install west
(venv) west init zephyrproject
(venv) cd zephyrproject
(venv) west update
(venv) west zephyr-export
(venv) west packages pip --install
(venv) cd zephyr
(venv) west sdk install
이 링크에서 x64 리눅스 용 nrfutil을 다운로드합니다. 다운로드가 완료되면 실행 권한을 변경하고 실행합니다 (sudo chmod 777 nrfutil). 이후 버전을 확인하고 시스템 경로 (.bashrc)에 추가합니다.
(venv) nrfutil self-upgrade
(venv) nrfutil install nrf5sdk-tools
(venv) sudo apt install libusb-1.0-0
(venv) nrfutil install sdk-manager
(venv) nrfutil install device
그리고 JLink_Linux_V864_x86_64.deb도 다운로드한 후 설치합니다. USB 케이블을 사용하여 nRF54L15-DK 개발 키트를 호스트 PC에 연결합니다. 이제 Zephyr 디렉터리에 포함된 Zephyr 프레임워크의 예제 중 하나를 빌드할 준비가 되었습니다.
(venv) /zephyr/zephyrproject/zephyr$ west build -p always -b nrf54l15dk/nrf54l15/cpuapp samples/basic/blinky_pwm
마지막으로 실행 파일을 nRF54L15-DK 개발 키트에 다운로드합니다.
(venv) /zephyr/zephyrproject/zephyr$ west flash
이제, LED 1이 서로 다른 듀티 사이클로 점멸하는 것을 확인할 수 있습니다.
minicom 또는 다른 시리얼 프로그램을 사용하면 아래와 같이 호스트 PC에서 USB 케이블을 통해 출력을 볼 수 있습니다.
*** Booting Zephyr OS build v4.2.0-2755-g258172992551 ***
PWM-based blinkyCalibrating for channel 0…[00:00:00.011,112]
pwm_nrfx: Prescaler for period_cycles 16000000 not fou.[00:00:00.019,327] pwm_nrfx: Prescaler for period_cycles 8000000 not foun.[00:00:00.027,465] pwm_nrfx: pwm_nrfx_set_cycles: channel 0, pulse 200000.Done calibrating; maximum/minimum periods 250000000/7812500 nsec[00:00:00.043,638]
pwm_nrfx: pwm_nrfx_set_cycles: channel 0, pulse 200000.Using period 250000000[00:00:04.056,244]
pwm_nrfx: pwm_nrfx_set_cycles: channel 0, pulse 100000.Using period 125000000[00:00:08.068,788]
pwm_nrfx: pwm_nrfx_set_cycles: channel 0, pulse 500000.Using period 62500000…
이로써 리눅스 환경에서 Zephyr OS를 설치하는 절차를 모두 완료하였으며, LED1에 적용된 펄스 폭 변조 특성을 변화시키는 예제를 빌드하고 nRF54L15-DK 개발 키트에 플래시 하였습니다. PWM 동작의 변경은 아래 위치에 있는 소스 코드를 수정하고, 위에서 설명한 빌드 및 플래시 과정을 반복하면 됩니다.
zephyrproject/zephyr/samples/basic/blinky_pwm/src/main.c
기본 하드웨어 동작을 확인하였으니, 이제 커널이 제대로 동작하는지도 확인해 보겠습니다. 다음은 커널이 정상적으로 동작하는지를 보여주는 간단한 애플리케이션입니다. 두 개의 스레드 (A와 B)가 번갈아 가며 콘솔에 환영 메시지를 출력하고, 슬립 요청과 세마포어를 사용하여 메시지 생성 속도를 제어합니다. 이를 통해 커널 스케줄링 프로세스, 통신 프로세스, 타이밍 프로세스가 정상적으로 동작함을 확인할 수 있습니다. 이 예제를 빌드하려면 다음 절차를 진행하십시오.
(venv) /zephyr/zephyrproject/zephyr$ west build -p always -b nrf54l15dk/nrf54l15/cpuapp samples/synchronization/
그런 다음 실행 파일을 nRF54L15-DK 개발 키트에 플래시합니다.
(venv) /zephyr/zephyrproject/zephyr$ west flash
다른 터미널에서 minicom을 실행하면 다음과 같은 이벤트가 출력될 것입니다.
*** Booting Zephyr OS build v4.2.0-2763-g5af3adf66fb3 ***
[00:00:00.002,883] <inf> bt_hci_core: HW Platform: Nordic Semiconductor (0x0002)
[00:00:00.002,896] <inf> bt_hci_core: HW Variant: nRF54Lx (0x0005)
[00:00:00.002,908] <inf> bt_hci_core: Firmware: Standard Bluetooth controller (0x00) Version 4.2 Build 99
[00:00:00.003,274] <inf> bt_hci_core: HCI transport: Controller
[00:00:00.003,323] <inf> bt_hci_core: Identity: F2:57:B1:05:95:C5 (random)
[00:00:00.003,337] <inf> bt_hci_core: HCI: version 5.4 (0x0d) revision 0x0000, manufacturer 0x05f1
[00:00:00.003,349] <inf> bt_hci_core: LMP: version 5.4 (0x0d) subver 0xffff
Bluetooth initialized
Advertising successfully started
*** Booting Zephyr OS build v4.2.0-2763-g5af3adf66fb3 ***
thread_a: Hello World from cpu 0 on nrf54l15dk!
thread_b: Hello World from cpu 0 on nrf54l15dk!
thread_a: Hello World from cpu 0 on nrf54l15dk!
thread_b: Hello World from cpu 0 on nrf54l15dk!
thread_a: Hello World from cpu 0 on nrf54l15dk!
thread_b: Hello World from cpu 0 on nrf54l15dk!
thread_a: Hello World from cpu 0 on nrf54l15dk!
thread_b: Hello World from cpu 0 on nrf54l15dk!
thread_a: Hello World from cpu 0 on nrf54l15dk!
해당 소스 코드는 다음 위치에 있습니다.
zephyrproject/zephyr/samples/synchronization/src/main.c
빌드 및 플래시 해볼 수 있는 또 다른 예제로, :c:macro:K_THREAD_DEFINE를 사용해 여러 스레드를 생성하는 방법을 보여주는 애플리케이션이 있습니다. 이 예제는 3개의 스레드를 생성하며, 각 스레드는 K_THREAD_DEFINE을 사용해 컴파일 타임에 정의됩니다.
처음 두 개의 스레드는 별도의 함수로 제어되는 led0과 led1이라는 두 개의 LED를 각각 제어합니다.
blink0()는led0를 제어하며, 슬립 주기는 100ms입니다.blink1()은led1을 제어하며, 슬립 주기는 1000ms입니다.
두 스레드 중 어느 하나가 LED를 토글할 때마다, 해당 스레드 및 LED를 식별하는 정보와 토글 회수를 선입선출 큐 (:ref:FIFO <fifos_v2>)에 추가합니다. 세 번째 스레드는 :c:func:printk를 사용하여 FIFO에 추가된 정보를 디바이스 콘솔로 출력합니다. 이 예제는 다음과 같이 빌드할 수 있습니다.
(venv) /zephyr/zephyrproject/zephyr$ west build -p always -b nrf54l15dk/nrf54l15/cpuapp samples/basic/threads
마지막으로 실행 파일을 nRF54L15-DK 개발 키트에 다운로드합니다.
(venv) /zephyr/zephyrproject/zephyr$ west flash
다시 한 번, minicom 또는 다른 시리얼 프로그램을 사용하면 아래와 같이 호스트 PC에서 USB 케이블을 통해 출력을 볼 수 있습니다.
Welcome to minicom 2.9
OPTIONS: I18nPort /dev/ttyACM1, 00:16:08
Press CTRL-A Z for help on special keys
Toggled led0; counter=8
Toggled led0; counter=9
Toggled led1; counter=1
Toggled led0; counter=10
Toggled led0; counter=11
Toggled led0; counter=12
Toggled led0; counter=13
Toggled led0; counter=14
Toggled led0; counter=15
Toggled led0; counter=16
Toggled led0; counter=17
Toggled led0; counter=18
Toggled led0; counter=19
Toggled led1; counter=2
Toggled led0; counter=20
Toggled led0; counter=21
Toggled led0; counter=22
Toggled led0; counter=23
Toggled led0; counter=24
Toggled led0; counter=25
Toggled led0; counter=26
Toggled led0; counter=27
Toggled led0; counter=28
Toggled led0; counter=29
…
다음 영상은 앞서 minicom으로 확인한 Zephyr 스레드에 따라 nRF54L15-DK 개발 키트의 LED0와 LED1이 깜빡이는 모습을 보여줍니다.
아래 위치에 있는 소스 코드를 수정하고, 위에서 설명한 빌드 및 플래시 과정을 반복하면 됩니다.
zephyrproject/zephyr/samples/basic/threads/src/main.c
또 다른 예제로는 GPIO 입력을 인터럽트로 사용하는 방법을 보여주는 간단한 버튼 데모가 있습니다. 이 예제는 버튼 0을 누를 때마다 콘솔에 메시지를 출력합니다.
Welcome to minicom 2.9
OPTIONS: I18nPort /dev/ttyACM1, 00:27:52
Press CTRL-A Z for help on special keys
Button pressed at 673320
Button pressed at 1464286
Button pressed at 2446485
Button pressed at 6736908
Button pressed at 7425903
Button pressed at 8269811
Button pressed at 8398743
Button pressed at 8606173
Button pressed at 8725072
Button pressed at 9167836
Button pressed at 10183197
Button pressed at 10795567
Button pressed at 11698303
이 버튼 인터럽트 예제는 다음과 같은 단계로 빌드 및 플래시 할 수 있습니다.
(venv) /zephyr/zephyrproject/zephyr$ west build -p always -b nrf54l15dk/nrf54l15/cpuapp samples/basic/button
(venv) /zephyr/zephyrproject/zephyr$ west flash
마지막은 Zephyr HCI VS (Vendor-Specific, 벤더 전용) 명령을 통해 저전력 블루투스 컨트롤러의 링크 계층에서 동적 송신 출력 제어를 수행하는 예제입니다. 이 애플리케이션은 RF 송신 출력을 변경하면서 광고 (advertising)하는 주변 장치 (peripheral)를 구현합니다. 광고하는 주변 장치의 송신 출력은 애플리케이션 실행 후 처음 5초 동안은 Kconfig에 설정된 기본 송신 출력을 유지합니다. 이후 주변 장치의 송신 출력은 -4 dBm에서 -30 dBm 범위에서 5초마다 한 계단식 반복적으로 하강합니다. 성공적으로 연결되면, 연결 신호의 수신 신호 강도 지수 (RSSI)를 모니터링하여 이를 기반으로 주변 장치의 송신 출력을 연결 상태에 맞게 조절합니다. 따라서 연결 신호의 RSSI 세기에 따라 에너지를 절약할 수 있습니다. 이 주변 장치는 간단한 GATT 프로파일을 구현하고 있으며, 연결된 중앙 장치에 2초마다 더미 심박수를 알리는 HR 서비스를 제공합니다.
이 예제는 다음과 같은 방식으로 빌드 및 플래시 할 수 있습니다.
(venv) /zephyr/zephyrproject/zephyr$ west build -p always -b nrf54l15dk/nrf54l15/cpuapp samples/bluetooth/hci_pwr_ctrl/
(venv) /zephyr/zephyrproject/zephyr$ west flash
이 RF 송신 출력 조정은 nRF54L15‑DK 개발 키트에서 다음과 같이 표시됩니다.
Welcome to minicom 2.9
OPTIONS: I18nPort /dev/ttyACM1, 00:42:21
Press CTRL-A Z for help on special keys
*** Booting Zephyr OS build v4.2.0-2763-g5af3adf66fb3 ***
Starting Dynamic Tx Power Beacon Demo
[00:00:00.002,504]
bt_hci_core: HW Platform: Nordic Semiconductor (0x0002)
[00:00:00.002,517] bt_hci_core:
HW Variant: nRF54Lx (0x0005)
[00:00:00.002,529] bt_hci_core:
Firmware: Standard Bluetooth controller (0x00) Version 4.2 Build 99
[00:00:00.002,748] bt_hci_core:
HCI transport: Controller
[00:00:00.002,797] bt_hci_core:
Identity: F2:57:B1:05:95:C5 (random)[00:00:00.002,811] bt_hci_core:
HCI: version 5.4 (0x0d) revision 0x0000, manufacturer 0x05f1
[00:00:00.002,824]
bt_hci_core: LMP: version 5.4 (0x0d) subver 0xffff
Bluetooth initialized
Dynamic Tx power Beacon started
Get Tx power level ->-> default
TXP = 24.
Set Tx power level to 4
Actual Tx Power: 4
Get Tx power level → TXP = 4
Set Tx power level to 0.
Actual Tx Power: 0
Get Tx power level → TXP = 0
Set Tx power level to -3.
Actual Tx Power: -3
Get Tx power level → TXP = -3
Set Tx power level to -8
Actual Tx Power: -8
아래 위치의 소스 코드로 이 동적 RF 송신 출력 제어 메커니즘을 수정할 수 있습니다.
zephyrproject/zephyr/samples/samples/bluetooth/hci_pwr_ctrl/src/main.c
이 글을 통해 Zephyr 설치 과정과 더불어 nRF54L15-DK 개발 키트의 일부 기능을 보여주는 예제들에 대한 이해에 도움이 되었기를 바랍니다. 그리고, Nordic nRF7002-DK 개발 키트의 빌드 및 플래시 과정을 설명하는 새로운 게시글을 여기에서 확인하실 수 있습니다.
좋은 하루 보내세요!
최신 소식: Nordic에서 nRF54L 시리즈 개발 키트를 위한 베어메탈 (Bare Metal) 옵션을 제공하였으며, 해당 데모와 자세한 내용은 여기에서 확인하실 수 있습니다.