Initial commit.

This commit is contained in:
imi415 2021-11-24 22:12:49 +08:00
commit 70117b35db
Signed by: imi415
GPG Key ID: 17F01E106F9F5E0A
9 changed files with 4113 additions and 0 deletions

215
CMakeLists.txt Normal file
View 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
View 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")

View 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"

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

File diff suppressed because it is too large Load Diff

85
include/custom_board.h Normal file
View 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
View 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
View 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;
}