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. |