16 changed files with 53721 additions and 0 deletions
-
8examples/ble_peripheral/ble_app_hrs_freertos_52833/ble_app_hrs_freertos.eww
-
207examples/ble_peripheral/ble_app_hrs_freertos_52833/config/FreeRTOSConfig.h
-
13268examples/ble_peripheral/ble_app_hrs_freertos_52833/hex/ble_app_hrs_freertos_pca10040_s132.hex
-
13473examples/ble_peripheral/ble_app_hrs_freertos_52833/hex/ble_app_hrs_freertos_pca10056_s140.hex
-
3examples/ble_peripheral/ble_app_hrs_freertos_52833/hex/license.txt
-
993examples/ble_peripheral/ble_app_hrs_freertos_52833/main.c
-
10320examples/ble_peripheral/ble_app_hrs_freertos_52833/pca10100/s132/arm5_no_packs/ble_app_hrs_freertos_pca10040_s132.uvprojx
-
344examples/ble_peripheral/ble_app_hrs_freertos_52833/pca10100/s132/armgcc/Makefile
-
130examples/ble_peripheral/ble_app_hrs_freertos_52833/pca10100/s132/armgcc/ble_app_hrs_freertos_gcc_nrf52.ld
-
12034examples/ble_peripheral/ble_app_hrs_freertos_52833/pca10100/s132/config/sdk_config.h
-
37examples/ble_peripheral/ble_app_hrs_freertos_52833/pca10100/s132/iar/ble_app_hrs_freertos_iar_nRF5x.icf
-
1350examples/ble_peripheral/ble_app_hrs_freertos_52833/pca10100/s132/iar/ble_app_hrs_freertos_pca10040_s132.ewd
-
1334examples/ble_peripheral/ble_app_hrs_freertos_52833/pca10100/s132/iar/ble_app_hrs_freertos_pca10040_s132.ewp
-
160examples/ble_peripheral/ble_app_hrs_freertos_52833/pca10100/s132/ses/ble_app_hrs_freertos_pca10040_s132.emProject
-
7examples/ble_peripheral/ble_app_hrs_freertos_52833/pca10100/s132/ses/ble_app_hrs_freertos_pca10040_s132.emSession
-
53examples/ble_peripheral/ble_app_hrs_freertos_52833/pca10100/s132/ses/flash_placement.xml
@ -0,0 +1,8 @@ |
|||||
|
<?xml version="1.0" encoding="iso-8859-1"?> |
||||
|
|
||||
|
<workspace> <project> |
||||
|
<path>$WS_DIR$\pca10040\s132\iar\ble_app_hrs_freertos_pca10040_s132.ewp</path> |
||||
|
</project> <project> |
||||
|
<path>$WS_DIR$\pca10056\s140\iar\ble_app_hrs_freertos_pca10056_s140.ewp</path> |
||||
|
</project> <batchBuild/> |
||||
|
</workspace> |
@ -0,0 +1,207 @@ |
|||||
|
/* |
||||
|
* FreeRTOS Kernel V10.0.0 |
||||
|
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved. |
||||
|
* |
||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of |
||||
|
* this software and associated documentation files (the "Software"), to deal in |
||||
|
* the Software without restriction, including without limitation the rights to |
||||
|
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of |
||||
|
* the Software, and to permit persons to whom the Software is furnished to do so, |
||||
|
* subject to the following conditions: |
||||
|
* |
||||
|
* The above copyright notice and this permission notice shall be included in all |
||||
|
* copies or substantial portions of the Software. If you wish to use our Amazon |
||||
|
* FreeRTOS name, please do so in a fair use way that does not cause confusion. |
||||
|
* |
||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS |
||||
|
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR |
||||
|
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER |
||||
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN |
||||
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
||||
|
* |
||||
|
* http://www.FreeRTOS.org |
||||
|
* http://aws.amazon.com/freertos |
||||
|
* |
||||
|
* 1 tab == 4 spaces! |
||||
|
*/ |
||||
|
|
||||
|
|
||||
|
#ifndef FREERTOS_CONFIG_H |
||||
|
#define FREERTOS_CONFIG_H |
||||
|
|
||||
|
#ifdef SOFTDEVICE_PRESENT |
||||
|
#include "nrf_soc.h" |
||||
|
#endif |
||||
|
#include "app_util_platform.h" |
||||
|
|
||||
|
/*----------------------------------------------------------- |
||||
|
* Possible configurations for system timer |
||||
|
*/ |
||||
|
#define FREERTOS_USE_RTC 0 /**< Use real time clock for the system */ |
||||
|
#define FREERTOS_USE_SYSTICK 1 /**< Use SysTick timer for system */ |
||||
|
|
||||
|
/*----------------------------------------------------------- |
||||
|
* Application specific definitions. |
||||
|
* |
||||
|
* These definitions should be adjusted for your particular hardware and |
||||
|
* application requirements. |
||||
|
* |
||||
|
* THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE |
||||
|
* FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. |
||||
|
* |
||||
|
* See http://www.freertos.org/a00110.html. |
||||
|
*----------------------------------------------------------*/ |
||||
|
|
||||
|
#define configTICK_SOURCE FREERTOS_USE_RTC |
||||
|
|
||||
|
#define configUSE_PREEMPTION 1 |
||||
|
#define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 |
||||
|
#define configUSE_TICKLESS_IDLE 1 |
||||
|
#define configUSE_TICKLESS_IDLE_SIMPLE_DEBUG 1 /* See into vPortSuppressTicksAndSleep source code for explanation */ |
||||
|
#define configCPU_CLOCK_HZ ( SystemCoreClock ) |
||||
|
#define configTICK_RATE_HZ 1024 |
||||
|
#define configMAX_PRIORITIES ( 3 ) |
||||
|
#define configMINIMAL_STACK_SIZE ( 60 ) |
||||
|
#define configTOTAL_HEAP_SIZE ( 4096 ) |
||||
|
#define configMAX_TASK_NAME_LEN ( 4 ) |
||||
|
#define configUSE_16_BIT_TICKS 0 |
||||
|
#define configIDLE_SHOULD_YIELD 1 |
||||
|
#define configUSE_MUTEXES 1 |
||||
|
#define configUSE_RECURSIVE_MUTEXES 1 |
||||
|
#define configUSE_COUNTING_SEMAPHORES 1 |
||||
|
#define configUSE_ALTERNATIVE_API 0 /* Deprecated! */ |
||||
|
#define configQUEUE_REGISTRY_SIZE 2 |
||||
|
#define configUSE_QUEUE_SETS 0 |
||||
|
#define configUSE_TIME_SLICING 0 |
||||
|
#define configUSE_NEWLIB_REENTRANT 0 |
||||
|
#define configENABLE_BACKWARD_COMPATIBILITY 1 |
||||
|
|
||||
|
/* Hook function related definitions. */ |
||||
|
#define configUSE_IDLE_HOOK 0 |
||||
|
#define configUSE_TICK_HOOK 0 |
||||
|
#define configCHECK_FOR_STACK_OVERFLOW 0 |
||||
|
#define configUSE_MALLOC_FAILED_HOOK 0 |
||||
|
|
||||
|
/* Run time and task stats gathering related definitions. */ |
||||
|
#define configGENERATE_RUN_TIME_STATS 0 |
||||
|
#define configUSE_TRACE_FACILITY 0 |
||||
|
#define configUSE_STATS_FORMATTING_FUNCTIONS 0 |
||||
|
|
||||
|
/* Co-routine definitions. */ |
||||
|
#define configUSE_CO_ROUTINES 0 |
||||
|
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) |
||||
|
|
||||
|
/* Software timer definitions. */ |
||||
|
#define configUSE_TIMERS 1 |
||||
|
#define configTIMER_TASK_PRIORITY ( 2 ) |
||||
|
#define configTIMER_QUEUE_LENGTH 32 |
||||
|
#define configTIMER_TASK_STACK_DEPTH ( 80 ) |
||||
|
|
||||
|
/* Tickless Idle configuration. */ |
||||
|
#define configEXPECTED_IDLE_TIME_BEFORE_SLEEP 2 |
||||
|
|
||||
|
/* Tickless idle/low power functionality. */ |
||||
|
|
||||
|
|
||||
|
/* Define to trap errors during development. */ |
||||
|
#if defined(DEBUG_NRF) || defined(DEBUG_NRF_USER) |
||||
|
#define configASSERT( x ) ASSERT(x) |
||||
|
#endif |
||||
|
|
||||
|
/* FreeRTOS MPU specific definitions. */ |
||||
|
#define configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS 1 |
||||
|
|
||||
|
/* Optional functions - most linkers will remove unused functions anyway. */ |
||||
|
#define INCLUDE_vTaskPrioritySet 1 |
||||
|
#define INCLUDE_uxTaskPriorityGet 1 |
||||
|
#define INCLUDE_vTaskDelete 1 |
||||
|
#define INCLUDE_vTaskSuspend 1 |
||||
|
#define INCLUDE_xResumeFromISR 1 |
||||
|
#define INCLUDE_vTaskDelayUntil 1 |
||||
|
#define INCLUDE_vTaskDelay 1 |
||||
|
#define INCLUDE_xTaskGetSchedulerState 1 |
||||
|
#define INCLUDE_xTaskGetCurrentTaskHandle 1 |
||||
|
#define INCLUDE_uxTaskGetStackHighWaterMark 1 |
||||
|
#define INCLUDE_xTaskGetIdleTaskHandle 1 |
||||
|
#define INCLUDE_xTimerGetTimerDaemonTaskHandle 1 |
||||
|
#define INCLUDE_pcTaskGetTaskName 1 |
||||
|
#define INCLUDE_eTaskGetState 1 |
||||
|
#define INCLUDE_xEventGroupSetBitFromISR 1 |
||||
|
#define INCLUDE_xTimerPendFunctionCall 1 |
||||
|
|
||||
|
/* The lowest interrupt priority that can be used in a call to a "set priority" |
||||
|
function. */ |
||||
|
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 0xf |
||||
|
|
||||
|
/* The highest interrupt priority that can be used by any interrupt service |
||||
|
routine that makes calls to interrupt safe FreeRTOS API functions. DO NOT CALL |
||||
|
INTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER |
||||
|
PRIORITY THAN THIS! (higher priorities are lower numeric values. */ |
||||
|
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY _PRIO_APP_HIGH |
||||
|
|
||||
|
|
||||
|
/* Interrupt priorities used by the kernel port layer itself. These are generic |
||||
|
to all Cortex-M ports, and do not rely on any particular library functions. */ |
||||
|
#define configKERNEL_INTERRUPT_PRIORITY configLIBRARY_LOWEST_INTERRUPT_PRIORITY |
||||
|
/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!! |
||||
|
See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */ |
||||
|
#define configMAX_SYSCALL_INTERRUPT_PRIORITY configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY |
||||
|
|
||||
|
/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS |
||||
|
standard names - or at least those used in the unmodified vector table. */ |
||||
|
|
||||
|
#define vPortSVCHandler SVC_Handler |
||||
|
#define xPortPendSVHandler PendSV_Handler |
||||
|
|
||||
|
|
||||
|
/*----------------------------------------------------------- |
||||
|
* Settings that are generated automatically |
||||
|
* basing on the settings above |
||||
|
*/ |
||||
|
#if (configTICK_SOURCE == FREERTOS_USE_SYSTICK) |
||||
|
// do not define configSYSTICK_CLOCK_HZ for SysTick to be configured automatically |
||||
|
// to CPU clock source |
||||
|
#define xPortSysTickHandler SysTick_Handler |
||||
|
#elif (configTICK_SOURCE == FREERTOS_USE_RTC) |
||||
|
#define configSYSTICK_CLOCK_HZ ( 32768UL ) |
||||
|
#define xPortSysTickHandler RTC1_IRQHandler |
||||
|
#else |
||||
|
#error Unsupported configTICK_SOURCE value |
||||
|
#endif |
||||
|
|
||||
|
/* Code below should be only used by the compiler, and not the assembler. */ |
||||
|
#if !(defined(__ASSEMBLY__) || defined(__ASSEMBLER__)) |
||||
|
#include "nrf.h" |
||||
|
#include "nrf_assert.h" |
||||
|
|
||||
|
/* This part of definitions may be problematic in assembly - it uses definitions from files that are not assembly compatible. */ |
||||
|
/* Cortex-M specific definitions. */ |
||||
|
#ifdef __NVIC_PRIO_BITS |
||||
|
/* __BVIC_PRIO_BITS will be specified when CMSIS is being used. */ |
||||
|
#define configPRIO_BITS __NVIC_PRIO_BITS |
||||
|
#else |
||||
|
#error "This port requires __NVIC_PRIO_BITS to be defined" |
||||
|
#endif |
||||
|
|
||||
|
/* Access to current system core clock is required only if we are ticking the system by systimer */ |
||||
|
#if (configTICK_SOURCE == FREERTOS_USE_SYSTICK) |
||||
|
#include <stdint.h> |
||||
|
extern uint32_t SystemCoreClock; |
||||
|
#endif |
||||
|
#endif /* !assembler */ |
||||
|
|
||||
|
/** Implementation note: Use this with caution and set this to 1 ONLY for debugging |
||||
|
* ---------------------------------------------------------- |
||||
|
* Set the value of configUSE_DISABLE_TICK_AUTO_CORRECTION_DEBUG to below for enabling or disabling RTOS tick auto correction: |
||||
|
* 0. This is default. If the RTC tick interrupt is masked for more than 1 tick by higher priority interrupts, then most likely |
||||
|
* one or more RTC ticks are lost. The tick interrupt inside RTOS will detect this and make a correction needed. This is needed |
||||
|
* for the RTOS internal timers to be more accurate. |
||||
|
* 1. The auto correction for RTOS tick is disabled even though few RTC tick interrupts were lost. This feature is desirable when debugging |
||||
|
* the RTOS application and stepping though the code. After stepping when the application is continued in debug mode, the auto-corrections of |
||||
|
* RTOS tick might cause asserts. Setting configUSE_DISABLE_TICK_AUTO_CORRECTION_DEBUG to 1 will make RTC and RTOS go out of sync but could be |
||||
|
* convenient for debugging. |
||||
|
*/ |
||||
|
#define configUSE_DISABLE_TICK_AUTO_CORRECTION_DEBUG 0 |
||||
|
|
||||
|
#endif /* FREERTOS_CONFIG_H */ |
13268
examples/ble_peripheral/ble_app_hrs_freertos_52833/hex/ble_app_hrs_freertos_pca10040_s132.hex
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
13473
examples/ble_peripheral/ble_app_hrs_freertos_52833/hex/ble_app_hrs_freertos_pca10056_s140.hex
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,3 @@ |
|||||
|
The provided HEX files were compiled using the projects located in the folders for the respective boards (pca10xxx). |
||||
|
|
||||
|
For license and copyright information, see the individual .c and .h files that are included in the projects. |
@ -0,0 +1,993 @@ |
|||||
|
/** |
||||
|
* Copyright (c) 2014 - 2021, Nordic Semiconductor ASA |
||||
|
* |
||||
|
* All rights reserved. |
||||
|
* |
||||
|
* Redistribution and use in source and binary forms, with or without modification, |
||||
|
* are permitted provided that the following conditions are met: |
||||
|
* |
||||
|
* 1. Redistributions of source code must retain the above copyright notice, this |
||||
|
* list of conditions and the following disclaimer. |
||||
|
* |
||||
|
* 2. Redistributions in binary form, except as embedded into a Nordic |
||||
|
* Semiconductor ASA integrated circuit in a product or a software update for |
||||
|
* such product, must reproduce the above copyright notice, this list of |
||||
|
* conditions and the following disclaimer in the documentation and/or other |
||||
|
* materials provided with the distribution. |
||||
|
* |
||||
|
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its |
||||
|
* contributors may be used to endorse or promote products derived from this |
||||
|
* software without specific prior written permission. |
||||
|
* |
||||
|
* 4. This software, with or without modification, must only be used with a |
||||
|
* Nordic Semiconductor ASA integrated circuit. |
||||
|
* |
||||
|
* 5. Any software provided in binary form under this license must not be reverse |
||||
|
* engineered, decompiled, modified and/or disassembled. |
||||
|
* |
||||
|
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS |
||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
||||
|
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE |
||||
|
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE |
||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE |
||||
|
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT |
||||
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||
|
* |
||||
|
*/ |
||||
|
// Board/nrf6310/ble/ble_app_hrs_rtx/main.c |
||||
|
/** |
||||
|
* |
||||
|
* @brief Heart Rate Service Sample Application with RTX main file. |
||||
|
* |
||||
|
* This file contains the source code for a sample application using RTX and the |
||||
|
* Heart Rate service (and also Battery and Device Information services). |
||||
|
* This application uses the @ref srvlib_conn_params module. |
||||
|
*/ |
||||
|
|
||||
|
#include <stdint.h> |
||||
|
#include <string.h> |
||||
|
#include "nordic_common.h" |
||||
|
#include "nrf.h" |
||||
|
#include "app_error.h" |
||||
|
#include "ble.h" |
||||
|
#include "ble_hci.h" |
||||
|
#include "ble_srv_common.h" |
||||
|
#include "ble_advdata.h" |
||||
|
#include "ble_advertising.h" |
||||
|
#include "ble_bas.h" |
||||
|
#include "ble_hrs.h" |
||||
|
#include "ble_dis.h" |
||||
|
#include "ble_conn_params.h" |
||||
|
#include "sensorsim.h" |
||||
|
#include "nrf_sdh.h" |
||||
|
#include "nrf_sdh_soc.h" |
||||
|
#include "nrf_sdh_ble.h" |
||||
|
#include "nrf_sdh_freertos.h" |
||||
|
#include "app_timer.h" |
||||
|
#include "peer_manager.h" |
||||
|
#include "peer_manager_handler.h" |
||||
|
#include "bsp_btn_ble.h" |
||||
|
#include "FreeRTOS.h" |
||||
|
#include "task.h" |
||||
|
#include "timers.h" |
||||
|
#include "semphr.h" |
||||
|
#include "fds.h" |
||||
|
#include "ble_conn_state.h" |
||||
|
#include "nrf_drv_clock.h" |
||||
|
#include "nrf_ble_gatt.h" |
||||
|
#include "nrf_ble_qwr.h" |
||||
|
|
||||
|
#include "nrf_log.h" |
||||
|
#include "nrf_log_ctrl.h" |
||||
|
#include "nrf_log_default_backends.h" |
||||
|
|
||||
|
|
||||
|
#define DEVICE_NAME "Nordic_HRM" /**< Name of device. Will be included in the advertising data. */ |
||||
|
#define MANUFACTURER_NAME "NordicSemiconductor" /**< Manufacturer. Will be passed to Device Information Service. */ |
||||
|
|
||||
|
#define APP_BLE_OBSERVER_PRIO 3 /**< Application's BLE observer priority. You shouldn't need to modify this value. */ |
||||
|
#define APP_BLE_CONN_CFG_TAG 1 /**< A tag identifying the SoftDevice BLE configuration. */ |
||||
|
|
||||
|
#define APP_ADV_INTERVAL 300 /**< The advertising interval (in units of 0.625 ms. This value corresponds to 187.5 ms). */ |
||||
|
#define APP_ADV_DURATION 18000 /**< The advertising duration (180 seconds) in units of 10 milliseconds. */ |
||||
|
|
||||
|
#define BATTERY_LEVEL_MEAS_INTERVAL 2000 /**< Battery level measurement interval (ms). */ |
||||
|
#define MIN_BATTERY_LEVEL 81 /**< Minimum simulated battery level. */ |
||||
|
#define MAX_BATTERY_LEVEL 100 /**< Maximum simulated battery level. */ |
||||
|
#define BATTERY_LEVEL_INCREMENT 1 /**< Increment between each simulated battery level measurement. */ |
||||
|
|
||||
|
#define HEART_RATE_MEAS_INTERVAL 1000 /**< Heart rate measurement interval (ms). */ |
||||
|
#define MIN_HEART_RATE 140 /**< Minimum heart rate as returned by the simulated measurement function. */ |
||||
|
#define MAX_HEART_RATE 300 /**< Maximum heart rate as returned by the simulated measurement function. */ |
||||
|
#define HEART_RATE_INCREMENT 10 /**< Value by which the heart rate is incremented/decremented for each call to the simulated measurement function. */ |
||||
|
|
||||
|
#define RR_INTERVAL_INTERVAL 300 /**< RR interval interval (ms). */ |
||||
|
#define MIN_RR_INTERVAL 100 /**< Minimum RR interval as returned by the simulated measurement function. */ |
||||
|
#define MAX_RR_INTERVAL 500 /**< Maximum RR interval as returned by the simulated measurement function. */ |
||||
|
#define RR_INTERVAL_INCREMENT 1 /**< Value by which the RR interval is incremented/decremented for each call to the simulated measurement function. */ |
||||
|
|
||||
|
#define SENSOR_CONTACT_DETECTED_INTERVAL 5000 /**< Sensor Contact Detected toggle interval (ms). */ |
||||
|
|
||||
|
#define MIN_CONN_INTERVAL MSEC_TO_UNITS(400, UNIT_1_25_MS) /**< Minimum acceptable connection interval (0.4 seconds). */ |
||||
|
#define MAX_CONN_INTERVAL MSEC_TO_UNITS(650, UNIT_1_25_MS) /**< Maximum acceptable connection interval (0.65 second). */ |
||||
|
#define SLAVE_LATENCY 0 /**< Slave latency. */ |
||||
|
#define CONN_SUP_TIMEOUT MSEC_TO_UNITS(4000, UNIT_10_MS) /**< Connection supervisory time-out (4 seconds). */ |
||||
|
|
||||
|
#define FIRST_CONN_PARAMS_UPDATE_DELAY 5000 /**< Time from initiating event (connect or start of notification) to first time sd_ble_gap_conn_param_update is called (5 seconds). */ |
||||
|
#define NEXT_CONN_PARAMS_UPDATE_DELAY 30000 /**< Time between each call to sd_ble_gap_conn_param_update after the first call (30 seconds). */ |
||||
|
#define MAX_CONN_PARAMS_UPDATE_COUNT 3 /**< Number of attempts before giving up the connection parameter negotiation. */ |
||||
|
|
||||
|
#define SEC_PARAM_BOND 1 /**< Perform bonding. */ |
||||
|
#define SEC_PARAM_MITM 0 /**< Man In The Middle protection not required. */ |
||||
|
#define SEC_PARAM_LESC 0 /**< LE Secure Connections not enabled. */ |
||||
|
#define SEC_PARAM_KEYPRESS 0 /**< Keypress notifications not enabled. */ |
||||
|
#define SEC_PARAM_IO_CAPABILITIES BLE_GAP_IO_CAPS_NONE /**< No I/O capabilities. */ |
||||
|
#define SEC_PARAM_OOB 0 /**< Out Of Band data not available. */ |
||||
|
#define SEC_PARAM_MIN_KEY_SIZE 7 /**< Minimum encryption key size. */ |
||||
|
#define SEC_PARAM_MAX_KEY_SIZE 16 /**< Maximum encryption key size. */ |
||||
|
|
||||
|
#define DEAD_BEEF 0xDEADBEEF /**< Value used as error code on stack dump, can be used to identify stack location on stack unwind. */ |
||||
|
|
||||
|
#define OSTIMER_WAIT_FOR_QUEUE 2 /**< Number of ticks to wait for the timer queue to be ready */ |
||||
|
|
||||
|
|
||||
|
BLE_BAS_DEF(m_bas); /**< Battery service instance. */ |
||||
|
BLE_HRS_DEF(m_hrs); /**< Heart rate service instance. */ |
||||
|
NRF_BLE_GATT_DEF(m_gatt); /**< GATT module instance. */ |
||||
|
NRF_BLE_QWR_DEF(m_qwr); /**< Context for the Queued Write module.*/ |
||||
|
BLE_ADVERTISING_DEF(m_advertising); /**< Advertising module instance. */ |
||||
|
|
||||
|
static uint16_t m_conn_handle = BLE_CONN_HANDLE_INVALID; /**< Handle of the current connection. */ |
||||
|
static bool m_rr_interval_enabled = true; /**< Flag for enabling and disabling the registration of new RR interval measurements (the purpose of disabling this is just to test sending HRM without RR interval data. */ |
||||
|
|
||||
|
static sensorsim_cfg_t m_battery_sim_cfg; /**< Battery Level sensor simulator configuration. */ |
||||
|
static sensorsim_state_t m_battery_sim_state; /**< Battery Level sensor simulator state. */ |
||||
|
static sensorsim_cfg_t m_heart_rate_sim_cfg; /**< Heart Rate sensor simulator configuration. */ |
||||
|
static sensorsim_state_t m_heart_rate_sim_state; /**< Heart Rate sensor simulator state. */ |
||||
|
static sensorsim_cfg_t m_rr_interval_sim_cfg; /**< RR Interval sensor simulator configuration. */ |
||||
|
static sensorsim_state_t m_rr_interval_sim_state; /**< RR Interval sensor simulator state. */ |
||||
|
|
||||
|
static ble_uuid_t m_adv_uuids[] = /**< Universally unique service identifiers. */ |
||||
|
{ |
||||
|
{BLE_UUID_HEART_RATE_SERVICE, BLE_UUID_TYPE_BLE}, |
||||
|
{BLE_UUID_BATTERY_SERVICE, BLE_UUID_TYPE_BLE}, |
||||
|
{BLE_UUID_DEVICE_INFORMATION_SERVICE, BLE_UUID_TYPE_BLE} |
||||
|
}; |
||||
|
|
||||
|
static TimerHandle_t m_battery_timer; /**< Definition of battery timer. */ |
||||
|
static TimerHandle_t m_heart_rate_timer; /**< Definition of heart rate timer. */ |
||||
|
static TimerHandle_t m_rr_interval_timer; /**< Definition of RR interval timer. */ |
||||
|
static TimerHandle_t m_sensor_contact_timer; /**< Definition of sensor contact detected timer. */ |
||||
|
|
||||
|
#if NRF_LOG_ENABLED |
||||
|
static TaskHandle_t m_logger_thread; /**< Definition of Logger thread. */ |
||||
|
#endif |
||||
|
|
||||
|
static void advertising_start(void * p_erase_bonds); |
||||
|
|
||||
|
|
||||
|
/**@brief Callback function for asserts in the SoftDevice. |
||||
|
* |
||||
|
* @details This function will be called in case of an assert in the SoftDevice. |
||||
|
* |
||||
|
* @warning This handler is an example only and does not fit a final product. You need to analyze |
||||
|
* how your product is supposed to react in case of Assert. |
||||
|
* @warning On assert from the SoftDevice, the system can only recover on reset. |
||||
|
* |
||||
|
* @param[in] line_num Line number of the failing ASSERT call. |
||||
|
* @param[in] file_name File name of the failing ASSERT call. |
||||
|
*/ |
||||
|
void assert_nrf_callback(uint16_t line_num, const uint8_t * p_file_name) |
||||
|
{ |
||||
|
app_error_handler(DEAD_BEEF, line_num, p_file_name); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/**@brief Function for handling Peer Manager events. |
||||
|
* |
||||
|
* @param[in] p_evt Peer Manager event. |
||||
|
*/ |
||||
|
static void pm_evt_handler(pm_evt_t const * p_evt) |
||||
|
{ |
||||
|
bool delete_bonds = false; |
||||
|
|
||||
|
pm_handler_on_pm_evt(p_evt); |
||||
|
pm_handler_disconnect_on_sec_failure(p_evt); |
||||
|
pm_handler_flash_clean(p_evt); |
||||
|
|
||||
|
switch (p_evt->evt_id) |
||||
|
{ |
||||
|
case PM_EVT_PEERS_DELETE_SUCCEEDED: |
||||
|
advertising_start(&delete_bonds); |
||||
|
break; |
||||
|
|
||||
|
default: |
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/**@brief Function for performing battery measurement and updating the Battery Level characteristic |
||||
|
* in Battery Service. |
||||
|
*/ |
||||
|
static void battery_level_update(void) |
||||
|
{ |
||||
|
ret_code_t err_code; |
||||
|
uint8_t battery_level; |
||||
|
|
||||
|
battery_level = (uint8_t)sensorsim_measure(&m_battery_sim_state, &m_battery_sim_cfg); |
||||
|
|
||||
|
err_code = ble_bas_battery_level_update(&m_bas, battery_level, BLE_CONN_HANDLE_ALL); |
||||
|
if ((err_code != NRF_SUCCESS) && |
||||
|
(err_code != NRF_ERROR_INVALID_STATE) && |
||||
|
(err_code != NRF_ERROR_RESOURCES) && |
||||
|
(err_code != NRF_ERROR_BUSY) && |
||||
|
(err_code != BLE_ERROR_GATTS_SYS_ATTR_MISSING) |
||||
|
) |
||||
|
{ |
||||
|
APP_ERROR_HANDLER(err_code); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/**@brief Function for handling the Battery measurement timer time-out. |
||||
|
* |
||||
|
* @details This function will be called each time the battery level measurement timer expires. |
||||
|
* |
||||
|
* @param[in] xTimer Handler to the timer that called this function. |
||||
|
* You may get identifier given to the function xTimerCreate using pvTimerGetTimerID. |
||||
|
*/ |
||||
|
static void battery_level_meas_timeout_handler(TimerHandle_t xTimer) |
||||
|
{ |
||||
|
UNUSED_PARAMETER(xTimer); |
||||
|
battery_level_update(); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/**@brief Function for handling the Heart rate measurement timer time-out. |
||||
|
* |
||||
|
* @details This function will be called each time the heart rate measurement timer expires. |
||||
|
* It will exclude RR Interval data from every third measurement. |
||||
|
* |
||||
|
* @param[in] xTimer Handler to the timer that called this function. |
||||
|
* You may get identifier given to the function xTimerCreate using pvTimerGetTimerID. |
||||
|
*/ |
||||
|
static void heart_rate_meas_timeout_handler(TimerHandle_t xTimer) |
||||
|
{ |
||||
|
static uint32_t cnt = 0; |
||||
|
ret_code_t err_code; |
||||
|
uint16_t heart_rate; |
||||
|
|
||||
|
UNUSED_PARAMETER(xTimer); |
||||
|
|
||||
|
heart_rate = (uint16_t)sensorsim_measure(&m_heart_rate_sim_state, &m_heart_rate_sim_cfg); |
||||
|
|
||||
|
cnt++; |
||||
|
err_code = ble_hrs_heart_rate_measurement_send(&m_hrs, heart_rate); |
||||
|
if ((err_code != NRF_SUCCESS) && |
||||
|
(err_code != NRF_ERROR_INVALID_STATE) && |
||||
|
(err_code != NRF_ERROR_RESOURCES) && |
||||
|
(err_code != NRF_ERROR_BUSY) && |
||||
|
(err_code != BLE_ERROR_GATTS_SYS_ATTR_MISSING) |
||||
|
) |
||||
|
{ |
||||
|
APP_ERROR_HANDLER(err_code); |
||||
|
} |
||||
|
|
||||
|
// Disable RR Interval recording every third heart rate measurement. |
||||
|
// NOTE: An application will normally not do this. It is done here just for testing generation |
||||
|
// of messages without RR Interval measurements. |
||||
|
m_rr_interval_enabled = ((cnt % 3) != 0); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/**@brief Function for handling the RR interval timer time-out. |
||||
|
* |
||||
|
* @details This function will be called each time the RR interval timer expires. |
||||
|
* |
||||
|
* @param[in] xTimer Handler to the timer that called this function. |
||||
|
* You may get identifier given to the function xTimerCreate using pvTimerGetTimerID. |
||||
|
*/ |
||||
|
static void rr_interval_timeout_handler(TimerHandle_t xTimer) |
||||
|
{ |
||||
|
UNUSED_PARAMETER(xTimer); |
||||
|
|
||||
|
if (m_rr_interval_enabled) |
||||
|
{ |
||||
|
uint16_t rr_interval; |
||||
|
|
||||
|
rr_interval = (uint16_t)sensorsim_measure(&m_rr_interval_sim_state, |
||||
|
&m_rr_interval_sim_cfg); |
||||
|
ble_hrs_rr_interval_add(&m_hrs, rr_interval); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/**@brief Function for handling the Sensor Contact Detected timer time-out. |
||||
|
* |
||||
|
* @details This function will be called each time the Sensor Contact Detected timer expires. |
||||
|
* |
||||
|
* @param[in] xTimer Handler to the timer that called this function. |
||||
|
* You may get identifier given to the function xTimerCreate using pvTimerGetTimerID. |
||||
|
*/ |
||||
|
static void sensor_contact_detected_timeout_handler(TimerHandle_t xTimer) |
||||
|
{ |
||||
|
static bool sensor_contact_detected = false; |
||||
|
|
||||
|
UNUSED_PARAMETER(xTimer); |
||||
|
|
||||
|
sensor_contact_detected = !sensor_contact_detected; |
||||
|
ble_hrs_sensor_contact_detected_update(&m_hrs, sensor_contact_detected); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/**@brief Function for the Timer initialization. |
||||
|
* |
||||
|
* @details Initializes the timer module. This creates and starts application timers. |
||||
|
*/ |
||||
|
static void timers_init(void) |
||||
|
{ |
||||
|
// Initialize timer module. |
||||
|
ret_code_t err_code = app_timer_init(); |
||||
|
APP_ERROR_CHECK(err_code); |
||||
|
|
||||
|
// Create timers. |
||||
|
m_battery_timer = xTimerCreate("BATT", |
||||
|
BATTERY_LEVEL_MEAS_INTERVAL, |
||||
|
pdTRUE, |
||||
|
NULL, |
||||
|
battery_level_meas_timeout_handler); |
||||
|
m_heart_rate_timer = xTimerCreate("HRT", |
||||
|
HEART_RATE_MEAS_INTERVAL, |
||||
|
pdTRUE, |
||||
|
NULL, |
||||
|
heart_rate_meas_timeout_handler); |
||||
|
m_rr_interval_timer = xTimerCreate("RRT", |
||||
|
RR_INTERVAL_INTERVAL, |
||||
|
pdTRUE, |
||||
|
NULL, |
||||
|
rr_interval_timeout_handler); |
||||
|
m_sensor_contact_timer = xTimerCreate("SCT", |
||||
|
SENSOR_CONTACT_DETECTED_INTERVAL, |
||||
|
pdTRUE, |
||||
|
NULL, |
||||
|
sensor_contact_detected_timeout_handler); |
||||
|
|
||||
|
/* Error checking */ |
||||
|
if ( (NULL == m_battery_timer) |
||||
|
|| (NULL == m_heart_rate_timer) |
||||
|
|| (NULL == m_rr_interval_timer) |
||||
|
|| (NULL == m_sensor_contact_timer) ) |
||||
|
{ |
||||
|
APP_ERROR_HANDLER(NRF_ERROR_NO_MEM); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/**@brief Function for the GAP initialization. |
||||
|
* |
||||
|
* @details This function sets up all the necessary GAP (Generic Access Profile) parameters of the |
||||
|
* device including the device name, appearance, and the preferred connection parameters. |
||||
|
*/ |
||||
|
static void gap_params_init(void) |
||||
|
{ |
||||
|
ret_code_t err_code; |
||||
|
ble_gap_conn_params_t gap_conn_params; |
||||
|
ble_gap_conn_sec_mode_t sec_mode; |
||||
|
|
||||
|
BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode); |
||||
|
|
||||
|
err_code = sd_ble_gap_device_name_set(&sec_mode, |
||||
|
(const uint8_t *)DEVICE_NAME, |
||||
|
strlen(DEVICE_NAME)); |
||||
|
APP_ERROR_CHECK(err_code); |
||||
|
|
||||
|
err_code = sd_ble_gap_appearance_set(BLE_APPEARANCE_HEART_RATE_SENSOR_HEART_RATE_BELT); |
||||
|
APP_ERROR_CHECK(err_code); |
||||
|
|
||||
|
memset(&gap_conn_params, 0, sizeof(gap_conn_params)); |
||||
|
|
||||
|
gap_conn_params.min_conn_interval = MIN_CONN_INTERVAL; |
||||
|
gap_conn_params.max_conn_interval = MAX_CONN_INTERVAL; |
||||
|
gap_conn_params.slave_latency = SLAVE_LATENCY; |
||||
|
gap_conn_params.conn_sup_timeout = CONN_SUP_TIMEOUT; |
||||
|
|
||||
|
err_code = sd_ble_gap_ppcp_set(&gap_conn_params); |
||||
|
APP_ERROR_CHECK(err_code); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/**@brief Function for initializing the GATT module. */ |
||||
|
static void gatt_init(void) |
||||
|
{ |
||||
|
ret_code_t err_code = nrf_ble_gatt_init(&m_gatt, NULL); |
||||
|
APP_ERROR_CHECK(err_code); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/**@brief Function for handling Queued Write Module errors. |
||||
|
* |
||||
|
* @details A pointer to this function will be passed to each service which may need to inform the |
||||
|
* application about an error. |
||||
|
* |
||||
|
* @param[in] nrf_error Error code containing information about what went wrong. |
||||
|
*/ |
||||
|
static void nrf_qwr_error_handler(uint32_t nrf_error) |
||||
|
{ |
||||
|
APP_ERROR_HANDLER(nrf_error); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/**@brief Function for initializing services that will be used by the application. |
||||
|
* |
||||
|
* @details Initialize the Heart Rate, Battery and Device Information services. |
||||
|
*/ |
||||
|
static void services_init(void) |
||||
|
{ |
||||
|
ret_code_t err_code; |
||||
|
ble_hrs_init_t hrs_init; |
||||
|
ble_bas_init_t bas_init; |
||||
|
ble_dis_init_t dis_init; |
||||
|
nrf_ble_qwr_init_t qwr_init = {0}; |
||||
|
uint8_t body_sensor_location; |
||||
|
|
||||
|
// Initialize Queued Write Module. |
||||
|
qwr_init.error_handler = nrf_qwr_error_handler; |
||||
|
|
||||
|
err_code = nrf_ble_qwr_init(&m_qwr, &qwr_init); |
||||
|
APP_ERROR_CHECK(err_code); |
||||
|
|
||||
|
// Initialize Heart Rate Service. |
||||
|
body_sensor_location = BLE_HRS_BODY_SENSOR_LOCATION_FINGER; |
||||
|
|
||||
|
memset(&hrs_init, 0, sizeof(hrs_init)); |
||||
|
|
||||
|
hrs_init.evt_handler = NULL; |
||||
|
hrs_init.is_sensor_contact_supported = true; |
||||
|
hrs_init.p_body_sensor_location = &body_sensor_location; |
||||
|
|
||||
|
// Here the sec level for the Heart Rate Service can be changed/increased. |
||||
|
hrs_init.hrm_cccd_wr_sec = SEC_OPEN; |
||||
|
hrs_init.bsl_rd_sec = SEC_OPEN; |
||||
|
|
||||
|
err_code = ble_hrs_init(&m_hrs, &hrs_init); |
||||
|
APP_ERROR_CHECK(err_code); |
||||
|
|
||||
|
// Initialize Battery Service. |
||||
|
memset(&bas_init, 0, sizeof(bas_init)); |
||||
|
|
||||
|
// Here the sec level for the Battery Service can be changed/increased. |
||||
|
bas_init.bl_rd_sec = SEC_OPEN; |
||||
|
bas_init.bl_cccd_wr_sec = SEC_OPEN; |
||||
|
bas_init.bl_report_rd_sec = SEC_OPEN; |
||||
|
|
||||
|
bas_init.evt_handler = NULL; |
||||
|
bas_init.support_notification = true; |
||||
|
bas_init.p_report_ref = NULL; |
||||
|
bas_init.initial_batt_level = 100; |
||||
|
|
||||
|
err_code = ble_bas_init(&m_bas, &bas_init); |
||||
|
APP_ERROR_CHECK(err_code); |
||||
|
|
||||
|
// Initialize Device Information Service. |
||||
|
memset(&dis_init, 0, sizeof(dis_init)); |
||||
|
|
||||
|
ble_srv_ascii_to_utf8(&dis_init.manufact_name_str, (char *)MANUFACTURER_NAME); |
||||
|
|
||||
|
dis_init.dis_char_rd_sec = SEC_OPEN; |
||||
|
|
||||
|
err_code = ble_dis_init(&dis_init); |
||||
|
APP_ERROR_CHECK(err_code); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/**@brief Function for initializing the sensor simulators. */ |
||||
|
static void sensor_simulator_init(void) |
||||
|
{ |
||||
|
m_battery_sim_cfg.min = MIN_BATTERY_LEVEL; |
||||
|
m_battery_sim_cfg.max = MAX_BATTERY_LEVEL; |
||||
|
m_battery_sim_cfg.incr = BATTERY_LEVEL_INCREMENT; |
||||
|
m_battery_sim_cfg.start_at_max = true; |
||||
|
|
||||
|
sensorsim_init(&m_battery_sim_state, &m_battery_sim_cfg); |
||||
|
|
||||
|
m_heart_rate_sim_cfg.min = MIN_HEART_RATE; |
||||
|
m_heart_rate_sim_cfg.max = MAX_HEART_RATE; |
||||
|
m_heart_rate_sim_cfg.incr = HEART_RATE_INCREMENT; |
||||
|
m_heart_rate_sim_cfg.start_at_max = false; |
||||
|
|
||||
|
sensorsim_init(&m_heart_rate_sim_state, &m_heart_rate_sim_cfg); |
||||
|
|
||||
|
m_rr_interval_sim_cfg.min = MIN_RR_INTERVAL; |
||||
|
m_rr_interval_sim_cfg.max = MAX_RR_INTERVAL; |
||||
|
m_rr_interval_sim_cfg.incr = RR_INTERVAL_INCREMENT; |
||||
|
m_rr_interval_sim_cfg.start_at_max = false; |
||||
|
|
||||
|
sensorsim_init(&m_rr_interval_sim_state, &m_rr_interval_sim_cfg); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/**@brief Function for starting application timers. |
||||
|
* @details Timers are run after the scheduler has started. |
||||
|
*/ |
||||
|
static void application_timers_start(void) |
||||
|
{ |
||||
|
// Start application timers. |
||||
|
if (pdPASS != xTimerStart(m_battery_timer, OSTIMER_WAIT_FOR_QUEUE)) |
||||
|
{ |
||||
|
APP_ERROR_HANDLER(NRF_ERROR_NO_MEM); |
||||
|
} |
||||
|
if (pdPASS != xTimerStart(m_heart_rate_timer, OSTIMER_WAIT_FOR_QUEUE)) |
||||
|
{ |
||||
|
APP_ERROR_HANDLER(NRF_ERROR_NO_MEM); |
||||
|
} |
||||
|
if (pdPASS != xTimerStart(m_rr_interval_timer, OSTIMER_WAIT_FOR_QUEUE)) |
||||
|
{ |
||||
|
APP_ERROR_HANDLER(NRF_ERROR_NO_MEM); |
||||
|
} |
||||
|
if (pdPASS != xTimerStart(m_sensor_contact_timer, OSTIMER_WAIT_FOR_QUEUE)) |
||||
|
{ |
||||
|
APP_ERROR_HANDLER(NRF_ERROR_NO_MEM); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/**@brief Function for handling the Connection Parameters Module. |
||||
|
* |
||||
|
* @details This function will be called for all events in the Connection Parameters Module which |
||||
|
* are passed to the application. |
||||
|
* @note All this function does is to disconnect. This could have been done by simply |
||||
|
* setting the disconnect_on_fail config parameter, but instead we use the event |
||||
|
* handler mechanism to demonstrate its use. |
||||
|
* |
||||
|
* @param[in] p_evt Event received from the Connection Parameters Module. |
||||
|
*/ |
||||
|
static void on_conn_params_evt(ble_conn_params_evt_t * p_evt) |
||||
|
{ |
||||
|
ret_code_t err_code; |
||||
|
|
||||
|
if (p_evt->evt_type == BLE_CONN_PARAMS_EVT_FAILED) |
||||
|
{ |
||||
|
err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_CONN_INTERVAL_UNACCEPTABLE); |
||||
|
APP_ERROR_CHECK(err_code); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/**@brief Function for handling a Connection Parameters error. |
||||
|
* |
||||
|
* @param[in] nrf_error Error code containing information about what went wrong. |
||||
|
*/ |
||||
|
static void conn_params_error_handler(uint32_t nrf_error) |
||||
|
{ |
||||
|
APP_ERROR_HANDLER(nrf_error); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/**@brief Function for initializing the Connection Parameters module. */ |
||||
|
static void conn_params_init(void) |
||||
|
{ |
||||
|
ret_code_t err_code; |
||||
|
ble_conn_params_init_t cp_init; |
||||
|
|
||||
|
memset(&cp_init, 0, sizeof(cp_init)); |
||||
|
|
||||
|
cp_init.p_conn_params = NULL; |
||||
|
cp_init.first_conn_params_update_delay = FIRST_CONN_PARAMS_UPDATE_DELAY; |
||||
|
cp_init.next_conn_params_update_delay = NEXT_CONN_PARAMS_UPDATE_DELAY; |
||||
|
cp_init.max_conn_params_update_count = MAX_CONN_PARAMS_UPDATE_COUNT; |
||||
|
cp_init.start_on_notify_cccd_handle = m_hrs.hrm_handles.cccd_handle; |
||||
|
cp_init.disconnect_on_fail = false; |
||||
|
cp_init.evt_handler = on_conn_params_evt; |
||||
|
cp_init.error_handler = conn_params_error_handler; |
||||
|
|
||||
|
err_code = ble_conn_params_init(&cp_init); |
||||
|
APP_ERROR_CHECK(err_code); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/**@brief Function for putting the chip into sleep mode. |
||||
|
* |
||||
|
* @note This function will not return. |
||||
|
*/ |
||||
|
static void sleep_mode_enter(void) |
||||
|
{ |
||||
|
ret_code_t err_code; |
||||
|
|
||||
|
err_code = bsp_indication_set(BSP_INDICATE_IDLE); |
||||
|
APP_ERROR_CHECK(err_code); |
||||
|
|
||||
|
// Prepare wakeup buttons. |
||||
|
err_code = bsp_btn_ble_sleep_mode_prepare(); |
||||
|
APP_ERROR_CHECK(err_code); |
||||
|
|
||||
|
// Go to system-off mode (this function will not return; wakeup will cause a reset). |
||||
|
err_code = sd_power_system_off(); |
||||
|
APP_ERROR_CHECK(err_code); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/**@brief Function for handling advertising events. |
||||
|
* |
||||
|
* @details This function will be called for advertising events which are passed to the application. |
||||
|
* |
||||
|
* @param[in] ble_adv_evt Advertising event. |
||||
|
*/ |
||||
|
static void on_adv_evt(ble_adv_evt_t ble_adv_evt) |
||||
|
{ |
||||
|
uint32_t err_code; |
||||
|
|
||||
|
switch (ble_adv_evt) |
||||
|
{ |
||||
|
case BLE_ADV_EVT_FAST: |
||||
|
NRF_LOG_INFO("Fast advertising."); |
||||
|
err_code = bsp_indication_set(BSP_INDICATE_ADVERTISING); |
||||
|
APP_ERROR_CHECK(err_code); |
||||
|
break; |
||||
|
|
||||
|
case BLE_ADV_EVT_IDLE: |
||||
|
sleep_mode_enter(); |
||||
|
break; |
||||
|
|
||||
|
default: |
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/**@brief Function for handling BLE events. |
||||
|
* |
||||
|
* @param[in] p_ble_evt Bluetooth stack event. |
||||
|
* @param[in] p_context Unused. |
||||
|
*/ |
||||
|
static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context) |
||||
|
{ |
||||
|
uint32_t err_code; |
||||
|
|
||||
|
switch (p_ble_evt->header.evt_id) |
||||
|
{ |
||||
|
case BLE_GAP_EVT_CONNECTED: |
||||
|
NRF_LOG_INFO("Connected"); |
||||
|
err_code = bsp_indication_set(BSP_INDICATE_CONNECTED); |
||||
|
APP_ERROR_CHECK(err_code); |
||||
|
m_conn_handle = p_ble_evt->evt.gap_evt.conn_handle; |
||||
|
err_code = nrf_ble_qwr_conn_handle_assign(&m_qwr, m_conn_handle); |
||||
|
APP_ERROR_CHECK(err_code); |
||||
|
break; |
||||
|
|
||||
|
case BLE_GAP_EVT_DISCONNECTED: |
||||
|
NRF_LOG_INFO("Disconnected"); |
||||
|
m_conn_handle = BLE_CONN_HANDLE_INVALID; |
||||
|
break; |
||||
|
|
||||
|
case BLE_GAP_EVT_PHY_UPDATE_REQUEST: |
||||
|
{ |
||||
|
NRF_LOG_DEBUG("PHY update request."); |
||||
|
ble_gap_phys_t const phys = |
||||
|
{ |
||||
|
.rx_phys = BLE_GAP_PHY_AUTO, |
||||
|
.tx_phys = BLE_GAP_PHY_AUTO, |
||||
|
}; |
||||
|
err_code = sd_ble_gap_phy_update(p_ble_evt->evt.gap_evt.conn_handle, &phys); |
||||
|
APP_ERROR_CHECK(err_code); |
||||
|
} break; |
||||
|
|
||||
|
case BLE_GATTC_EVT_TIMEOUT: |
||||
|
// Disconnect on GATT Client timeout event. |
||||
|
NRF_LOG_DEBUG("GATT Client Timeout."); |
||||
|
err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gattc_evt.conn_handle, |
||||
|
BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION); |
||||
|
APP_ERROR_CHECK(err_code); |
||||
|
break; |
||||
|
|
||||
|
case BLE_GATTS_EVT_TIMEOUT: |
||||
|
// Disconnect on GATT Server timeout event. |
||||
|
NRF_LOG_DEBUG("GATT Server Timeout."); |
||||
|
err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gatts_evt.conn_handle, |
||||
|
BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION); |
||||
|
APP_ERROR_CHECK(err_code); |
||||
|
break; |
||||
|
|
||||
|
default: |
||||
|
// No implementation needed. |
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/**@brief Function for initializing the BLE stack. |
||||
|
* |
||||
|
* @details Initializes the SoftDevice and the BLE event interrupt. |
||||
|
*/ |
||||
|
static void ble_stack_init(void) |
||||
|
{ |
||||
|
ret_code_t err_code; |
||||
|
|
||||
|
err_code = nrf_sdh_enable_request(); |
||||
|
APP_ERROR_CHECK(err_code); |
||||
|
|
||||
|
// Configure the BLE stack using the default settings. |
||||
|
// Fetch the start address of the application RAM. |
||||
|
uint32_t ram_start = 0; |
||||
|
err_code = nrf_sdh_ble_default_cfg_set(APP_BLE_CONN_CFG_TAG, &ram_start); |
||||
|
APP_ERROR_CHECK(err_code); |
||||
|
|
||||
|
// Enable BLE stack. |
||||
|
err_code = nrf_sdh_ble_enable(&ram_start); |
||||
|
APP_ERROR_CHECK(err_code); |
||||
|
|
||||
|
// Register a handler for BLE events. |
||||
|
NRF_SDH_BLE_OBSERVER(m_ble_observer, APP_BLE_OBSERVER_PRIO, ble_evt_handler, NULL); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/**@brief Function for handling events from the BSP module. |
||||
|
* |
||||
|
* @param[in] event Event generated by button press. |
||||
|
*/ |
||||
|
static void bsp_event_handler(bsp_event_t event) |
||||
|
{ |
||||
|
ret_code_t err_code; |
||||
|
|
||||
|
switch (event) |
||||
|
{ |
||||
|
case BSP_EVENT_SLEEP: |
||||
|
sleep_mode_enter(); |
||||
|
break; |
||||
|
|
||||
|
case BSP_EVENT_DISCONNECT: |
||||
|
err_code = sd_ble_gap_disconnect(m_conn_handle, |
||||
|
BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION); |
||||
|
if (err_code != NRF_ERROR_INVALID_STATE) |
||||
|
{ |
||||
|
APP_ERROR_CHECK(err_code); |
||||
|
} |
||||
|
break; |
||||
|
|
||||
|
case BSP_EVENT_WHITELIST_OFF: |
||||
|
if (m_conn_handle == BLE_CONN_HANDLE_INVALID) |
||||
|
{ |
||||
|
err_code = ble_advertising_restart_without_whitelist(&m_advertising); |
||||
|
if (err_code != NRF_ERROR_INVALID_STATE) |
||||
|
{ |
||||
|
APP_ERROR_CHECK(err_code); |
||||
|
} |
||||
|
} |
||||
|
break; |
||||
|
|
||||
|
default: |
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/**@brief Function for the Peer Manager initialization. */ |
||||
|
static void peer_manager_init(void) |
||||
|
{ |
||||
|
ble_gap_sec_params_t sec_param; |
||||
|
ret_code_t err_code; |
||||
|
|
||||
|
err_code = pm_init(); |
||||
|
APP_ERROR_CHECK(err_code); |
||||
|
|
||||
|
memset(&sec_param, 0, sizeof(ble_gap_sec_params_t)); |
||||
|
|
||||
|
// Security parameters to be used for all security procedures. |
||||
|
sec_param.bond = SEC_PARAM_BOND; |
||||
|
sec_param.mitm = SEC_PARAM_MITM; |
||||
|
sec_param.lesc = SEC_PARAM_LESC; |
||||
|
sec_param.keypress = SEC_PARAM_KEYPRESS; |
||||
|
sec_param.io_caps = SEC_PARAM_IO_CAPABILITIES; |
||||
|
sec_param.oob = SEC_PARAM_OOB; |
||||
|
sec_param.min_key_size = SEC_PARAM_MIN_KEY_SIZE; |
||||
|
sec_param.max_key_size = SEC_PARAM_MAX_KEY_SIZE; |
||||
|
sec_param.kdist_own.enc = 1; |
||||
|
sec_param.kdist_own.id = 1; |
||||
|
sec_param.kdist_peer.enc = 1; |
||||
|
sec_param.kdist_peer.id = 1; |
||||
|
|
||||
|
err_code = pm_sec_params_set(&sec_param); |
||||
|
APP_ERROR_CHECK(err_code); |
||||
|
|
||||
|
err_code = pm_register(pm_evt_handler); |
||||
|
APP_ERROR_CHECK(err_code); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/**@brief Clear bond information from persistent storage. */ |
||||
|
static void delete_bonds(void) |
||||
|
{ |
||||
|
ret_code_t err_code; |
||||
|
|
||||
|
NRF_LOG_INFO("Erase bonds!"); |
||||
|
|
||||
|
err_code = pm_peers_delete(); |
||||
|
APP_ERROR_CHECK(err_code); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/**@brief Function for initializing the Advertising functionality. */ |
||||
|
static void advertising_init(void) |
||||
|
{ |
||||
|
ret_code_t err_code; |
||||
|
ble_advertising_init_t init; |
||||
|
|
||||
|
memset(&init, 0, sizeof(init)); |
||||
|
|
||||
|
init.advdata.name_type = BLE_ADVDATA_FULL_NAME; |
||||
|
init.advdata.include_appearance = true; |
||||
|
init.advdata.flags = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE; |
||||
|
init.advdata.uuids_complete.uuid_cnt = sizeof(m_adv_uuids) / sizeof(m_adv_uuids[0]); |
||||
|
init.advdata.uuids_complete.p_uuids = m_adv_uuids; |
||||
|
|
||||
|
init.config.ble_adv_fast_enabled = true; |
||||
|
init.config.ble_adv_fast_interval = APP_ADV_INTERVAL; |
||||
|
init.config.ble_adv_fast_timeout = APP_ADV_DURATION; |
||||
|
|
||||
|
init.evt_handler = on_adv_evt; |
||||
|
|
||||
|
err_code = ble_advertising_init(&m_advertising, &init); |
||||
|
APP_ERROR_CHECK(err_code); |
||||
|
|
||||
|
ble_advertising_conn_cfg_tag_set(&m_advertising, APP_BLE_CONN_CFG_TAG); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/**@brief Function for initializing the nrf log module. |
||||
|
*/ |
||||
|
static void log_init(void) |
||||
|
{ |
||||
|
ret_code_t err_code = NRF_LOG_INIT(NULL); |
||||
|
APP_ERROR_CHECK(err_code); |
||||
|
|
||||
|
NRF_LOG_DEFAULT_BACKENDS_INIT(); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/**@brief Function for initializing buttons and leds. |
||||
|
* |
||||
|
* @param[out] p_erase_bonds Will be true if the clear bonding button was pressed to wake the application up. |
||||
|
*/ |
||||
|
static void buttons_leds_init(bool * p_erase_bonds) |
||||
|
{ |
||||
|
ret_code_t err_code; |
||||
|
bsp_event_t startup_event; |
||||
|
|
||||
|
err_code = bsp_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS, bsp_event_handler); |
||||
|
APP_ERROR_CHECK(err_code); |
||||
|
|
||||
|
err_code = bsp_btn_ble_init(NULL, &startup_event); |
||||
|
APP_ERROR_CHECK(err_code); |
||||
|
|
||||
|
*p_erase_bonds = (startup_event == BSP_EVENT_CLEAR_BONDING_DATA); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/**@brief Function for starting advertising. */ |
||||
|
static void advertising_start(void * p_erase_bonds) |
||||
|
{ |
||||
|
bool erase_bonds = *(bool*)p_erase_bonds; |
||||
|
|
||||
|
if (erase_bonds) |
||||
|
{ |
||||
|
delete_bonds(); |
||||
|
// Advertising is started by PM_EVT_PEERS_DELETE_SUCCEEDED event. |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
ret_code_t err_code = ble_advertising_start(&m_advertising, BLE_ADV_MODE_FAST); |
||||
|
APP_ERROR_CHECK(err_code); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
#if NRF_LOG_ENABLED |
||||
|
/**@brief Thread for handling the logger. |
||||
|
* |
||||
|
* @details This thread is responsible for processing log entries if logs are deferred. |
||||
|
* Thread flushes all log entries and suspends. It is resumed by idle task hook. |
||||
|
* |
||||
|
* @param[in] arg Pointer used for passing some arbitrary information (context) from the |
||||
|
* osThreadCreate() call to the thread. |
||||
|
*/ |
||||
|
static void logger_thread(void * arg) |
||||
|
{ |
||||
|
UNUSED_PARAMETER(arg); |
||||
|
|
||||
|
while (1) |
||||
|
{ |
||||
|
NRF_LOG_FLUSH(); |
||||
|
|
||||
|
// vTaskSuspend(NULL); // Suspend myself |
||||
|
} |
||||
|
} |
||||
|
#endif //NRF_LOG_ENABLED |
||||
|
|
||||
|
#if NRF_LOG_ENABLED && NRF_LOG_DEFERRED |
||||
|
void log_pending_hook( void ) |
||||
|
{ |
||||
|
BaseType_t result = pdFAIL; |
||||
|
|
||||
|
if ( __get_IPSR() != 0 ) |
||||
|
{ |
||||
|
BaseType_t higherPriorityTaskWoken = pdFALSE; |
||||
|
result = xTaskNotifyFromISR( m_logger_thread, 0, eSetValueWithoutOverwrite, &higherPriorityTaskWoken ); |
||||
|
|
||||
|
if ( pdFAIL != result ) |
||||
|
{ |
||||
|
portYIELD_FROM_ISR( higherPriorityTaskWoken ); |
||||
|
} |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
UNUSED_RETURN_VALUE(xTaskNotify( m_logger_thread, 0, eSetValueWithoutOverwrite )); |
||||
|
} |
||||
|
} |
||||
|
#endif |
||||
|
|
||||
|
/**@brief Function for initializing the clock. |
||||
|
*/ |
||||
|
static void clock_init(void) |
||||
|
{ |
||||
|
ret_code_t err_code = nrf_drv_clock_init(); |
||||
|
APP_ERROR_CHECK(err_code); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/**@brief Function for application main entry. |
||||
|
*/ |
||||
|
int main(void) |
||||
|
{ |
||||
|
bool erase_bonds; |
||||
|
|
||||
|
// Initialize modules. |
||||
|
log_init(); |
||||
|
clock_init(); |
||||
|
|
||||
|
// Do not start any interrupt that uses system functions before system initialisation. |
||||
|
// The best solution is to start the OS before any other initalisation. |
||||
|
|
||||
|
#if NRF_LOG_ENABLED |
||||
|
// Start execution. |
||||
|
if (pdPASS != xTaskCreate(logger_thread, "LOGGER", 256, NULL, 1, &m_logger_thread)) |
||||
|
{ |
||||
|
APP_ERROR_HANDLER(NRF_ERROR_NO_MEM); |
||||
|
} |
||||
|
#endif |
||||
|
|
||||
|
// Activate deep sleep mode. |
||||
|
SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; |
||||
|
|
||||
|
// Configure and initialize the BLE stack. |
||||
|
ble_stack_init(); |
||||
|
|
||||
|
// Initialize modules. |
||||
|
timers_init(); |
||||
|
buttons_leds_init(&erase_bonds); |
||||
|
gap_params_init(); |
||||
|
gatt_init(); |
||||
|
advertising_init(); |
||||
|
services_init(); |
||||
|
sensor_simulator_init(); |
||||
|
conn_params_init(); |
||||
|
peer_manager_init(); |
||||
|
application_timers_start(); |
||||
|
|
||||
|
// Create a FreeRTOS task for the BLE stack. |
||||
|
// The task will run advertising_start() before entering its loop. |
||||
|
nrf_sdh_freertos_init(advertising_start, &erase_bonds); |
||||
|
|
||||
|
NRF_LOG_INFO("HRS FreeRTOS example started."); |
||||
|
// Start FreeRTOS scheduler. |
||||
|
vTaskStartScheduler(); |
||||
|
|
||||
|
for (;;) |
||||
|
{ |
||||
|
APP_ERROR_HANDLER(NRF_ERROR_FORBIDDEN); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
10320
examples/ble_peripheral/ble_app_hrs_freertos_52833/pca10100/s132/arm5_no_packs/ble_app_hrs_freertos_pca10040_s132.uvprojx
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,344 @@ |
|||||
|
PROJECT_NAME := ble_app_hrs_freertos_pca10040_s132 |
||||
|
TARGETS := nrf52832_xxaa |
||||
|
OUTPUT_DIRECTORY := _build |
||||
|
|
||||
|
SDK_ROOT := ../../../../../.. |
||||
|
PROJ_DIR := ../../.. |
||||
|
|
||||
|
$(OUTPUT_DIRECTORY)/nrf52832_xxaa.out: \ |
||||
|
LINKER_SCRIPT := ble_app_hrs_freertos_gcc_nrf52.ld |
||||
|
|
||||
|
# Source files common to all targets
|
||||
|
SRC_FILES += \
|
||||
|
$(SDK_ROOT)/modules/nrfx/mdk/gcc_startup_nrf52.S \
|
||||
|
$(SDK_ROOT)/components/libraries/log/src/nrf_log_backend_rtt.c \
|
||||
|
$(SDK_ROOT)/components/libraries/log/src/nrf_log_backend_serial.c \
|
||||
|
$(SDK_ROOT)/components/libraries/log/src/nrf_log_backend_uart.c \
|
||||
|
$(SDK_ROOT)/components/libraries/log/src/nrf_log_default_backends.c \
|
||||
|
$(SDK_ROOT)/components/libraries/log/src/nrf_log_frontend.c \
|
||||
|
$(SDK_ROOT)/components/libraries/log/src/nrf_log_str_formatter.c \
|
||||
|
$(SDK_ROOT)/components/libraries/button/app_button.c \
|
||||
|
$(SDK_ROOT)/components/libraries/util/app_error.c \
|
||||
|
$(SDK_ROOT)/components/libraries/util/app_error_handler_gcc.c \
|
||||
|
$(SDK_ROOT)/components/libraries/util/app_error_weak.c \
|
||||
|
$(SDK_ROOT)/components/libraries/timer/app_timer_freertos.c \
|
||||
|
$(SDK_ROOT)/components/libraries/util/app_util_platform.c \
|
||||
|
$(SDK_ROOT)/components/libraries/crc16/crc16.c \
|
||||
|
$(SDK_ROOT)/components/libraries/fds/fds.c \
|
||||
|
$(SDK_ROOT)/components/libraries/hardfault/nrf52/handler/hardfault_handler_gcc.c \
|
||||
|
$(SDK_ROOT)/components/libraries/hardfault/hardfault_implementation.c \
|
||||
|
$(SDK_ROOT)/components/libraries/util/nrf_assert.c \
|
||||
|
$(SDK_ROOT)/components/libraries/atomic_fifo/nrf_atfifo.c \
|
||||
|
$(SDK_ROOT)/components/libraries/atomic_flags/nrf_atflags.c \
|
||||
|
$(SDK_ROOT)/components/libraries/atomic/nrf_atomic.c \
|
||||
|
$(SDK_ROOT)/components/libraries/balloc/nrf_balloc.c \
|
||||
|
$(SDK_ROOT)/external/fprintf/nrf_fprintf.c \
|
||||
|
$(SDK_ROOT)/external/fprintf/nrf_fprintf_format.c \
|
||||
|
$(SDK_ROOT)/components/libraries/fstorage/nrf_fstorage.c \
|
||||
|
$(SDK_ROOT)/components/libraries/fstorage/nrf_fstorage_sd.c \
|
||||
|
$(SDK_ROOT)/components/libraries/memobj/nrf_memobj.c \
|
||||
|
$(SDK_ROOT)/components/libraries/ringbuf/nrf_ringbuf.c \
|
||||
|
$(SDK_ROOT)/components/libraries/experimental_section_vars/nrf_section_iter.c \
|
||||
|
$(SDK_ROOT)/components/libraries/strerror/nrf_strerror.c \
|
||||
|
$(SDK_ROOT)/components/libraries/sensorsim/sensorsim.c \
|
||||
|
$(SDK_ROOT)/modules/nrfx/mdk/system_nrf52.c \
|
||||
|
$(SDK_ROOT)/external/freertos/source/croutine.c \
|
||||
|
$(SDK_ROOT)/external/freertos/source/event_groups.c \
|
||||
|
$(SDK_ROOT)/external/freertos/source/portable/MemMang/heap_1.c \
|
||||
|
$(SDK_ROOT)/external/freertos/source/list.c \
|
||||
|
$(SDK_ROOT)/external/freertos/portable/GCC/nrf52/port.c \
|
||||
|
$(SDK_ROOT)/external/freertos/portable/CMSIS/nrf52/port_cmsis.c \
|
||||
|
$(SDK_ROOT)/external/freertos/portable/CMSIS/nrf52/port_cmsis_systick.c \
|
||||
|
$(SDK_ROOT)/external/freertos/source/queue.c \
|
||||
|
$(SDK_ROOT)/external/freertos/source/stream_buffer.c \
|
||||
|
$(SDK_ROOT)/external/freertos/source/tasks.c \
|
||||
|
$(SDK_ROOT)/external/freertos/source/timers.c \
|
||||
|
$(SDK_ROOT)/components/boards/boards.c \
|
||||
|
$(SDK_ROOT)/integration/nrfx/legacy/nrf_drv_clock.c \
|
||||
|
$(SDK_ROOT)/integration/nrfx/legacy/nrf_drv_uart.c \
|
||||
|
$(SDK_ROOT)/modules/nrfx/soc/nrfx_atomic.c \
|
||||
|
$(SDK_ROOT)/modules/nrfx/drivers/src/nrfx_clock.c \
|
||||
|
$(SDK_ROOT)/modules/nrfx/drivers/src/nrfx_gpiote.c \
|
||||
|
$(SDK_ROOT)/modules/nrfx/drivers/src/prs/nrfx_prs.c \
|
||||
|
$(SDK_ROOT)/modules/nrfx/drivers/src/nrfx_uart.c \
|
||||
|
$(SDK_ROOT)/modules/nrfx/drivers/src/nrfx_uarte.c \
|
||||
|
$(SDK_ROOT)/components/libraries/bsp/bsp.c \
|
||||
|
$(SDK_ROOT)/components/libraries/bsp/bsp_btn_ble.c \
|
||||
|
$(PROJ_DIR)/main.c \
|
||||
|
$(SDK_ROOT)/external/segger_rtt/SEGGER_RTT.c \
|
||||
|
$(SDK_ROOT)/external/segger_rtt/SEGGER_RTT_Syscalls_GCC.c \
|
||||
|
$(SDK_ROOT)/external/segger_rtt/SEGGER_RTT_printf.c \
|
||||
|
$(SDK_ROOT)/components/ble/peer_manager/auth_status_tracker.c \
|
||||
|
$(SDK_ROOT)/components/ble/common/ble_advdata.c \
|
||||
|
$(SDK_ROOT)/components/ble/ble_advertising/ble_advertising.c \
|
||||
|
$(SDK_ROOT)/components/ble/common/ble_conn_params.c \
|
||||
|
$(SDK_ROOT)/components/ble/common/ble_conn_state.c \
|
||||
|
$(SDK_ROOT)/components/ble/common/ble_srv_common.c \
|
||||
|
$(SDK_ROOT)/components/ble/peer_manager/gatt_cache_manager.c \
|
||||
|
$(SDK_ROOT)/components/ble/peer_manager/gatts_cache_manager.c \
|
||||
|
$(SDK_ROOT)/components/ble/peer_manager/id_manager.c \
|
||||
|
$(SDK_ROOT)/components/ble/nrf_ble_gatt/nrf_ble_gatt.c \
|
||||
|
$(SDK_ROOT)/components/ble/nrf_ble_qwr/nrf_ble_qwr.c \
|
||||
|
$(SDK_ROOT)/components/ble/peer_manager/peer_data_storage.c \
|
||||
|
$(SDK_ROOT)/components/ble/peer_manager/peer_database.c \
|
||||
|
$(SDK_ROOT)/components/ble/peer_manager/peer_id.c \
|
||||
|
$(SDK_ROOT)/components/ble/peer_manager/peer_manager.c \
|
||||
|
$(SDK_ROOT)/components/ble/peer_manager/peer_manager_handler.c \
|
||||
|
$(SDK_ROOT)/components/ble/peer_manager/pm_buffer.c \
|
||||
|
$(SDK_ROOT)/components/ble/peer_manager/security_dispatcher.c \
|
||||
|
$(SDK_ROOT)/components/ble/peer_manager/security_manager.c \
|
||||
|
$(SDK_ROOT)/external/utf_converter/utf.c \
|
||||
|
$(SDK_ROOT)/components/ble/ble_services/ble_bas/ble_bas.c \
|
||||
|
$(SDK_ROOT)/components/ble/ble_services/ble_dis/ble_dis.c \
|
||||
|
$(SDK_ROOT)/components/ble/ble_services/ble_hrs/ble_hrs.c \
|
||||
|
$(SDK_ROOT)/components/softdevice/common/nrf_sdh.c \
|
||||
|
$(SDK_ROOT)/components/softdevice/common/nrf_sdh_ble.c \
|
||||
|
$(SDK_ROOT)/components/softdevice/common/nrf_sdh_freertos.c \
|
||||
|
$(SDK_ROOT)/components/softdevice/common/nrf_sdh_soc.c \
|
||||
|
|
||||
|
# Include folders common to all targets
|
||||
|
INC_FOLDERS += \
|
||||
|
$(PROJ_DIR)/config \
|
||||
|
$(SDK_ROOT)/components/nfc/ndef/generic/message \
|
||||
|
$(SDK_ROOT)/components/nfc/t2t_lib \
|
||||
|
$(SDK_ROOT)/components/nfc/t4t_parser/hl_detection_procedure \
|
||||
|
$(SDK_ROOT)/components/ble/ble_services/ble_ancs_c \
|
||||
|
$(SDK_ROOT)/components/nfc/platform \
|
||||
|
$(SDK_ROOT)/components/ble/ble_services/ble_ias_c \
|
||||
|
$(SDK_ROOT)/components/libraries/pwm \
|
||||
|
$(SDK_ROOT)/components/softdevice/s132/headers/nrf52 \
|
||||
|
$(SDK_ROOT)/components/libraries/usbd/class/cdc/acm \
|
||||
|
$(SDK_ROOT)/components/libraries/usbd/class/hid/generic \
|
||||
|
$(SDK_ROOT)/components/libraries/usbd/class/msc \
|
||||
|
$(SDK_ROOT)/components/libraries/usbd/class/hid \
|
||||
|
$(SDK_ROOT)/modules/nrfx/hal \
|
||||
|
$(SDK_ROOT)/components/nfc/ndef/conn_hand_parser/le_oob_rec_parser \
|
||||
|
$(SDK_ROOT)/components/libraries/log \
|
||||
|
$(SDK_ROOT)/components/ble/ble_services/ble_gls \
|
||||
|
$(SDK_ROOT)/components/libraries/fstorage \
|
||||
|
$(SDK_ROOT)/components/nfc/ndef/text \
|
||||
|
$(SDK_ROOT)/components/libraries/mutex \
|
||||
|
$(SDK_ROOT)/components/libraries/gpiote \
|
||||
|
$(SDK_ROOT)/components/libraries/bootloader/ble_dfu \
|
||||
|
$(SDK_ROOT)/components/nfc/ndef/connection_handover/common \
|
||||
|
$(SDK_ROOT)/components/boards \
|
||||
|
$(SDK_ROOT)/components/nfc/ndef/generic/record \
|
||||
|
$(SDK_ROOT)/components/nfc/t4t_parser/cc_file \
|
||||
|
$(SDK_ROOT)/components/ble/ble_advertising \
|
||||
|
$(SDK_ROOT)/external/utf_converter \
|
||||
|
$(SDK_ROOT)/components/ble/ble_services/ble_bas_c \
|
||||
|
$(SDK_ROOT)/modules/nrfx/drivers/include \
|
||||
|
$(SDK_ROOT)/components/libraries/experimental_task_manager \
|
||||
|
$(SDK_ROOT)/components/ble/ble_services/ble_hrs_c \
|
||||
|
$(SDK_ROOT)/components/nfc/ndef/connection_handover/le_oob_rec \
|
||||
|
$(SDK_ROOT)/components/libraries/queue \
|
||||
|
$(SDK_ROOT)/components/libraries/pwr_mgmt \
|
||||
|
$(SDK_ROOT)/external/freertos/portable/GCC/nrf52 \
|
||||
|
$(SDK_ROOT)/components/ble/ble_dtm \
|
||||
|
$(SDK_ROOT)/components/toolchain/cmsis/include \
|
||||
|
$(SDK_ROOT)/components/ble/ble_services/ble_rscs_c \
|
||||
|
$(SDK_ROOT)/components/ble/common \
|
||||
|
$(SDK_ROOT)/components/ble/ble_services/ble_lls \
|
||||
|
$(SDK_ROOT)/components/libraries/hardfault/nrf52 \
|
||||
|
$(SDK_ROOT)/components/libraries/bsp \
|
||||
|
$(SDK_ROOT)/components/nfc/ndef/connection_handover/ac_rec \
|
||||
|
$(SDK_ROOT)/components/ble/ble_services/ble_bas \
|
||||
|
$(SDK_ROOT)/components/libraries/mpu \
|
||||
|
$(SDK_ROOT)/components/libraries/experimental_section_vars \
|
||||
|
$(SDK_ROOT)/components/softdevice/s132/headers \
|
||||
|
$(SDK_ROOT)/components/ble/ble_services/ble_ans_c \
|
||||
|
$(SDK_ROOT)/components/libraries/slip \
|
||||
|
$(SDK_ROOT)/components/libraries/delay \
|
||||
|
$(SDK_ROOT)/components/libraries/csense_drv \
|
||||
|
$(SDK_ROOT)/components/libraries/memobj \
|
||||
|
$(SDK_ROOT)/components/ble/ble_services/ble_nus_c \
|
||||
|
$(SDK_ROOT)/components/softdevice/common \
|
||||
|
$(SDK_ROOT)/components/ble/ble_services/ble_ias \
|
||||
|
$(SDK_ROOT)/components/libraries/usbd/class/hid/mouse \
|
||||
|
$(SDK_ROOT)/components/libraries/low_power_pwm \
|
||||
|
$(SDK_ROOT)/components/nfc/ndef/conn_hand_parser/ble_oob_advdata_parser \
|
||||
|
$(SDK_ROOT)/components/ble/ble_services/ble_dfu \
|
||||
|
$(SDK_ROOT)/external/fprintf \
|
||||
|
$(SDK_ROOT)/components/libraries/svc \
|
||||
|
$(SDK_ROOT)/components/libraries/atomic \
|
||||
|
$(SDK_ROOT)/components \
|
||||
|
$(SDK_ROOT)/components/libraries/scheduler \
|
||||
|
$(SDK_ROOT)/components/libraries/cli \
|
||||
|
$(SDK_ROOT)/components/ble/ble_services/ble_lbs \
|
||||
|
$(SDK_ROOT)/components/ble/ble_services/ble_hts \
|
||||
|
$(SDK_ROOT)/components/libraries/crc16 \
|
||||
|
$(SDK_ROOT)/components/nfc/t4t_parser/apdu \
|
||||
|
$(SDK_ROOT)/external/freertos/config \
|
||||
|
$(SDK_ROOT)/components/libraries/util \
|
||||
|
$(SDK_ROOT)/external/freertos/portable/CMSIS/nrf52 \
|
||||
|
../config \
|
||||
|
$(SDK_ROOT)/components/libraries/usbd/class/cdc \
|
||||
|
$(SDK_ROOT)/components/libraries/csense \
|
||||
|
$(SDK_ROOT)/components/libraries/balloc \
|
||||
|
$(SDK_ROOT)/components/libraries/ecc \
|
||||
|
$(SDK_ROOT)/components/libraries/hardfault \
|
||||
|
$(SDK_ROOT)/components/ble/ble_services/ble_cscs \
|
||||
|
$(SDK_ROOT)/components/libraries/hci \
|
||||
|
$(SDK_ROOT)/components/libraries/usbd/class/hid/kbd \
|
||||
|
$(SDK_ROOT)/components/libraries/timer \
|
||||
|
$(SDK_ROOT)/integration/nrfx \
|
||||
|
$(SDK_ROOT)/components/nfc/t4t_parser/tlv \
|
||||
|
$(SDK_ROOT)/components/libraries/sortlist \
|
||||
|
$(SDK_ROOT)/components/libraries/spi_mngr \
|
||||
|
$(SDK_ROOT)/components/libraries/led_softblink \
|
||||
|
$(SDK_ROOT)/components/nfc/ndef/conn_hand_parser \
|
||||
|
$(SDK_ROOT)/components/libraries/sdcard \
|
||||
|
$(SDK_ROOT)/components/nfc/ndef/parser/record \
|
||||
|
$(SDK_ROOT)/modules/nrfx/mdk \
|
||||
|
$(SDK_ROOT)/components/ble/ble_services/ble_cts_c \
|
||||
|
$(SDK_ROOT)/components/ble/ble_services/ble_nus \
|
||||
|
$(SDK_ROOT)/components/libraries/twi_mngr \
|
||||
|
$(SDK_ROOT)/components/ble/ble_services/ble_hids \
|
||||
|
$(SDK_ROOT)/components/libraries/strerror \
|
||||
|
$(SDK_ROOT)/components/libraries/crc32 \
|
||||
|
$(SDK_ROOT)/components/nfc/ndef/connection_handover/ble_oob_advdata \
|
||||
|
$(SDK_ROOT)/components/nfc/t2t_parser \
|
||||
|
$(SDK_ROOT)/external/freertos/source/include \
|
||||
|
$(SDK_ROOT)/components/nfc/ndef/connection_handover/ble_pair_msg \
|
||||
|
$(SDK_ROOT)/components/libraries/usbd/class/audio \
|
||||
|
$(SDK_ROOT)/components/libraries/sensorsim \
|
||||
|
$(SDK_ROOT)/components/nfc/t4t_lib \
|
||||
|
$(SDK_ROOT)/components/ble/peer_manager \
|
||||
|
$(SDK_ROOT)/components/libraries/mem_manager \
|
||||
|
$(SDK_ROOT)/components/libraries/ringbuf \
|
||||
|
$(SDK_ROOT)/components/ble/ble_services/ble_tps \
|
||||
|
$(SDK_ROOT)/components/nfc/ndef/parser/message \
|
||||
|
$(SDK_ROOT)/components/ble/ble_services/ble_dis \
|
||||
|
$(SDK_ROOT)/components/nfc/ndef/uri \
|
||||
|
$(SDK_ROOT)/components/ble/nrf_ble_gatt \
|
||||
|
$(SDK_ROOT)/components/ble/nrf_ble_qwr \
|
||||
|
$(SDK_ROOT)/components/libraries/gfx \
|
||||
|
$(SDK_ROOT)/components/libraries/button \
|
||||
|
$(SDK_ROOT)/modules/nrfx \
|
||||
|
$(SDK_ROOT)/components/libraries/twi_sensor \
|
||||
|
$(SDK_ROOT)/integration/nrfx/legacy \
|
||||
|
$(SDK_ROOT)/components/libraries/usbd \
|
||||
|
$(SDK_ROOT)/components/nfc/ndef/connection_handover/ep_oob_rec \
|
||||
|
$(SDK_ROOT)/external/segger_rtt \
|
||||
|
$(SDK_ROOT)/components/libraries/atomic_fifo \
|
||||
|
$(SDK_ROOT)/components/ble/ble_services/ble_lbs_c \
|
||||
|
$(SDK_ROOT)/components/nfc/ndef/connection_handover/ble_pair_lib \
|
||||
|
$(SDK_ROOT)/components/libraries/crypto \
|
||||
|
$(SDK_ROOT)/components/ble/ble_racp \
|
||||
|
$(SDK_ROOT)/components/libraries/fds \
|
||||
|
$(SDK_ROOT)/components/nfc/ndef/launchapp \
|
||||
|
$(SDK_ROOT)/components/libraries/atomic_flags \
|
||||
|
$(SDK_ROOT)/components/ble/ble_services/ble_hrs \
|
||||
|
$(SDK_ROOT)/components/ble/ble_services/ble_rscs \
|
||||
|
$(SDK_ROOT)/components/nfc/ndef/connection_handover/hs_rec \
|
||||
|
$(SDK_ROOT)/components/nfc/ndef/conn_hand_parser/ac_rec_parser \
|
||||
|
$(SDK_ROOT)/components/libraries/stack_guard \
|
||||
|
$(SDK_ROOT)/components/libraries/log/src \
|
||||
|
|
||||
|
# Libraries common to all targets
|
||||
|
LIB_FILES += \
|
||||
|
|
||||
|
# Optimization flags
|
||||
|
OPT = -O3 -g3 |
||||
|
# Uncomment the line below to enable link time optimization
|
||||
|
#OPT += -flto
|
||||
|
|
||||
|
# C flags common to all targets
|
||||
|
CFLAGS += $(OPT) |
||||
|
CFLAGS += -DBOARD_PCA10040 |
||||
|
CFLAGS += -DCONFIG_GPIO_AS_PINRESET |
||||
|
CFLAGS += -DFLOAT_ABI_HARD |
||||
|
CFLAGS += -DFREERTOS |
||||
|
CFLAGS += -DNRF52 |
||||
|
CFLAGS += -DNRF52832_XXAA |
||||
|
CFLAGS += -DNRF52_PAN_74 |
||||
|
CFLAGS += -DNRF_SD_BLE_API_VERSION=7 |
||||
|
CFLAGS += -DS132 |
||||
|
CFLAGS += -DSOFTDEVICE_PRESENT |
||||
|
CFLAGS += -mcpu=cortex-m4 |
||||
|
CFLAGS += -mthumb -mabi=aapcs |
||||
|
CFLAGS += -Wall -Werror |
||||
|
CFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16 |
||||
|
# keep every function in a separate section, this allows linker to discard unused ones
|
||||
|
CFLAGS += -ffunction-sections -fdata-sections -fno-strict-aliasing |
||||
|
CFLAGS += -fno-builtin -fshort-enums |
||||
|
|
||||
|
# C++ flags common to all targets
|
||||
|
CXXFLAGS += $(OPT) |
||||
|
# Assembler flags common to all targets
|
||||
|
ASMFLAGS += -g3 |
||||
|
ASMFLAGS += -mcpu=cortex-m4 |
||||
|
ASMFLAGS += -mthumb -mabi=aapcs |
||||
|
ASMFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16 |
||||
|
ASMFLAGS += -DBOARD_PCA10040 |
||||
|
ASMFLAGS += -DCONFIG_GPIO_AS_PINRESET |
||||
|
ASMFLAGS += -DFLOAT_ABI_HARD |
||||
|
ASMFLAGS += -DFREERTOS |
||||
|
ASMFLAGS += -DNRF52 |
||||
|
ASMFLAGS += -DNRF52832_XXAA |
||||
|
ASMFLAGS += -DNRF52_PAN_74 |
||||
|
ASMFLAGS += -DNRF_SD_BLE_API_VERSION=7 |
||||
|
ASMFLAGS += -DS132 |
||||
|
ASMFLAGS += -DSOFTDEVICE_PRESENT |
||||
|
|
||||
|
# Linker flags
|
||||
|
LDFLAGS += $(OPT) |
||||
|
LDFLAGS += -mthumb -mabi=aapcs -L$(SDK_ROOT)/modules/nrfx/mdk -T$(LINKER_SCRIPT) |
||||
|
LDFLAGS += -mcpu=cortex-m4 |
||||
|
LDFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16 |
||||
|
# let linker dump unused sections
|
||||
|
LDFLAGS += -Wl,--gc-sections |
||||
|
# use newlib in nano version
|
||||
|
LDFLAGS += --specs=nano.specs |
||||
|
|
||||
|
nrf52832_xxaa: CFLAGS += -D__HEAP_SIZE=1024 |
||||
|
nrf52832_xxaa: CFLAGS += -D__STACK_SIZE=2048 |
||||
|
nrf52832_xxaa: ASMFLAGS += -D__HEAP_SIZE=1024 |
||||
|
nrf52832_xxaa: ASMFLAGS += -D__STACK_SIZE=2048 |
||||
|
|
||||
|
# Add standard libraries at the very end of the linker input, after all objects
|
||||
|
# that may need symbols provided by these libraries.
|
||||
|
LIB_FILES += -lc -lnosys -lm |
||||
|
|
||||
|
|
||||
|
.PHONY: default help |
||||
|
|
||||
|
# Default target - first one defined
|
||||
|
default: nrf52832_xxaa |
||||
|
|
||||
|
# Print all targets that can be built
|
||||
|
help: |
||||
|
@echo following targets are available: |
||||
|
@echo nrf52832_xxaa |
||||
|
@echo flash_softdevice |
||||
|
@echo sdk_config - starting external tool for editing sdk_config.h |
||||
|
@echo flash - flashing binary |
||||
|
|
||||
|
TEMPLATE_PATH := $(SDK_ROOT)/components/toolchain/gcc |
||||
|
|
||||
|
|
||||
|
include $(TEMPLATE_PATH)/Makefile.common |
||||
|
|
||||
|
$(foreach target, $(TARGETS), $(call define_target, $(target))) |
||||
|
|
||||
|
.PHONY: flash flash_softdevice erase |
||||
|
|
||||
|
# Flash the program
|
||||
|
flash: default |
||||
|
@echo Flashing: $(OUTPUT_DIRECTORY)/nrf52832_xxaa.hex |
||||
|
nrfjprog -f nrf52 --program $(OUTPUT_DIRECTORY)/nrf52832_xxaa.hex --sectorerase |
||||
|
nrfjprog -f nrf52 --reset |
||||
|
|
||||
|
# Flash softdevice
|
||||
|
flash_softdevice: |
||||
|
@echo Flashing: s132_nrf52_7.2.0_softdevice.hex |
||||
|
nrfjprog -f nrf52 --program $(SDK_ROOT)/components/softdevice/s132/hex/s132_nrf52_7.2.0_softdevice.hex --sectorerase |
||||
|
nrfjprog -f nrf52 --reset |
||||
|
|
||||
|
erase: |
||||
|
nrfjprog -f nrf52 --eraseall |
||||
|
|
||||
|
SDK_CONFIG_FILE := ../config/sdk_config.h |
||||
|
CMSIS_CONFIG_TOOL := $(SDK_ROOT)/external_tools/cmsisconfig/CMSIS_Configuration_Wizard.jar |
||||
|
sdk_config: |
||||
|
java -jar $(CMSIS_CONFIG_TOOL) $(SDK_CONFIG_FILE) |
@ -0,0 +1,130 @@ |
|||||
|
/* Linker script to configure memory regions. */ |
||||
|
|
||||
|
SEARCH_DIR(.) |
||||
|
GROUP(-lgcc -lc -lnosys) |
||||
|
|
||||
|
MEMORY |
||||
|
{ |
||||
|
FLASH (rx) : ORIGIN = 0x26000, LENGTH = 0x5a000 |
||||
|
RAM (rwx) : ORIGIN = 0x20005968, LENGTH = 0xa698 |
||||
|
} |
||||
|
|
||||
|
SECTIONS |
||||
|
{ |
||||
|
} |
||||
|
|
||||
|
SECTIONS |
||||
|
{ |
||||
|
. = ALIGN(4); |
||||
|
.mem_section_dummy_ram : |
||||
|
{ |
||||
|
} |
||||
|
.cli_sorted_cmd_ptrs : |
||||
|
{ |
||||
|
PROVIDE(__start_cli_sorted_cmd_ptrs = .); |
||||
|
KEEP(*(.cli_sorted_cmd_ptrs)) |
||||
|
PROVIDE(__stop_cli_sorted_cmd_ptrs = .); |
||||
|
} > RAM |
||||
|
.fs_data : |
||||
|
{ |
||||
|
PROVIDE(__start_fs_data = .); |
||||
|
KEEP(*(.fs_data)) |
||||
|
PROVIDE(__stop_fs_data = .); |
||||
|
} > RAM |
||||
|
.log_dynamic_data : |
||||
|
{ |
||||
|
PROVIDE(__start_log_dynamic_data = .); |
||||
|
KEEP(*(SORT(.log_dynamic_data*))) |
||||
|
PROVIDE(__stop_log_dynamic_data = .); |
||||
|
} > RAM |
||||
|
.log_filter_data : |
||||
|
{ |
||||
|
PROVIDE(__start_log_filter_data = .); |
||||
|
KEEP(*(SORT(.log_filter_data*))) |
||||
|
PROVIDE(__stop_log_filter_data = .); |
||||
|
} > RAM |
||||
|
|
||||
|
} INSERT AFTER .data; |
||||
|
|
||||
|
SECTIONS |
||||
|
{ |
||||
|
.mem_section_dummy_rom : |
||||
|
{ |
||||
|
} |
||||
|
.sdh_soc_observers : |
||||
|
{ |
||||
|
PROVIDE(__start_sdh_soc_observers = .); |
||||
|
KEEP(*(SORT(.sdh_soc_observers*))) |
||||
|
PROVIDE(__stop_sdh_soc_observers = .); |
||||
|
} > FLASH |
||||
|
.sdh_ble_observers : |
||||
|
{ |
||||
|
PROVIDE(__start_sdh_ble_observers = .); |
||||
|
KEEP(*(SORT(.sdh_ble_observers*))) |
||||
|
PROVIDE(__stop_sdh_ble_observers = .); |
||||
|
} > FLASH |
||||
|
.sdh_req_observers : |
||||
|
{ |
||||
|
PROVIDE(__start_sdh_req_observers = .); |
||||
|
KEEP(*(SORT(.sdh_req_observers*))) |
||||
|
PROVIDE(__stop_sdh_req_observers = .); |
||||
|
} > FLASH |
||||
|
.sdh_state_observers : |
||||
|
{ |
||||
|
PROVIDE(__start_sdh_state_observers = .); |
||||
|
KEEP(*(SORT(.sdh_state_observers*))) |
||||
|
PROVIDE(__stop_sdh_state_observers = .); |
||||
|
} > FLASH |
||||
|
.sdh_stack_observers : |
||||
|
{ |
||||
|
PROVIDE(__start_sdh_stack_observers = .); |
||||
|
KEEP(*(SORT(.sdh_stack_observers*))) |
||||
|
PROVIDE(__stop_sdh_stack_observers = .); |
||||
|
} > FLASH |
||||
|
.nrf_queue : |
||||
|
{ |
||||
|
PROVIDE(__start_nrf_queue = .); |
||||
|
KEEP(*(.nrf_queue)) |
||||
|
PROVIDE(__stop_nrf_queue = .); |
||||
|
} > FLASH |
||||
|
.nrf_balloc : |
||||
|
{ |
||||
|
PROVIDE(__start_nrf_balloc = .); |
||||
|
KEEP(*(.nrf_balloc)) |
||||
|
PROVIDE(__stop_nrf_balloc = .); |
||||
|
} > FLASH |
||||
|
.cli_command : |
||||
|
{ |
||||
|
PROVIDE(__start_cli_command = .); |
||||
|
KEEP(*(.cli_command)) |
||||
|
PROVIDE(__stop_cli_command = .); |
||||
|
} > FLASH |
||||
|
.crypto_data : |
||||
|
{ |
||||
|
PROVIDE(__start_crypto_data = .); |
||||
|
KEEP(*(SORT(.crypto_data*))) |
||||
|
PROVIDE(__stop_crypto_data = .); |
||||
|
} > FLASH |
||||
|
.pwr_mgmt_data : |
||||
|
{ |
||||
|
PROVIDE(__start_pwr_mgmt_data = .); |
||||
|
KEEP(*(SORT(.pwr_mgmt_data*))) |
||||
|
PROVIDE(__stop_pwr_mgmt_data = .); |
||||
|
} > FLASH |
||||
|
.log_const_data : |
||||
|
{ |
||||
|
PROVIDE(__start_log_const_data = .); |
||||
|
KEEP(*(SORT(.log_const_data*))) |
||||
|
PROVIDE(__stop_log_const_data = .); |
||||
|
} > FLASH |
||||
|
.log_backends : |
||||
|
{ |
||||
|
PROVIDE(__start_log_backends = .); |
||||
|
KEEP(*(SORT(.log_backends*))) |
||||
|
PROVIDE(__stop_log_backends = .); |
||||
|
} > FLASH |
||||
|
|
||||
|
} INSERT AFTER .text |
||||
|
|
||||
|
|
||||
|
INCLUDE "nrf_common.ld" |
12034
examples/ble_peripheral/ble_app_hrs_freertos_52833/pca10100/s132/config/sdk_config.h
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,37 @@ |
|||||
|
/*###ICF### Section handled by ICF editor, don't touch! ****/ |
||||
|
/*-Editor annotation file-*/ |
||||
|
/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ |
||||
|
/*-Specials-*/ |
||||
|
define symbol __ICFEDIT_intvec_start__ = 0x26000; |
||||
|
/*-Memory Regions-*/ |
||||
|
define symbol __ICFEDIT_region_ROM_start__ = 0x26000; |
||||
|
define symbol __ICFEDIT_region_ROM_end__ = 0x7ffff; |
||||
|
define symbol __ICFEDIT_region_RAM_start__ = 0x20005968; |
||||
|
define symbol __ICFEDIT_region_RAM_end__ = 0x2000ffff; |
||||
|
export symbol __ICFEDIT_region_RAM_start__; |
||||
|
export symbol __ICFEDIT_region_RAM_end__; |
||||
|
/*-Sizes-*/ |
||||
|
define symbol __ICFEDIT_size_cstack__ = 2048; |
||||
|
define symbol __ICFEDIT_size_heap__ = 1024; |
||||
|
/**** End of ICF editor section. ###ICF###*/ |
||||
|
|
||||
|
define memory mem with size = 4G; |
||||
|
define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; |
||||
|
define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; |
||||
|
|
||||
|
|
||||
|
define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; |
||||
|
define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; |
||||
|
define block RO_END with alignment = 8, size = 0 { }; |
||||
|
|
||||
|
initialize by copy { readwrite }; |
||||
|
do not initialize { section .noinit }; |
||||
|
|
||||
|
keep { section .intvec }; |
||||
|
place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; |
||||
|
place in ROM_region { readonly, |
||||
|
block RO_END }; |
||||
|
place in RAM_region { readwrite, |
||||
|
block CSTACK, |
||||
|
block HEAP }; |
||||
|
|
1350
examples/ble_peripheral/ble_app_hrs_freertos_52833/pca10100/s132/iar/ble_app_hrs_freertos_pca10040_s132.ewd
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
1334
examples/ble_peripheral/ble_app_hrs_freertos_52833/pca10100/s132/iar/ble_app_hrs_freertos_pca10040_s132.ewp
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
160
examples/ble_peripheral/ble_app_hrs_freertos_52833/pca10100/s132/ses/ble_app_hrs_freertos_pca10040_s132.emProject
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,7 @@ |
|||||
|
<!DOCTYPE CrossStudio_Session_File> |
||||
|
<session> |
||||
|
<ARMCrossStudioWindow activeProject="ble_app_hrs_freertos_pca10040_s132" buildConfiguration="Release"/> |
||||
|
<Files> |
||||
|
<SessionOpenFile codecName="Default" debugPath="../../../main.c" left="0" name="unnamed" path="../../../main.c" selected="1" top="0" useBinaryEdit="0" useTextEdit="1" x="0" y="0"/> |
||||
|
</Files> |
||||
|
</session> |
@ -0,0 +1,53 @@ |
|||||
|
<!DOCTYPE Linker_Placement_File> |
||||
|
<Root name="Flash Section Placement"> |
||||
|
<MemorySegment name="FLASH1" start="$(FLASH_PH_START)" size="$(FLASH_PH_SIZE)"> |
||||
|
<ProgramSection load="no" name=".reserved_flash" start="$(FLASH_PH_START)" size="$(FLASH_START)-$(FLASH_PH_START)" /> |
||||
|
<ProgramSection alignment="0x100" load="Yes" name=".vectors" start="$(FLASH_START)" /> |
||||
|
<ProgramSection alignment="4" load="Yes" name=".init" /> |
||||
|
<ProgramSection alignment="4" load="Yes" name=".init_rodata" /> |
||||
|
<ProgramSection alignment="4" load="Yes" name=".text" size="0x4" /> |
||||
|
<ProgramSection alignment="4" keep="Yes" load="Yes" name=".sdh_soc_observers" inputsections="*(SORT(.sdh_soc_observers*))" address_symbol="__start_sdh_soc_observers" end_symbol="__stop_sdh_soc_observers" /> |
||||
|
<ProgramSection alignment="4" keep="Yes" load="Yes" name=".sdh_ble_observers" inputsections="*(SORT(.sdh_ble_observers*))" address_symbol="__start_sdh_ble_observers" end_symbol="__stop_sdh_ble_observers" /> |
||||
|
<ProgramSection alignment="4" keep="Yes" load="Yes" name=".sdh_req_observers" inputsections="*(SORT(.sdh_req_observers*))" address_symbol="__start_sdh_req_observers" end_symbol="__stop_sdh_req_observers" /> |
||||
|
<ProgramSection alignment="4" keep="Yes" load="Yes" name=".sdh_state_observers" inputsections="*(SORT(.sdh_state_observers*))" address_symbol="__start_sdh_state_observers" end_symbol="__stop_sdh_state_observers" /> |
||||
|
<ProgramSection alignment="4" keep="Yes" load="Yes" name=".sdh_stack_observers" inputsections="*(SORT(.sdh_stack_observers*))" address_symbol="__start_sdh_stack_observers" end_symbol="__stop_sdh_stack_observers" /> |
||||
|
<ProgramSection alignment="4" keep="Yes" load="Yes" name=".nrf_queue" inputsections="*(.nrf_queue*)" address_symbol="__start_nrf_queue" end_symbol="__stop_nrf_queue" /> |
||||
|
<ProgramSection alignment="4" keep="Yes" load="Yes" name=".nrf_balloc" inputsections="*(.nrf_balloc*)" address_symbol="__start_nrf_balloc" end_symbol="__stop_nrf_balloc" /> |
||||
|
<ProgramSection alignment="4" keep="Yes" load="Yes" name=".cli_command" inputsections="*(.cli_command*)" address_symbol="__start_cli_command" end_symbol="__stop_cli_command" /> |
||||
|
<ProgramSection alignment="4" keep="Yes" load="Yes" name=".crypto_data" inputsections="*(SORT(.crypto_data*))" address_symbol="__start_crypto_data" end_symbol="__stop_crypto_data" /> |
||||
|
<ProgramSection alignment="4" keep="Yes" load="Yes" name=".pwr_mgmt_data" inputsections="*(SORT(.pwr_mgmt_data*))" address_symbol="__start_pwr_mgmt_data" end_symbol="__stop_pwr_mgmt_data" /> |
||||
|
<ProgramSection alignment="4" keep="Yes" load="Yes" name=".log_const_data" inputsections="*(SORT(.log_const_data*))" address_symbol="__start_log_const_data" end_symbol="__stop_log_const_data" /> |
||||
|
<ProgramSection alignment="4" keep="Yes" load="Yes" name=".log_backends" inputsections="*(SORT(.log_backends*))" address_symbol="__start_log_backends" end_symbol="__stop_log_backends" /> |
||||
|
<ProgramSection alignment="4" keep="Yes" load="No" name=".nrf_sections" address_symbol="__start_nrf_sections" /> |
||||
|
<ProgramSection alignment="4" keep="Yes" load="Yes" name=".cli_sorted_cmd_ptrs" inputsections="*(.cli_sorted_cmd_ptrs*)" runin=".cli_sorted_cmd_ptrs_run"/> |
||||
|
<ProgramSection alignment="4" keep="Yes" load="Yes" name=".fs_data" inputsections="*(.fs_data*)" runin=".fs_data_run"/> |
||||
|
<ProgramSection alignment="4" keep="Yes" load="Yes" name=".log_dynamic_data" inputsections="*(SORT(.log_dynamic_data*))" runin=".log_dynamic_data_run"/> |
||||
|
<ProgramSection alignment="4" keep="Yes" load="Yes" name=".log_filter_data" inputsections="*(SORT(.log_filter_data*))" runin=".log_filter_data_run"/> |
||||
|
<ProgramSection alignment="4" load="Yes" name=".dtors" /> |
||||
|
<ProgramSection alignment="4" load="Yes" name=".ctors" /> |
||||
|
<ProgramSection alignment="4" load="Yes" name=".rodata" size="0x4" /> |
||||
|
<ProgramSection alignment="4" load="Yes" name=".ARM.exidx" address_symbol="__exidx_start" end_symbol="__exidx_end" /> |
||||
|
<ProgramSection alignment="4" load="Yes" runin=".fast_run" name=".fast" /> |
||||
|
<ProgramSection alignment="4" load="Yes" runin=".data_run" name=".data" /> |
||||
|
<ProgramSection alignment="4" load="Yes" runin=".tdata_run" name=".tdata" /> |
||||
|
</MemorySegment> |
||||
|
<MemorySegment name="RAM1" start="$(RAM_PH_START)" size="$(RAM_PH_SIZE)"> |
||||
|
<ProgramSection load="no" name=".reserved_ram" start="$(RAM_PH_START)" size="$(RAM_START)-$(RAM_PH_START)" /> |
||||
|
<ProgramSection alignment="0x100" load="No" name=".vectors_ram" start="$(RAM_START)" address_symbol="__app_ram_start__"/> |
||||
|
<ProgramSection alignment="4" keep="Yes" load="No" name=".nrf_sections_run" address_symbol="__start_nrf_sections_run" /> |
||||
|
<ProgramSection alignment="4" keep="Yes" load="No" name=".cli_sorted_cmd_ptrs_run" address_symbol="__start_cli_sorted_cmd_ptrs" end_symbol="__stop_cli_sorted_cmd_ptrs" /> |
||||
|
<ProgramSection alignment="4" keep="Yes" load="No" name=".fs_data_run" address_symbol="__start_fs_data" end_symbol="__stop_fs_data" /> |
||||
|
<ProgramSection alignment="4" keep="Yes" load="No" name=".log_dynamic_data_run" address_symbol="__start_log_dynamic_data" end_symbol="__stop_log_dynamic_data" /> |
||||
|
<ProgramSection alignment="4" keep="Yes" load="No" name=".log_filter_data_run" address_symbol="__start_log_filter_data" end_symbol="__stop_log_filter_data" /> |
||||
|
<ProgramSection alignment="4" keep="Yes" load="No" name=".nrf_sections_run_end" address_symbol="__end_nrf_sections_run" /> |
||||
|
<ProgramSection alignment="4" load="No" name=".fast_run" /> |
||||
|
<ProgramSection alignment="4" load="No" name=".data_run" /> |
||||
|
<ProgramSection alignment="4" load="No" name=".tdata_run" /> |
||||
|
<ProgramSection alignment="4" load="No" name=".bss" /> |
||||
|
<ProgramSection alignment="4" load="No" name=".tbss" /> |
||||
|
<ProgramSection alignment="4" load="No" name=".non_init" /> |
||||
|
<ProgramSection alignment="4" size="__HEAPSIZE__" load="No" name=".heap" /> |
||||
|
<ProgramSection alignment="8" size="__STACKSIZE__" load="No" place_from_segment_end="Yes" name=".stack" address_symbol="__StackLimit" end_symbol="__StackTop"/> |
||||
|
<ProgramSection alignment="8" size="__STACKSIZE_PROCESS__" load="No" name=".stack_process" /> |
||||
|
</MemorySegment> |
||||
|
</Root> |
Write
Preview
Loading…
Cancel
Save
Reference in new issue