Программирование ARM Zephyr: сборка примера мигания светодиодом (Blinky Sample) Sat, May 04 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

Zephyr: сборка примера мигания светодиодом (Blinky Sample) Печать
Добавил(а) microsin   

Проект Blinky совместим со многими поддерживаемыми платами [2], но не со всеми. Если ваша плата не удовлетворяет требованиям Blinky (например, на ней нет светодиода, подключенного к ножке порта GPIO, см. [3]), то хорошей альтернативой быстрого старта будет пример Hello World [4].

Шаг 1: установка текущего каталога Zephyr.

Перейдите в корневой каталог Zephyr. Это каталог, в котором находится файл west.yml и папки boards, samples и другие. Обычно корневой каталог Zephyr находится в каталоге пользователя, в папке наподобие ~/zephyrprj/zephyr/ или ~/zephyr/.

$ cd ~/zephyrprj/zephyr/
$ ls
arch                doc             lib              scripts       version.h.in
boards              drivers         LICENSE          share         west.yml
cmake               dts             MAINTAINERS.yml  soc           zephyr-env.cmd
CMakeLists.txt      include         misc             submanifests  zephyr-env.sh
CODE_OF_CONDUCT.md  Kconfig         modules          subsys
CODEOWNERS          Kconfig.zephyr  README.rst       tests
CONTRIBUTING.rst    kernel          samples          VERSION

Шаг 2: выбор целевой платы для экспериментов.

Для компиляции проекта примера необходимо выбрать целевую плату, которая у вас есть в наличии, и которая поддерживается Zephyr [2]. Если вы не уверены, какое имя использует west для вашей платы, то подсказкой может быть команда west boards, которая выведет список поддерживаемых плат:

$ west boards
96b_aerocore2
96b_argonkey
96b_avenger96
96b_carbon
...
xiao_ble
xmc45_relax_kit
xt-sim
zybo

