Initial commit.
This commit is contained in:
commit
70117b35db
215
CMakeLists.txt
Normal file
215
CMakeLists.txt
Normal file
|
@ -0,0 +1,215 @@
|
|||
cmake_minimum_required(VERSION 3.12)
|
||||
|
||||
project(nrf51_template)
|
||||
|
||||
enable_language(CXX)
|
||||
enable_language(ASM)
|
||||
|
||||
if(NOT DEFINED NRF5_SDK_ROOT)
|
||||
message(FATAL_ERROR "NRF5_SDK_ROOT not defined")
|
||||
endif()
|
||||
|
||||
set(NRF5_DEVICE "NRF51822")
|
||||
set(NRF5_S130_VERSION "2.0.1")
|
||||
|
||||
set(TARGET_CFLAGS_EXTRA "")
|
||||
set(TARGET_CXXFLAGS_EXTRA "")
|
||||
set(TARGET_LDFLAGS_EXTRA "-Wl,--print-memory-usage")
|
||||
|
||||
# Shared C source code
|
||||
set(TARGET_C_SOURCES
|
||||
"src/main.c"
|
||||
"${NRF5_SDK_ROOT}/components/boards/boards.c"
|
||||
"${NRF5_SDK_ROOT}/components/drivers_nrf/clock/nrf_drv_clock.c"
|
||||
"${NRF5_SDK_ROOT}/components/drivers_nrf/common/nrf_drv_common.c"
|
||||
"${NRF5_SDK_ROOT}/components/drivers_nrf/uart/nrf_drv_uart.c"
|
||||
"${NRF5_SDK_ROOT}/components/libraries/hardfault/hardfault_implementation.c"
|
||||
"${NRF5_SDK_ROOT}/components/libraries/log/src/nrf_log_backend_serial.c"
|
||||
"${NRF5_SDK_ROOT}/components/libraries/log/src/nrf_log_frontend.c"
|
||||
"${NRF5_SDK_ROOT}/components/libraries/timer/app_timer.c"
|
||||
"${NRF5_SDK_ROOT}/components/libraries/util/app_error.c"
|
||||
"${NRF5_SDK_ROOT}/components/libraries/util/app_error_weak.c"
|
||||
"${NRF5_SDK_ROOT}/components/libraries/util/app_util_platform.c"
|
||||
"${NRF5_SDK_ROOT}/components/libraries/util/nrf_assert.c"
|
||||
"${NRF5_SDK_ROOT}/components/libraries/util/sdk_errors.c"
|
||||
"${NRF5_SDK_ROOT}/components/toolchain/system_nrf51.c"
|
||||
)
|
||||
|
||||
# C source code for applications with SoftDevice
|
||||
set(TARGET_C_SOURCES_SD
|
||||
"${NRF5_SDK_ROOT}/components/softdevice/common/softdevice_handler/softdevice_handler.c"
|
||||
)
|
||||
|
||||
# Assembly source code
|
||||
set(TARGET_ASM_SOURCES
|
||||
"${NRF5_SDK_ROOT}/components/toolchain/gcc/gcc_startup_nrf51.S"
|
||||
)
|
||||
|
||||
# Shared include directories
|
||||
set(TARGET_C_INCLUDES
|
||||
"config"
|
||||
"include"
|
||||
"${NRF5_SDK_ROOT}/components/boards"
|
||||
"${NRF5_SDK_ROOT}/components/device"
|
||||
"${NRF5_SDK_ROOT}/components/drivers_nrf/clock"
|
||||
"${NRF5_SDK_ROOT}/components/drivers_nrf/common"
|
||||
"${NRF5_SDK_ROOT}/components/drivers_nrf/delay"
|
||||
"${NRF5_SDK_ROOT}/components/drivers_nrf/hal"
|
||||
"${NRF5_SDK_ROOT}/components/drivers_nrf/uart"
|
||||
"${NRF5_SDK_ROOT}/components/libraries/log"
|
||||
"${NRF5_SDK_ROOT}/components/libraries/log/src"
|
||||
"${NRF5_SDK_ROOT}/components/libraries/util"
|
||||
"${NRF5_SDK_ROOT}/components/toolchain"
|
||||
"${NRF5_SDK_ROOT}/components/toolchain/cmsis/include"
|
||||
)
|
||||
|
||||
# Include directories for applications without SoftDevice
|
||||
set(TARGET_C_INCLUDES_BLANK
|
||||
"${NRF5_SDK_ROOT}/components/drivers_nrf/nrf_soc_nosd"
|
||||
)
|
||||
|
||||
# Include directories for applications with SoftDevice
|
||||
set(TARGET_C_INCLUDES_SD
|
||||
"${NRF5_SDK_ROOT}/components/softdevice/common/softdevice_handler"
|
||||
"${NRF5_SDK_ROOT}/components/softdevice/s130/headers"
|
||||
)
|
||||
|
||||
# Shared C/CXX macros
|
||||
set(TARGET_C_DEFINES
|
||||
"NRF51"
|
||||
"${NRF5_DEVICE}"
|
||||
"BSP_DEFINES_ONLY"
|
||||
"BOARD_CUSTOM"
|
||||
"SWI_DISABLE0"
|
||||
"USE_APP_CONFIG"
|
||||
)
|
||||
|
||||
# C/CXX macros for applications with SoftDevice
|
||||
set(TARGET_DEFINES_SD
|
||||
"S130"
|
||||
"SOFTDEVICE_PRESENT"
|
||||
"BLE_SUPPORT_REQD"
|
||||
"NRF_SD_BLE_API_VERSION=2"
|
||||
)
|
||||
|
||||
# Shared libraries linked with application
|
||||
set(TARGET_LIBS
|
||||
)
|
||||
|
||||
# Shared library and linker script search paths
|
||||
set(TARGET_LIB_DIRECTORIES
|
||||
"${NRF5_SDK_ROOT}/components/toolchain/gcc"
|
||||
)
|
||||
|
||||
# Device specific settings, goes to C, CXX and ASM flags.
|
||||
set(TARGET_CFLAGS_HARDWARE "-mcpu=cortex-m0 -mfloat-abi=soft -mthumb")
|
||||
|
||||
# Conditional flags
|
||||
# DEBUG
|
||||
set(CMAKE_C_FLAGS_DEBUG "-DDEBUG -Og -g")
|
||||
set(CMAKE_CXX_FLAGS_DEBUG "-DDEBUG -Og -g")
|
||||
set(CMAKE_ASM_FLAGS_DEBUG "-DDEBUG -Og -g")
|
||||
|
||||
# RELEASE
|
||||
set(CMAKE_C_FLAGS_RELEASE "-DNDEBUG -O3 -flto")
|
||||
set(CMAKE_CXX_FLAGS_RELEASE "-DNDEBUG -O3 -flto")
|
||||
set(CMAKE_ASM_FLAGS_RELEASE "-DNDEBUG -O3 -flto")
|
||||
set(CMAKE_EXE_LINKER_FLAGS_DEBUG "-flto")
|
||||
|
||||
# Final compiler flags
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${TARGET_CFLAGS_HARDWARE} ${TARGET_CFLAGS_EXTRA} -Wall -fdata-sections -ffunction-sections -fno-strict-aliasing -fno-builtin")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TARGET_CFLAGS_HARDWARE} ${TARGET_CXXFLAGS_EXTRA} -Wall -fdata-sections -ffunction-sections -fno-strict-aliasing -fno-builtin")
|
||||
set(CMAKE_ASM_FLAGS "${CMAKE_C_FLAGS} -x assembler-with-cpp")
|
||||
set(CMAKE_EXE_LINKER_FLAGS "-specs=nano.specs -specs=nosys.specs -Wl,--gc-sections -lc -lm -lnosys ${TARGET_LDFLAGS_EXTRA}")
|
||||
|
||||
# Different linker scripts for different flavors.
|
||||
# Note that SoftDevice requires certain memory ranges reserved for private use.
|
||||
set(TARGET_LDSCRIPT_BLANK_AA "${NRF5_SDK_ROOT}/components/toolchain/gcc/nrf51_xxaa.ld") # Blank device
|
||||
set(TARGET_LDSCRIPT_BLANK_AC "${NRF5_SDK_ROOT}/components/toolchain/gcc/nrf51_xxac.ld") # Blank device with additional 16KB SRAM
|
||||
set(TARGET_LDSCRIPT_SD_AA "${CMAKE_SOURCE_DIR}/components/toolchain/gcc/nrf51_xxaa_sd.ld") # With SoftDevice
|
||||
set(TARGET_LDSCRIPT_SD_AC "${CMAKE_SOURCE_DIR}/components/toolchain/gcc/nrf51_xxaa_sd.ld") # With SoftDevice and additional 16KB SRAM
|
||||
|
||||
# Add shared includes, defines and libs
|
||||
include_directories(${TARGET_C_INCLUDES})
|
||||
add_compile_definitions(${TARGET_C_DEFINES})
|
||||
link_directories(${TARGET_LIB_DIRECTORIES})
|
||||
link_libraries(${TARGET_LIBS})
|
||||
|
||||
# Main targets are added below
|
||||
|
||||
# ============================= AA variant, without SD ============================= #
|
||||
add_executable("${CMAKE_PROJECT_NAME}_blank_xxaa.elf" ${TARGET_C_SOURCES} ${TARGET_ASM_SOURCES})
|
||||
target_link_options("${CMAKE_PROJECT_NAME}_blank_xxaa.elf"
|
||||
PRIVATE "-T${TARGET_LDSCRIPT_BLANK_AA}"
|
||||
PRIVATE "-Wl,-Map=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}_blank_xxaa.map,--cref"
|
||||
)
|
||||
target_include_directories("${CMAKE_PROJECT_NAME}_blank_xxaa.elf" PRIVATE ${TARGET_C_INCLUDES_BLANK})
|
||||
|
||||
# Generate hex
|
||||
add_custom_command(OUTPUT "${CMAKE_PROJECT_NAME}_blank_xxaa.hex"
|
||||
COMMAND ${CMAKE_OBJCOPY} "-O" "ihex" "${CMAKE_PROJECT_NAME}_blank_xxaa.elf" "${CMAKE_PROJECT_NAME}_blank_xxaa.hex"
|
||||
DEPENDS "${CMAKE_PROJECT_NAME}_blank_xxaa.elf"
|
||||
)
|
||||
add_custom_target("${CMAKE_PROJECT_NAME}_blank_xxaa_hex" DEPENDS "${CMAKE_PROJECT_NAME}_blank_xxaa.hex")
|
||||
# ================================================================================== #
|
||||
|
||||
|
||||
# ============================= AC variant, without SD ============================= #
|
||||
add_executable("${CMAKE_PROJECT_NAME}_blank_xxac.elf" ${TARGET_C_SOURCES} ${TARGET_ASM_SOURCES})
|
||||
target_link_options("${CMAKE_PROJECT_NAME}_blank_xxac.elf"
|
||||
PRIVATE "-T${TARGET_LDSCRIPT_BLANK_AC}"
|
||||
PRIVATE "-Wl,-Map=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}_blank_xxac.map,--cref"
|
||||
)
|
||||
target_include_directories("${CMAKE_PROJECT_NAME}_blank_xxac.elf" PRIVATE ${TARGET_C_INCLUDES_BLANK})
|
||||
|
||||
# Generate hex
|
||||
add_custom_command(OUTPUT "${CMAKE_PROJECT_NAME}_blank_xxac.hex"
|
||||
COMMAND ${CMAKE_OBJCOPY} "-O" "ihex" "${CMAKE_PROJECT_NAME}_blank_xxac.elf" "${CMAKE_PROJECT_NAME}_blank_xxac.hex"
|
||||
DEPENDS "${CMAKE_PROJECT_NAME}_blank_xxac.elf"
|
||||
)
|
||||
add_custom_target("${CMAKE_PROJECT_NAME}_blank_xxac_hex" DEPENDS "${CMAKE_PROJECT_NAME}_blank_xxac.hex")
|
||||
# ================================================================================== #
|
||||
|
||||
|
||||
# =============================== AA variant, with SD =============================== #
|
||||
add_executable("${CMAKE_PROJECT_NAME}_sd_xxaa.elf" ${TARGET_C_SOURCES} ${TARGET_C_SOURCES_SD} ${TARGET_ASM_SOURCES})
|
||||
target_link_options("${CMAKE_PROJECT_NAME}_sd_xxaa.elf"
|
||||
PRIVATE "-T${TARGET_LDSCRIPT_SD_AA}"
|
||||
PRIVATE "-Wl,-Map=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}_sd_xxaa.map,--cref"
|
||||
)
|
||||
target_include_directories("${CMAKE_PROJECT_NAME}_sd_xxaa.elf" PRIVATE ${TARGET_C_INCLUDES_SD})
|
||||
target_compile_definitions("${CMAKE_PROJECT_NAME}_sd_xxaa.elf" PRIVATE ${TARGET_DEFINES_SD})
|
||||
|
||||
# Generate hex
|
||||
add_custom_command(OUTPUT "${CMAKE_PROJECT_NAME}_sd_xxaa.hex" "${CMAKE_PROJECT_NAME}_sd_xxaa_full.hex"
|
||||
COMMAND ${CMAKE_OBJCOPY} "-O" "ihex" "${CMAKE_PROJECT_NAME}_sd_xxaa.elf" "${CMAKE_PROJECT_NAME}_sd_xxaa.hex"
|
||||
COMMAND "${CMAKE_SOURCE_DIR}/scripts/merge_hex.sh"
|
||||
"${NRF5_SDK_ROOT}/components/softdevice/s130/hex/s130_nrf51_${NRF5_S130_VERSION}_softdevice.hex"
|
||||
"${CMAKE_PROJECT_NAME}_sd_xxaa.hex"
|
||||
"${CMAKE_PROJECT_NAME}_sd_xxaa_full.hex"
|
||||
DEPENDS "${CMAKE_PROJECT_NAME}_sd_xxaa.elf"
|
||||
)
|
||||
add_custom_target("${CMAKE_PROJECT_NAME}_sd_xxaa_hex" DEPENDS "${CMAKE_PROJECT_NAME}_sd_xxaa.hex")
|
||||
# ================================================================================== #
|
||||
|
||||
|
||||
# =============================== AC variant, with SD =============================== #
|
||||
add_executable("${CMAKE_PROJECT_NAME}_sd_xxac.elf" ${TARGET_C_SOURCES} ${TARGET_C_SOURCES_SD} ${TARGET_ASM_SOURCES})
|
||||
target_link_options("${CMAKE_PROJECT_NAME}_sd_xxac.elf"
|
||||
PRIVATE "-T${TARGET_LDSCRIPT_SD_AC}"
|
||||
PRIVATE "-Wl,-Map=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}_sd_xxac.map,--cref"
|
||||
)
|
||||
target_include_directories("${CMAKE_PROJECT_NAME}_sd_xxac.elf" PRIVATE ${TARGET_C_INCLUDES_SD})
|
||||
target_compile_definitions("${CMAKE_PROJECT_NAME}_sd_xxac.elf" PRIVATE ${TARGET_DEFINES_SD})
|
||||
|
||||
# Generate hex
|
||||
add_custom_command(OUTPUT "${CMAKE_PROJECT_NAME}_sd_xxac.hex" "${CMAKE_PROJECT_NAME}_sd_xxac_full.hex"
|
||||
COMMAND ${CMAKE_OBJCOPY} "-O" "ihex" "${CMAKE_PROJECT_NAME}_sd_xxac.elf" "${CMAKE_PROJECT_NAME}_sd_xxac.hex"
|
||||
COMMAND "${CMAKE_SOURCE_DIR}/scripts/merge_hex.sh"
|
||||
"${NRF5_SDK_ROOT}/components/softdevice/s130/hex/s130_nrf51_${NRF5_S130_VERSION}_softdevice.hex"
|
||||
"${CMAKE_PROJECT_NAME}_sd_xxac.hex"
|
||||
"${CMAKE_PROJECT_NAME}_sd_xxac_full.hex"
|
||||
DEPENDS "${CMAKE_PROJECT_NAME}_sd_xxac.elf"
|
||||
)
|
||||
add_custom_target("${CMAKE_PROJECT_NAME}_sd_xxac_hex" DEPENDS "${CMAKE_PROJECT_NAME}_sd_xxac.hex")
|
||||
# ================================================================================== #
|
5
arm-none-eabi.cmake
Normal file
5
arm-none-eabi.cmake
Normal file
|
@ -0,0 +1,5 @@
|
|||
set(CMAKE_C_COMPILER arm-none-eabi-gcc)
|
||||
set(CMAKE_CXX_COMPILER arm-none-eabi-g++)
|
||||
|
||||
# Make CMake happy about those compilers
|
||||
set(CMAKE_TRY_COMPILE_TARGET_TYPE "STATIC_LIBRARY")
|
13
components/toolchain/gcc/nrf51_xxaa_sd.ld
Normal file
13
components/toolchain/gcc/nrf51_xxaa_sd.ld
Normal file
|
@ -0,0 +1,13 @@
|
|||
/* Linker script to configure memory regions. */
|
||||
|
||||
SEARCH_DIR(.)
|
||||
GROUP(-lgcc -lc -lnosys)
|
||||
|
||||
MEMORY
|
||||
{
|
||||
FLASH (rx) : ORIGIN = 0x0001B000, LENGTH = 0x25000
|
||||
RAM (rwx) : ORIGIN = 0x200013C8, LENGTH = 0x6C38
|
||||
}
|
||||
|
||||
|
||||
INCLUDE "nrf51_common.ld"
|
13
components/toolchain/gcc/nrf51_xxac_sd.ld
Normal file
13
components/toolchain/gcc/nrf51_xxac_sd.ld
Normal file
|
@ -0,0 +1,13 @@
|
|||
/* Linker script to configure memory regions. */
|
||||
|
||||
SEARCH_DIR(.)
|
||||
GROUP(-lgcc -lc -lnosys)
|
||||
|
||||
MEMORY
|
||||
{
|
||||
FLASH (rx) : ORIGIN = 0x0001B000, LENGTH = 0x25000
|
||||
RAM (rwx) : ORIGIN = 0x200013C8, LENGTH = 0x8000
|
||||
}
|
||||
|
||||
|
||||
INCLUDE "nrf51_common.ld"
|
6
config/app_config.h
Normal file
6
config/app_config.h
Normal file
|
@ -0,0 +1,6 @@
|
|||
#ifndef APP_CONFIG_H
|
||||
#define APP_CONFIG_H
|
||||
|
||||
/* Define your App config here */
|
||||
#define NRF_LOG_ENABLED 1
|
||||
#endif
|
3724
config/sdk_config.h
Normal file
3724
config/sdk_config.h
Normal file
File diff suppressed because it is too large
Load Diff
85
include/custom_board.h
Normal file
85
include/custom_board.h
Normal file
|
@ -0,0 +1,85 @@
|
|||
/**
|
||||
* @file custom_board.h
|
||||
* @author imi415 <imi415.public@gmail.com>
|
||||
* @brief Custom board file for Waveshare BLE-400 board.
|
||||
* @version 0.1
|
||||
* @date 2021-11-24
|
||||
*
|
||||
* @copyright Copyright (c) 2021 imi415
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef CUSTOM_BOARD_H
|
||||
#define CUSTOM_BOARD_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "nrf_gpio.h"
|
||||
|
||||
// LEDs definitions for Waveshare BLE-400
|
||||
#define LED_START 18
|
||||
#define LED_0 18
|
||||
#define LED_1 19
|
||||
#define LED_2 20
|
||||
#define LED_3 21
|
||||
#define LED_4 22
|
||||
#define LED_STOP 22
|
||||
|
||||
#define LEDS_ACTIVE_STATE 1
|
||||
|
||||
#define LEDS_INV_MASK LEDS_MASK
|
||||
|
||||
#define LED_0_MASK (1<<LED_0)
|
||||
#define LED_1_MASK (1<<LED_1)
|
||||
#define LED_2_MASK (1<<LED_2)
|
||||
#define LED_3_MASK (1<<LED_3)
|
||||
#define LED_4_MASK (1<<LED_4)
|
||||
|
||||
#define BSP_LED_0 LED_0
|
||||
#define BSP_LED_1 LED_1
|
||||
#define BSP_LED_2 LED_2
|
||||
#define BSP_LED_3 LED_3
|
||||
#define BSP_LED_4 LED_4
|
||||
|
||||
// Buttons definitions for Waveshare BLE-400
|
||||
#define BUTTON_START 16
|
||||
#define BUTTON_0 16
|
||||
#define BUTTON_1 17
|
||||
#define BUTTON_END 17
|
||||
#define BUTTON_PULL NRF_GPIO_PIN_PULLUP
|
||||
|
||||
#define BUTTONS_ACTIVE_STATE 0
|
||||
|
||||
#define BSP_BUTTON_0 BUTTON_0
|
||||
#define BSP_BUTTON_1 BUTTON_1
|
||||
|
||||
#define BUTTONS_LIST { BUTTON_0, BUTTON_1, }
|
||||
#define LEDS_LIST { LED_0, LED_1, LED_2, LED_3, LED_4, }
|
||||
|
||||
#define BUTTONS_NUMBER 2
|
||||
#define LEDS_NUMBER 5
|
||||
|
||||
// UART connection with CP2102
|
||||
#define RX_PIN_NUMBER 11
|
||||
#define TX_PIN_NUMBER 9
|
||||
#define CTS_PIN_NUMBER 10
|
||||
#define RTS_PIN_NUMBER 8
|
||||
#define HWFC false
|
||||
|
||||
// Low frequency clock source to be used by the SoftDevice
|
||||
#ifdef S210
|
||||
#define NRF_CLOCK_LFCLKSRC NRF_CLOCK_LFCLKSRC_XTAL_20_PPM
|
||||
#else
|
||||
#define NRF_CLOCK_LFCLKSRC {.source = NRF_CLOCK_LF_SRC_XTAL, \
|
||||
.rc_ctiv = 0, \
|
||||
.rc_temp_ctiv = 0, \
|
||||
.xtal_accuracy = NRF_CLOCK_LF_XTAL_ACCURACY_20_PPM}
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
23
scripts/merge_hex.sh
Executable file
23
scripts/merge_hex.sh
Executable file
|
@ -0,0 +1,23 @@
|
|||
#!/bin/bash
|
||||
|
||||
SD_HEX=$1
|
||||
APP_HEX=$2
|
||||
FULL_HEX=$3
|
||||
|
||||
if [ $# -le 2 ] ; then
|
||||
echo 'Usage: merge_hex.sh ${PATH_TO_SD} ${PATH_TO_APP} ${PATH_TO_FULL}'
|
||||
exit -1
|
||||
fi
|
||||
|
||||
echo 'Merging ihex files...'
|
||||
|
||||
# Copy SoftDevice file
|
||||
cat "${SD_HEX}" > "${FULL_HEX}"
|
||||
|
||||
# Strip the last line (EOF marker) from SoftDevice.
|
||||
sed -i "$ d" "${FULL_HEX}"
|
||||
|
||||
# Append application code to the file
|
||||
cat "${APP_HEX}" >> "${FULL_HEX}"
|
||||
|
||||
echo 'Done.'
|
29
src/main.c
Normal file
29
src/main.c
Normal file
|
@ -0,0 +1,29 @@
|
|||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "nrf_delay.h"
|
||||
|
||||
#include "nrf_log.h"
|
||||
#include "nrf_log_ctrl.h"
|
||||
|
||||
#include "boards.h"
|
||||
|
||||
int main(const int argc, const char* argv[]) {
|
||||
bsp_board_leds_init();
|
||||
|
||||
/* Initialize the log module */
|
||||
APP_ERROR_CHECK(NRF_LOG_INIT(NULL));
|
||||
|
||||
/* Print welcome string and flush log buffer */
|
||||
NRF_LOG_INFO("Application started.\r\n");
|
||||
NRF_LOG_FLUSH();
|
||||
for(;;) {
|
||||
// Dead Loop
|
||||
for(int i = 0; i < LEDS_NUMBER; i++) {
|
||||
bsp_board_led_invert(i);
|
||||
nrf_delay_ms(500);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user