simple_timer nrf_sdk playground example.
This uses the app_simple_timer library, which uses the high frequency clock for keeping track of time. In reality, we want to use the low frequency clock with RTC, since it's much more power efficient and we don't need high precision.
This commit is contained in:
parent
7c222f1729
commit
9d352b2181
6 changed files with 3984 additions and 0 deletions
1
code/playground/nrf_sdk/simple-timer/.gitignore
vendored
Normal file
1
code/playground/nrf_sdk/simple-timer/.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
|||
_build
|
||||
169
code/playground/nrf_sdk/simple-timer/Makefile
Normal file
169
code/playground/nrf_sdk/simple-timer/Makefile
Normal file
|
|
@ -0,0 +1,169 @@
|
|||
PROJECT_NAME := simple_timer_pca10056
|
||||
TARGETS := nrf52840_xxaa
|
||||
OUTPUT_DIRECTORY := _build
|
||||
|
||||
#SDK_ROOT := ../../../../../..
|
||||
PROJ_DIR := ./src
|
||||
|
||||
$(OUTPUT_DIRECTORY)/nrf52840_xxaa.out: \
|
||||
LINKER_SCRIPT := simple_timer_gcc_nrf52.ld
|
||||
|
||||
# Source files common to all targets
|
||||
SRC_FILES += \
|
||||
$(SDK_ROOT)/modules/nrfx/mdk/gcc_startup_nrf52840.S \
|
||||
$(SDK_ROOT)/components/libraries/log/src/nrf_log_frontend.c \
|
||||
$(SDK_ROOT)/components/libraries/log/src/nrf_log_str_formatter.c \
|
||||
$(SDK_ROOT)/components/boards/boards.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/scheduler/app_scheduler.c \
|
||||
$(SDK_ROOT)/components/libraries/simple_timer/app_simple_timer.c \
|
||||
$(SDK_ROOT)/components/libraries/timer/app_timer2.c \
|
||||
$(SDK_ROOT)/components/libraries/util/app_util_platform.c \
|
||||
$(SDK_ROOT)/components/libraries/timer/drv_rtc.c \
|
||||
$(SDK_ROOT)/components/libraries/util/nrf_assert.c \
|
||||
$(SDK_ROOT)/components/libraries/atomic_fifo/nrf_atfifo.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/memobj/nrf_memobj.c \
|
||||
$(SDK_ROOT)/components/libraries/ringbuf/nrf_ringbuf.c \
|
||||
$(SDK_ROOT)/components/libraries/sortlist/nrf_sortlist.c \
|
||||
$(SDK_ROOT)/components/libraries/strerror/nrf_strerror.c \
|
||||
$(SDK_ROOT)/components/drivers_nrf/nrf_soc_nosd/nrf_nvic.c \
|
||||
$(SDK_ROOT)/components/drivers_nrf/nrf_soc_nosd/nrf_soc.c \
|
||||
$(SDK_ROOT)/modules/nrfx/soc/nrfx_atomic.c \
|
||||
$(SDK_ROOT)/modules/nrfx/drivers/src/nrfx_gpiote.c \
|
||||
$(SDK_ROOT)/modules/nrfx/drivers/src/nrfx_timer.c \
|
||||
$(SDK_ROOT)/components/libraries/bsp/bsp.c \
|
||||
$(PROJ_DIR)/main.c \
|
||||
$(SDK_ROOT)/modules/nrfx/mdk/system_nrf52840.c \
|
||||
|
||||
# Include folders common to all targets
|
||||
INC_FOLDERS += \
|
||||
$(SDK_ROOT)/components \
|
||||
$(SDK_ROOT)/modules/nrfx/mdk \
|
||||
$(SDK_ROOT)/components/libraries/scheduler \
|
||||
$(SDK_ROOT)/modules/nrfx \
|
||||
$(PROJ_DIR) \
|
||||
$(SDK_ROOT)/components/libraries/timer \
|
||||
$(SDK_ROOT)/components/boards \
|
||||
$(SDK_ROOT)/components/libraries/strerror \
|
||||
$(SDK_ROOT)/components/toolchain/cmsis/include \
|
||||
$(SDK_ROOT)/components/libraries/simple_timer \
|
||||
./config \
|
||||
$(SDK_ROOT)/components/libraries/balloc \
|
||||
$(SDK_ROOT)/components/libraries/ringbuf \
|
||||
$(SDK_ROOT)/modules/nrfx/hal \
|
||||
$(SDK_ROOT)/components/libraries/bsp \
|
||||
$(SDK_ROOT)/components/libraries/log \
|
||||
$(SDK_ROOT)/components/libraries/button \
|
||||
$(SDK_ROOT)/components/libraries/util \
|
||||
$(SDK_ROOT)/components/libraries/experimental_section_vars \
|
||||
$(SDK_ROOT)/integration/nrfx/legacy \
|
||||
$(SDK_ROOT)/components/libraries/delay \
|
||||
$(SDK_ROOT)/integration/nrfx \
|
||||
$(SDK_ROOT)/components/libraries/atomic_fifo \
|
||||
$(SDK_ROOT)/components/drivers_nrf/nrf_soc_nosd \
|
||||
$(SDK_ROOT)/components/libraries/atomic \
|
||||
$(SDK_ROOT)/components/libraries/sortlist \
|
||||
$(SDK_ROOT)/components/libraries/memobj \
|
||||
$(SDK_ROOT)/modules/nrfx/drivers/include \
|
||||
$(SDK_ROOT)/external/fprintf \
|
||||
$(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 += -DAPP_TIMER_V2
|
||||
CFLAGS += -DAPP_TIMER_V2_RTC1_ENABLED
|
||||
CFLAGS += -DBOARD_PCA10056
|
||||
CFLAGS += -DCONFIG_GPIO_AS_PINRESET
|
||||
CFLAGS += -DFLOAT_ABI_HARD
|
||||
CFLAGS += -DNRF52840_XXAA
|
||||
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 += -DAPP_TIMER_V2
|
||||
ASMFLAGS += -DAPP_TIMER_V2_RTC1_ENABLED
|
||||
ASMFLAGS += -DBOARD_PCA10056
|
||||
ASMFLAGS += -DCONFIG_GPIO_AS_PINRESET
|
||||
ASMFLAGS += -DFLOAT_ABI_HARD
|
||||
ASMFLAGS += -DNRF52840_XXAA
|
||||
|
||||
# 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
|
||||
|
||||
nrf52840_xxaa: CFLAGS += -D__HEAP_SIZE=8192
|
||||
nrf52840_xxaa: CFLAGS += -D__STACK_SIZE=8192
|
||||
nrf52840_xxaa: ASMFLAGS += -D__HEAP_SIZE=8192
|
||||
nrf52840_xxaa: ASMFLAGS += -D__STACK_SIZE=8192
|
||||
|
||||
# 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: nrf52840_xxaa
|
||||
|
||||
# Print all targets that can be built
|
||||
help:
|
||||
@echo following targets are available:
|
||||
@echo nrf52840_xxaa
|
||||
@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 erase
|
||||
|
||||
# Flash the program
|
||||
flash: default
|
||||
@echo Flashing: $(OUTPUT_DIRECTORY)/nrf52840_xxaa.hex
|
||||
nrfjprog -f nrf52 --program $(OUTPUT_DIRECTORY)/nrf52840_xxaa.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)
|
||||
3650
code/playground/nrf_sdk/simple-timer/config/sdk_config.h
Normal file
3650
code/playground/nrf_sdk/simple-timer/config/sdk_config.h
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -0,0 +1,64 @@
|
|||
/* Linker script to configure memory regions. */
|
||||
|
||||
SEARCH_DIR(.)
|
||||
GROUP(-lgcc -lc -lnosys)
|
||||
|
||||
MEMORY
|
||||
{
|
||||
FLASH (rx) : ORIGIN = 0x0, LENGTH = 0x100000
|
||||
RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x40000
|
||||
}
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
}
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
. = ALIGN(4);
|
||||
.mem_section_dummy_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 :
|
||||
{
|
||||
}
|
||||
.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
|
||||
.nrf_balloc :
|
||||
{
|
||||
PROVIDE(__start_nrf_balloc = .);
|
||||
KEEP(*(.nrf_balloc))
|
||||
PROVIDE(__stop_nrf_balloc = .);
|
||||
} > FLASH
|
||||
|
||||
} INSERT AFTER .text
|
||||
|
||||
|
||||
INCLUDE "nrf_common.ld"
|
||||
90
code/playground/nrf_sdk/simple-timer/src/main.c
Normal file
90
code/playground/nrf_sdk/simple-timer/src/main.c
Normal file
|
|
@ -0,0 +1,90 @@
|
|||
/**
|
||||
* Copyright (c) 2014 - 2020, 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.
|
||||
*
|
||||
*/
|
||||
/**@file
|
||||
* @defgroup nrf_dev_simple_timer_example_main.c
|
||||
* @{
|
||||
* @ingroup nrf_dev_simple_timer_example
|
||||
* @brief Timer example application main file.
|
||||
*
|
||||
* This file contains the source code for a sample application using timer
|
||||
* library. For a more detailed description of the functionality, see the SDK
|
||||
* documentation.
|
||||
*/
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "app_error.h"
|
||||
#include "app_simple_timer.h"
|
||||
#include "boards.h"
|
||||
#include "nrf_delay.h"
|
||||
|
||||
#define LED_PIN 3
|
||||
|
||||
void timeout_handler(void* p_context) { nrf_gpio_pin_toggle(LED_PIN); }
|
||||
|
||||
/**@brief Function for the Power Management.
|
||||
*/
|
||||
static void power_manage(void) {
|
||||
// Use directly __WFE and __SEV macros since the SoftDevice is not available.
|
||||
|
||||
// Wait for event.
|
||||
__WFE();
|
||||
|
||||
// Clear Event Register.
|
||||
__SEV();
|
||||
__WFE();
|
||||
}
|
||||
|
||||
int main(void) {
|
||||
nrf_gpio_cfg_output(LED_PIN);
|
||||
|
||||
uint32_t err_code = app_simple_timer_init();
|
||||
APP_ERROR_CHECK(err_code);
|
||||
|
||||
err_code = app_simple_timer_start(APP_SIMPLE_TIMER_MODE_REPEATED,
|
||||
timeout_handler, 20000, NULL);
|
||||
APP_ERROR_CHECK(err_code);
|
||||
|
||||
for (;;) {
|
||||
power_manage();
|
||||
}
|
||||
}
|
||||
10
resources.md
10
resources.md
|
|
@ -349,3 +349,13 @@ Changing the following on framework-arduinoadafruitnrf52/variants/feather_nrf528
|
|||
|
||||
# Using the raw nrf5 SDK
|
||||
- SparkFun article on how to setup vscode for development [link](https://learn.sparkfun.com/tutorials/nrf52840-advanced-development-with-the-nrf5-sdk/setting-up-a-vs-code-environment)
|
||||
|
||||
## Dev boards
|
||||
- [PCA10040](https://docs.zephyrproject.org/1.9.0/boards/arm/nrf52_pca10040/doc/nrf52_pca10040.html) uses an nrf52832
|
||||
- [PCA10056](https://docs.zephyrproject.org/1.14.1/boards/arm/nrf52840_pca10056/doc/index.html) uses an nrf52840. This is what I want.
|
||||
|
||||
## Timers, RTC
|
||||
- [devzone thread](https://devzone.nordicsemi.com/f/nordic-q-a/12731/clocks-timers-rtc-why):
|
||||
- Timers use the HFCLK; better resolution, more power usage
|
||||
- RTC uses the low frequency source LFCLK; less accurate, less power usage
|
||||
I want RTC, since I don't need to be super precise and I want to save as much battery as possible.
|
||||
Loading…
Add table
Reference in a new issue