96b_aerocore2
96b_argonkey
96b_avenger96
96b_carbon
96b_carbon_nrf51
96b_meerkat96
96b_neonkey
96b_nitrogen
96b_stm32_sensor_mez
96b_wistrio
acrn
acrn_ehl_crb
actinius_icarus
actinius_icarus_bee
actinius_icarus_bee_ns
actinius_icarus_ns
actinius_icarus_som
actinius_icarus_som_ns
adafruit_feather_m0_basic_proto
adafruit_feather_nrf52840
adafruit_feather_stm32f405
adafruit_itsybitsy_m4_express
adafruit_trinket_m0
adp_xc7k_ae350
altera_max10
arduino_due
arduino_mkrzero
arduino_nano_33_ble
arduino_nano_33_ble_sense
arduino_nano_33_iot
arduino_nicla_sense_me
arduino_zero
arty_a7_arm_designstart_m1
arty_a7_arm_designstart_m3
ast1030_evb
atsamd20_xpro
atsamd21_xpro
atsame54_xpro
atsaml21_xpro
atsamr21_xpro
atsamr34_xpro
b_g474e_dpow1
b_l072z_lrwan1
b_l4s5i_iot01a
b_u585i_iot02a
b_u585i_iot02a_ns
bbc_microbit
bbc_microbit_v2
bcm958401m2
bcm958402m2_a72
bcm958402m2_m7
beaglev_starlight_jh7100
bl5340_dvk_cpuapp
bl5340_dvk_cpuapp_ns
bl5340_dvk_cpunet
bl652_dvk
bl653_dvk
bl654_dvk
bl654_sensor_board
bl654_usb
black_f407ve
black_f407zg_pro
blackpill_f401cc
blackpill_f401ce
blackpill_f411ce
blueclover_plt_demo_v2_nrf52832
bt510
bt610
cc1352r1_launchxl
cc1352r_sensortag
cc26x2r1_launchxl
cc3220sf_launchxl
cc3235sf_launchxl
circuitdojo_feather_nrf9160
circuitdojo_feather_nrf9160_ns
colibri_imx7d_m4
contextualelectronics_abc
cy8ckit_062_ble_m0
cy8ckit_062_ble_m4
cy8ckit_062_wifi_bt_m0
cy8ckit_062_wifi_bt_m4
cyclonev_socdk
da1469x_dk_pro
decawave_dwm1001_dev
degu_evk
disco_l475_iot1
dragino_lsn50
dragino_nbsn95
ebyte_e73_tbb_nrf52832
efm32gg_slwstk6121a
efm32gg_stk3701a
efm32hg_slstk3400a
efm32pg_stk3401a
efm32pg_stk3402a
efm32pg_stk3402a_jg
efm32wg_stk3800
efr32_radio_brd4104a
efr32_radio_brd4180a
efr32_radio_brd4250b
efr32_radio_brd4255a
efr32mg_sltb004a
ehl_crb
ehl_crb_sbl
em_starterkit
em_starterkit_em11d
em_starterkit_em7d
em_starterkit_em7d_v22
emsdp
emsdp_em4
emsdp_em5d
emsdp_em6
emsdp_em7d
emsdp_em7d_esp
emsdp_em9d
esp32
esp32_net
esp32c3_devkitm
esp32s2_saola
esp_wrover_kit
faze
frdm_k22f
frdm_k64f
frdm_k82f
frdm_kl25z
frdm_kw41z
fvp_base_revc_2xaemv8a
fvp_base_revc_2xaemv8a_smp_ns
fvp_baser_aemv8r
fvp_baser_aemv8r_aarch32
fvp_baser_aemv8r_smp
gd32e103v_eval
gd32e507v_start
gd32e507z_eval
gd32f350r_eval
gd32f403z_eval
gd32f407v_start
gd32f450i_eval
gd32f450v_start
gd32f450z_eval
gd32f470i_eval
gd32vf103c_starter
gd32vf103v_eval
generic_leon3
google_kukui
gr716a_mini
heltec_wifi_lora32_v2
hexiwear_k64
hexiwear_kw40z
hifive1
hifive1_revb
hifive_unleashed
hifive_unmatched
holyiot_yj16019
hsdk
hsdk_2cores
icev_wireless
intel_adsp_ace15_mtpm
intel_adsp_cavs15
intel_adsp_cavs18
intel_adsp_cavs20
intel_adsp_cavs20_jsl
intel_adsp_cavs25
intel_adsp_cavs25_tgph
intel_socfpga_agilex_socdk
iotdk
ip_k66f
it8xxx2_evb
legend
litex_vexriscv
longan_nano
longan_nano_lite
lora_e5_dev_board
lpcxpresso11u68
lpcxpresso51u68
lpcxpresso54114_m0
lpcxpresso54114_m4
lpcxpresso55s06
lpcxpresso55s16
lpcxpresso55s28
lpcxpresso55s36
lpcxpresso55s69_cpu0
lpcxpresso55s69_cpu1
lpcxpresso55s69_ns
m2gl025_miv
mec1501modular_assy6885
mec15xxevb_assy6853
mec172xevb_assy6906
mec2016evb_assy6797
mercury_xu
mikroe_clicker_2
mikroe_mini_m4_for_stm32
mimx8mm_evk
mimx8mm_evk_a53
mimx8mm_evk_a53_smp
mimx8mn_evk_a53
mimx8mn_evk_a53_smp
mimx8mp_evk_a53
mimx8mp_evk_a53_smp
mimx8mp_evk_ddr
mimx8mp_evk_itcm
mimx8mq_evk_cm4
mimxrt1010_evk
mimxrt1015_evk
mimxrt1020_evk
mimxrt1024_evk
mimxrt1050_evk
mimxrt1050_evk_qspi
mimxrt1060_evk
mimxrt1060_evk_hyperflash
mimxrt1060_evkb
mimxrt1064_evk
mimxrt1160_evk_cm4
mimxrt1160_evk_cm7
mimxrt1170_evk_cm4
mimxrt1170_evk_cm7
mimxrt595_evk_cm33
mimxrt685_evk_cm33
mm_feather
mm_swiftio
mpfs_icicle
mps2_an385
mps2_an521
mps2_an521_ns
mps2_an521_remote
mps3_an547
mps3_an547_ns
msp_exp432p401r_launchxl
native_posix
native_posix_64
neorv32
npcx7m6fb_evb
npcx9m6f_evb
nrf21540dk_nrf52840
nrf51_ble400
nrf51_blenano
nrf51_vbluno51
nrf51dk_nrf51422
nrf51dongle_nrf51422
nrf52832_mdk
nrf52833dk_nrf52820
nrf52833dk_nrf52833
nrf52840_blip
nrf52840_mdk
nrf52840_mdk_usb_dongle
nrf52840_papyr
nrf52840dk_nrf52811
nrf52840dk_nrf52840
nrf52840dongle_nrf52840
nrf52_adafruit_feather
nrf52_blenano2
nrf52_bsim
nrf52_sparkfun
nrf52_vbluno52
nrf52dk_nrf52805
nrf52dk_nrf52810
nrf52dk_nrf52832
nrf5340dk_nrf5340_cpuapp
nrf5340dk_nrf5340_cpuapp_ns
nrf5340dk_nrf5340_cpunet
nrf9160_innblue21
nrf9160_innblue21_ns
nrf9160_innblue22
nrf9160_innblue22_ns
nrf9160dk_nrf52840
nrf9160dk_nrf9160
nrf9160dk_nrf9160_ns
nsim_em
nsim_em7d_v22
nsim_hs
nsim_hs5x
nsim_hs5x_smp
nsim_hs6x
nsim_hs6x_smp
nsim_hs_mpuv6
nsim_hs_smp
nsim_sem
nsim_sem_mpu_stack_guard
nucleo_f030r8
nucleo_f031k6
nucleo_f070rb
nucleo_f091rc
nucleo_f103rb
nucleo_f207zg
nucleo_f302r8
nucleo_f303k8
nucleo_f303re
nucleo_f334r8
nucleo_f401re
nucleo_f410rb
nucleo_f411re
nucleo_f412zg
nucleo_f413zh
nucleo_f429zi
nucleo_f446re
nucleo_f446ze
nucleo_f746zg
nucleo_f756zg
nucleo_f767zi
nucleo_g031k8
nucleo_g071rb
nucleo_g0b1re
nucleo_g431rb
nucleo_g474re
nucleo_h723zg
nucleo_h743zi
nucleo_h745zi_q_m4
nucleo_h745zi_q_m7
nucleo_h753zi
nucleo_h7a3zi_q
nucleo_l011k4
nucleo_l031k6
nucleo_l053r8
nucleo_l073rz
nucleo_l152re
nucleo_l412rb_p
nucleo_l432kc
nucleo_l433rc_p
nucleo_l452re
nucleo_l452re_p
nucleo_l476rg
nucleo_l496zg
nucleo_l4r5zi
nucleo_l552ze_q
nucleo_l552ze_q_ns
nucleo_u575zi_q
nucleo_wb55rg
nucleo_wl55jc
nuvoton_pfm_m487
nxp_adsp_imx8
nxp_adsp_imx8m
nxp_adsp_imx8x
nxp_ls1046ardb
nxp_ls1046ardb_smp_2cores
nxp_ls1046ardb_smp_4cores
odroid_go
olimex_esp32_evb
olimex_lora_stm32wl_devkit
olimex_stm32_e407
olimex_stm32_h103
olimex_stm32_h405
olimex_stm32_h407
olimex_stm32_p405
olimexino_stm32
pan1770_evb
pan1780_evb
pan1781_evb
pan1782_evb
particle_argon
particle_boron
particle_xenon
pico_pi_m4
pinetime_devkit0
pinnacle_100_dvk
qemu_arc_em
qemu_arc_hs
qemu_arc_hs5x
qemu_arc_hs6x
qemu_cortex_a53
qemu_cortex_a53_smp
qemu_cortex_a53_xip
qemu_cortex_a9
qemu_cortex_m0
qemu_cortex_m3
qemu_cortex_r5
qemu_leon3
qemu_malta
qemu_malta_be
qemu_nios2
qemu_riscv32
qemu_riscv32_smp
qemu_riscv32_xip
qemu_riscv32e
qemu_riscv64
qemu_riscv64_smp
qemu_x86
qemu_x86_64
qemu_x86_64_nokpti
qemu_x86_lakemont
qemu_x86_nokpti
qemu_x86_nommu
qemu_x86_nopae
qemu_x86_tiny
qemu_x86_virt
qemu_x86_xip
qemu_xtensa
quick_feather
rak4631_nrf52840
rak5010_nrf52840
rcar_h3_salvatorx_cr7
rcar_h3ulcb_cr7
rddrone_fmuk66
reel_board
reel_board_v2
rm1xx_dvk
ronoth_lodev
rpi_pico
ruuvi_ruuvitag
rv32m1_vega_ri5cy
rv32m1_vega_zero_riscy
sam4e_xpro
sam4l_ek
sam4s_xplained
sam_e70_xplained
sam_e70b_xplained
sam_v71_xult
sam_v71b_xult
scobc_module1
seeeduino_xiao
segger_trb_stm32f407
sensortile_box
serpente
sparkfun_thing_plus_nrf9160
sparkfun_thing_plus_nrf9160_ns
steval_fcu001v1
stm3210c_eval
stm32373c_eval
stm32_min_dev_black
stm32_min_dev_blue
stm32f030_demo
stm32f072_eval
stm32f072b_disco
stm32f0_disco
stm32f103_mini
stm32f3_disco
stm32f401_mini
stm32f411e_disco
stm32f412g_disco
stm32f429i_disc1
stm32f469i_disco
stm32f4_disco
stm32f723e_disco
stm32f746g_disco
stm32f7508_dk
stm32f769i_disco
stm32g0316_disco
stm32g071b_disco
stm32g081b_eval
stm32h735g_disco
stm32h747i_disco_m4
stm32h747i_disco_m7
stm32h7b3i_dk
stm32l1_disco
stm32l476g_disco
stm32l496g_disco
stm32l562e_dk
stm32l562e_dk_ns
stm32mp157c_dk2
stm32vl_disco
swan_r5
tdk_robokit1
teensy40
teensy41
thingy52_nrf52832
thingy53_nrf5340_cpuapp
thingy53_nrf5340_cpuapp_ns
thingy53_nrf5340_cpunet
tlsr9518adk80d
twr_ke18f
twr_kv58f220m
ubx_bmd300eval_nrf52832
ubx_bmd330eval_nrf52810
ubx_bmd340eval_nrf52840
ubx_bmd345eval_nrf52840
ubx_bmd360eval_nrf52811
ubx_bmd380eval_nrf52840
ubx_evkannab1_nrf52832
ubx_evkninab1_nrf52832
ubx_evkninab3_nrf52840
ubx_evkninab4_nrf52833
udoo_neo_full_m4
up_squared
usb_kw24d512
v2m_beetle
v2m_musca_b1
v2m_musca_b1_ns
v2m_musca_s1
v2m_musca_s1_ns
warp7_m4
waveshare_open103z
we_ophelia1ev_nrf52805
we_proteus2ev_nrf52832
we_proteus3ev_nrf52840
xenvm
xenvm_gicv3
xiao_ble
xmc45_relax_kit
xt-sim
zybo

Например, в вашем распоряжении плата nRF52840 DK. Её точное имя для west можно узнать командой:

~/zephyrprj/zephyr$ west boards | grep 52840
adafruit_feather_nrf52840
nrf21540dk_nrf52840
nrf52840_blip
nrf52840_mdk
nrf52840_mdk_usb_dongle
nrf52840_papyr
nrf52840dk_nrf52811
nrf52840dk_nrf52840
nrf52840dongle_nrf52840
nrf9160dk_nrf52840
rak4631_nrf52840
rak5010_nrf52840
ubx_bmd340eval_nrf52840
ubx_bmd345eval_nrf52840
ubx_bmd380eval_nrf52840
ubx_evkninab3_nrf52840
we_proteus3ev_nrf52840

Очевидно, что больше всего походит имя nrf52840dk_nrf52840.

Шаг 3: конфигурирование и компиляция.

Чтобы выполнить первоначальную сборку Blinky командой west build, вместо необходимо правильно указать имя вашей используемой платы (в нашем примере имя платы nrf52840dk_nrf52840):

$ cd ~/zephyrprj/zephyr/
$ west build -p always -b nrf52840dk_nrf52840 samples/basic/blinky
-- west build: generating a build system
Loading Zephyr default modules (Zephyr base).
...
-- west build: building application
[1/167] Preparing syscall dependency handling
[3/167] Generating include/generated/version.h
-- Zephyr version: 3.2.0-rc2 (~/zephyrprj/zephyr), build: v3.2.0-rc2-183-g5af0fbc2e302
[157/167] Linking C executable zephyr/zephyr_pre0.elf
[161/167] Linking C executable zephyr/zephyr_pre1.elf
[167/167] Linking C executable zephyr/zephyr.elf
Memory region         Used Size  Region Size  %age Used
           FLASH:       20428 B       412 KB      4.84%
            SRAM:        5632 B       256 KB      2.15%
        IDT_LIST:          0 GB         2 KB      0.00%

Здесь опция -p always принудительно делает пересборку с нуля (pristine build), что рекомендуется делать для новых пользователей. Также можно использовать опцию -p auto, которая будет сама определять, нужна ли чистая пересборка, например когда собирается другой пример проекта.

После выполнения первой полной команды можно использовать её сокращенный вариант в форме west build samples/путь_в_каталог_примера:

$ west build -p auto samples/basic/blinky
ninja: no work to do.
$ west build samples/basic/blinky
ninja: no work to do.

Шаг 4: запись кода примера в память микроконтроллера целевой платы (прошивка).

Подключите вашу плату к хосту, обычно это делается кабелем USB, и включите у неё питание. Если вы застряли на этом шаге и не знаете, что делать, то посетите страничку [2], и перейдите по ссылке, соответствующей вашей плате.

Для прошивки примера выполните команду west flash:

$ west flash
-- west flash: rebuilding
ninja: no work to do.
-- west flash: using runner nrfjprog
Using board 683813629
-- runners.nrfjprog: Flashing file: ~/zephyrprj/zephyr/build/zephyr/zephyr.hex
[ ######               ]   0.000s | Erase file - Check image
[ #####                ]   0.000s | Check image validity - Initialize device info
[ ##########           ]   0.000s | Check image validity - Check region 0 settings
[ ###############      ]   0.000s | Check image validity - block 1 of 2
[ #################### ]   0.026s | Check image validity - Finished
[ #############        ]   0.000s | Erase file - Erasing
[ ##########           ]   0.000s | Erasing non-volatile memory - block 1 of 1
[ #################### ]   0.000s | Erasing non-volatile memory - Erase successful
[ #################### ]   0.576s | Erase file - Done erasing
[ ######               ]   0.000s | Program file - Checking image
[ #####                ]   0.000s | Check image validity - Initialize device info
[ ##########           ]   0.000s | Check image validity - Check region 0 settings
[ ###############      ]   0.223s | Check image validity - block 1 of 2
[ #################### ]   0.020s | Check image validity - Finished
[ #############        ]   0.000s | Program file - Programming
[ ##########           ]   0.000s | Programming image - block 1 of 1
[ #################### ]   0.000s | Programming image - Write successful
[ #################### ]   0.254s | Program file - Done programming
[ ######               ]   0.000s | Verify file - Check image
[ #####                ]   0.000s | Check image validity - Initialize device info
[ ##########           ]   0.000s | Check image validity - Check region 0 settings
[ ###############      ]   0.321s | Check image validity - block 1 of 2
[ #################### ]   0.020s | Check image validity - Finished
[ #############        ]   0.000s | Verify file - Verifying
[ ##########           ]   0.000s | Verifying image - block 1 of 1
[ #################### ]   0.000s | Verifying image - Verify successful
[ #################### ]   0.246s | Verify file - Done verifying                                                       
Enabling pin reset.
Applying pin reset.
-- runners.nrfjprog: Board with serial number 683813629 flashed successfully.

Для успешного выполнения команды west flash вам могут понадобиться дополнительные инструменты, требуемые для вашей платы. В случае проблем команда west flash выведет ошибку с информацией, какие зависимости отсутствуют. Например, для платы nRF52840 DK нужно установить пакет nRF Command Line Tools [5].

[Ссылки]

1. Getting Started Guide site:docs.zephyrproject.org.
2. Zephyr Supported Boards site:docs.zephyrproject.org.
3. Zephyr Basic Samples Blinky site:docs.zephyrproject.org.
4. Zephyr Classic Samples Hello World site:docs.zephyrproject.org.
5. FreeRTOS: запуск примера Hello World на nRF52840 DK.
6. Zephyr: работа с платой nRF52840 DK.

 

Добавить комментарий


Защитный код
Обновить

Top of Page