mirror of https://github.com/ARMmbed/mbed-os.git
Linker scripts and startup files for NRF52832
Flash and RAM offsets have been modified to fit new SoftDevicepull/6547/head
parent
fc2760ad04
commit
bff552de6c
|
@ -0,0 +1,23 @@
|
||||||
|
#! armcc -E
|
||||||
|
|
||||||
|
#if !defined(MBED_APP_START)
|
||||||
|
#define MBED_APP_START 0x23000
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(MBED_APP_SIZE)
|
||||||
|
#define MBED_APP_SIZE 0x5D000
|
||||||
|
#endif
|
||||||
|
|
||||||
|
LR_IROM1 MBED_APP_START MBED_APP_SIZE {
|
||||||
|
ER_IROM1 MBED_APP_START MBED_APP_SIZE {
|
||||||
|
*.o (RESET, +First)
|
||||||
|
*(InRoot$$Sections)
|
||||||
|
.ANY (+RO)
|
||||||
|
}
|
||||||
|
RW_IRAM0 0x20003000 UNINIT 0x000000D8 { ;no init section
|
||||||
|
*(*noinit)
|
||||||
|
}
|
||||||
|
RW_IRAM1 0x200030D8 0x0000CF28 {
|
||||||
|
.ANY (+RW +ZI)
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,245 @@
|
||||||
|
;/* Copyright (c) 2012 ARM LIMITED
|
||||||
|
;
|
||||||
|
; All rights reserved.
|
||||||
|
; Redistribution and use in source and binary forms, with or without
|
||||||
|
; modification, are permitted provided that the following conditions are met:
|
||||||
|
; - Redistributions of source code must retain the above copyright
|
||||||
|
; notice, this list of conditions and the following disclaimer.
|
||||||
|
; - Redistributions in binary form 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.
|
||||||
|
; - Neither the name of ARM nor the names of its contributors may be used
|
||||||
|
; to endorse or promote products derived from this software without
|
||||||
|
; specific prior written permission.
|
||||||
|
; *
|
||||||
|
; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
; ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND 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.
|
||||||
|
; ---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
__initial_sp EQU 0x20010000
|
||||||
|
|
||||||
|
PRESERVE8
|
||||||
|
THUMB
|
||||||
|
|
||||||
|
; Vector Table Mapped to Address 0 at Reset
|
||||||
|
|
||||||
|
AREA RESET, DATA, READONLY
|
||||||
|
EXPORT __Vectors
|
||||||
|
EXPORT __Vectors_End
|
||||||
|
EXPORT __Vectors_Size
|
||||||
|
|
||||||
|
__Vectors DCD __initial_sp ; Top of Stack
|
||||||
|
DCD Reset_Handler
|
||||||
|
DCD NMI_Handler
|
||||||
|
DCD HardFault_Handler
|
||||||
|
DCD MemoryManagement_Handler
|
||||||
|
DCD BusFault_Handler
|
||||||
|
DCD UsageFault_Handler
|
||||||
|
DCD 0 ; Reserved
|
||||||
|
DCD 0 ; Reserved
|
||||||
|
DCD 0 ; Reserved
|
||||||
|
DCD 0 ; Reserved
|
||||||
|
DCD SVC_Handler
|
||||||
|
DCD DebugMonitor_Handler
|
||||||
|
DCD 0 ; Reserved
|
||||||
|
DCD PendSV_Handler
|
||||||
|
DCD SysTick_Handler
|
||||||
|
|
||||||
|
; External Interrupts
|
||||||
|
DCD POWER_CLOCK_IRQHandler
|
||||||
|
DCD RADIO_IRQHandler
|
||||||
|
DCD UARTE0_UART0_IRQHandler_v
|
||||||
|
DCD SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQHandler_v
|
||||||
|
DCD SPIM1_SPIS1_TWIM1_TWIS1_SPI1_TWI1_IRQHandler_v
|
||||||
|
DCD NFCT_IRQHandler_v
|
||||||
|
DCD GPIOTE_IRQHandler_v
|
||||||
|
DCD SAADC_IRQHandler_v
|
||||||
|
DCD TIMER0_IRQHandler_v
|
||||||
|
DCD TIMER1_IRQHandler_v
|
||||||
|
DCD TIMER2_IRQHandler_v
|
||||||
|
DCD RTC0_IRQHandler
|
||||||
|
DCD TEMP_IRQHandler_v
|
||||||
|
DCD RNG_IRQHandler
|
||||||
|
DCD ECB_IRQHandler
|
||||||
|
DCD CCM_AAR_IRQHandler
|
||||||
|
DCD WDT_IRQHandler_v
|
||||||
|
DCD RTC1_IRQHandler_v
|
||||||
|
DCD QDEC_IRQHandler_v
|
||||||
|
DCD COMP_LPCOMP_IRQHandler_v
|
||||||
|
DCD SWI0_EGU0_IRQHandler_v
|
||||||
|
DCD SWI1_EGU1_IRQHandler_v
|
||||||
|
DCD SWI2_EGU2_IRQHandler_v
|
||||||
|
DCD SWI3_EGU3_IRQHandler_v
|
||||||
|
DCD SWI4_EGU4_IRQHandler
|
||||||
|
DCD SWI5_EGU5_IRQHandler
|
||||||
|
DCD TIMER3_IRQHandler_v
|
||||||
|
DCD TIMER4_IRQHandler_v
|
||||||
|
DCD PWM0_IRQHandler_v
|
||||||
|
DCD PDM_IRQHandler_v
|
||||||
|
DCD 0 ; Reserved
|
||||||
|
DCD 0 ; Reserved
|
||||||
|
DCD MWU_IRQHandler
|
||||||
|
DCD PWM1_IRQHandler_v
|
||||||
|
DCD PWM2_IRQHandler_v
|
||||||
|
DCD SPIM2_SPIS2_SPI2_IRQHandler_v
|
||||||
|
DCD RTC2_IRQHandler_v
|
||||||
|
DCD I2S_IRQHandler_v
|
||||||
|
DCD FPU_IRQHandler_v
|
||||||
|
|
||||||
|
__Vectors_End
|
||||||
|
|
||||||
|
__Vectors_Size EQU __Vectors_End - __Vectors
|
||||||
|
|
||||||
|
AREA |.text|, CODE, READONLY
|
||||||
|
|
||||||
|
; Reset Handler
|
||||||
|
|
||||||
|
|
||||||
|
Reset_Handler PROC
|
||||||
|
EXPORT Reset_Handler [WEAK]
|
||||||
|
IMPORT SystemInit
|
||||||
|
IMPORT __main
|
||||||
|
IMPORT nrf_reloc_vector_table
|
||||||
|
|
||||||
|
|
||||||
|
LDR R0, =SystemInit
|
||||||
|
BLX R0
|
||||||
|
LDR R0, =nrf_reloc_vector_table
|
||||||
|
BLX R0
|
||||||
|
LDR R0, =__main
|
||||||
|
BX R0
|
||||||
|
ENDP
|
||||||
|
|
||||||
|
; Dummy Exception Handlers (infinite loops which can be modified)
|
||||||
|
|
||||||
|
NMI_Handler PROC
|
||||||
|
EXPORT NMI_Handler [WEAK]
|
||||||
|
B .
|
||||||
|
ENDP
|
||||||
|
HardFault_Handler\
|
||||||
|
PROC
|
||||||
|
EXPORT HardFault_Handler [WEAK]
|
||||||
|
B .
|
||||||
|
ENDP
|
||||||
|
MemoryManagement_Handler\
|
||||||
|
PROC
|
||||||
|
EXPORT MemoryManagement_Handler [WEAK]
|
||||||
|
B .
|
||||||
|
ENDP
|
||||||
|
BusFault_Handler\
|
||||||
|
PROC
|
||||||
|
EXPORT BusFault_Handler [WEAK]
|
||||||
|
B .
|
||||||
|
ENDP
|
||||||
|
UsageFault_Handler\
|
||||||
|
PROC
|
||||||
|
EXPORT UsageFault_Handler [WEAK]
|
||||||
|
B .
|
||||||
|
ENDP
|
||||||
|
SVC_Handler PROC
|
||||||
|
EXPORT SVC_Handler [WEAK]
|
||||||
|
B .
|
||||||
|
ENDP
|
||||||
|
DebugMonitor_Handler\
|
||||||
|
PROC
|
||||||
|
EXPORT DebugMonitor_Handler [WEAK]
|
||||||
|
B .
|
||||||
|
ENDP
|
||||||
|
PendSV_Handler PROC
|
||||||
|
EXPORT PendSV_Handler [WEAK]
|
||||||
|
B .
|
||||||
|
ENDP
|
||||||
|
SysTick_Handler PROC
|
||||||
|
EXPORT SysTick_Handler [WEAK]
|
||||||
|
B .
|
||||||
|
ENDP
|
||||||
|
|
||||||
|
Default_Handler PROC
|
||||||
|
|
||||||
|
EXPORT POWER_CLOCK_IRQHandler [WEAK]
|
||||||
|
EXPORT RADIO_IRQHandler [WEAK]
|
||||||
|
EXPORT UARTE0_UART0_IRQHandler_v [WEAK]
|
||||||
|
EXPORT SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQHandler_v [WEAK]
|
||||||
|
EXPORT SPIM1_SPIS1_TWIM1_TWIS1_SPI1_TWI1_IRQHandler_v [WEAK]
|
||||||
|
EXPORT NFCT_IRQHandler_v [WEAK]
|
||||||
|
EXPORT GPIOTE_IRQHandler_v [WEAK]
|
||||||
|
EXPORT SAADC_IRQHandler_v [WEAK]
|
||||||
|
EXPORT TIMER0_IRQHandler_v [WEAK]
|
||||||
|
EXPORT TIMER1_IRQHandler_v [WEAK]
|
||||||
|
EXPORT TIMER2_IRQHandler_v [WEAK]
|
||||||
|
EXPORT RTC0_IRQHandler [WEAK]
|
||||||
|
EXPORT TEMP_IRQHandler_v [WEAK]
|
||||||
|
EXPORT RNG_IRQHandler [WEAK]
|
||||||
|
EXPORT ECB_IRQHandler [WEAK]
|
||||||
|
EXPORT CCM_AAR_IRQHandler [WEAK]
|
||||||
|
EXPORT WDT_IRQHandler_v [WEAK]
|
||||||
|
EXPORT RTC1_IRQHandler_v [WEAK]
|
||||||
|
EXPORT QDEC_IRQHandler_v [WEAK]
|
||||||
|
EXPORT COMP_LPCOMP_IRQHandler_v [WEAK]
|
||||||
|
EXPORT SWI0_EGU0_IRQHandler_v [WEAK]
|
||||||
|
EXPORT SWI1_EGU1_IRQHandler_v [WEAK]
|
||||||
|
EXPORT SWI2_EGU2_IRQHandler_v [WEAK]
|
||||||
|
EXPORT SWI3_EGU3_IRQHandler_v [WEAK]
|
||||||
|
EXPORT SWI4_EGU4_IRQHandler [WEAK]
|
||||||
|
EXPORT SWI5_EGU5_IRQHandler [WEAK]
|
||||||
|
EXPORT TIMER3_IRQHandler_v [WEAK]
|
||||||
|
EXPORT TIMER4_IRQHandler_v [WEAK]
|
||||||
|
EXPORT PWM0_IRQHandler_v [WEAK]
|
||||||
|
EXPORT PDM_IRQHandler_v [WEAK]
|
||||||
|
EXPORT MWU_IRQHandler [WEAK]
|
||||||
|
EXPORT PWM1_IRQHandler_v [WEAK]
|
||||||
|
EXPORT PWM2_IRQHandler_v [WEAK]
|
||||||
|
EXPORT SPIM2_SPIS2_SPI2_IRQHandler_v [WEAK]
|
||||||
|
EXPORT RTC2_IRQHandler_v [WEAK]
|
||||||
|
EXPORT I2S_IRQHandler_v [WEAK]
|
||||||
|
EXPORT FPU_IRQHandler_v [WEAK]
|
||||||
|
POWER_CLOCK_IRQHandler
|
||||||
|
RADIO_IRQHandler
|
||||||
|
UARTE0_UART0_IRQHandler_v
|
||||||
|
SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQHandler_v
|
||||||
|
SPIM1_SPIS1_TWIM1_TWIS1_SPI1_TWI1_IRQHandler_v
|
||||||
|
NFCT_IRQHandler_v
|
||||||
|
GPIOTE_IRQHandler_v
|
||||||
|
SAADC_IRQHandler_v
|
||||||
|
TIMER0_IRQHandler_v
|
||||||
|
TIMER1_IRQHandler_v
|
||||||
|
TIMER2_IRQHandler_v
|
||||||
|
RTC0_IRQHandler
|
||||||
|
TEMP_IRQHandler_v
|
||||||
|
RNG_IRQHandler
|
||||||
|
ECB_IRQHandler
|
||||||
|
CCM_AAR_IRQHandler
|
||||||
|
WDT_IRQHandler_v
|
||||||
|
RTC1_IRQHandler_v
|
||||||
|
QDEC_IRQHandler_v
|
||||||
|
COMP_LPCOMP_IRQHandler_v
|
||||||
|
SWI0_EGU0_IRQHandler_v
|
||||||
|
SWI1_EGU1_IRQHandler_v
|
||||||
|
SWI2_EGU2_IRQHandler_v
|
||||||
|
SWI3_EGU3_IRQHandler_v
|
||||||
|
SWI4_EGU4_IRQHandler
|
||||||
|
SWI5_EGU5_IRQHandler
|
||||||
|
TIMER3_IRQHandler_v
|
||||||
|
TIMER4_IRQHandler_v
|
||||||
|
PWM0_IRQHandler_v
|
||||||
|
PDM_IRQHandler_v
|
||||||
|
MWU_IRQHandler
|
||||||
|
PWM1_IRQHandler_v
|
||||||
|
PWM2_IRQHandler_v
|
||||||
|
SPIM2_SPIS2_SPI2_IRQHandler_v
|
||||||
|
RTC2_IRQHandler_v
|
||||||
|
I2S_IRQHandler_v
|
||||||
|
FPU_IRQHandler_v
|
||||||
|
B .
|
||||||
|
ENDP
|
||||||
|
ALIGN
|
||||||
|
END
|
|
@ -0,0 +1,190 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2015 ARM Limited
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Linker script to configure memory regions. */
|
||||||
|
|
||||||
|
MEMORY
|
||||||
|
{
|
||||||
|
FLASH (rx) : ORIGIN = 0x23000, LENGTH = 0x5d000
|
||||||
|
RAM (rwx) : ORIGIN = 0x20003000, LENGTH = 0xd000
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
OUTPUT_FORMAT ("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
|
||||||
|
|
||||||
|
/* Linker script to place sections and symbol values. Should be used together
|
||||||
|
* with the other linker script that defines memory regions FLASH and RAM.
|
||||||
|
* It references the following symbols that must be defined in code:
|
||||||
|
* Reset_Handler : Entry of reset handler
|
||||||
|
*
|
||||||
|
* It defines the following symbols that the code can use without definition:
|
||||||
|
* __exidx_start
|
||||||
|
* __exidx_end
|
||||||
|
* __etext
|
||||||
|
* __data_start__
|
||||||
|
* __preinit_array_start
|
||||||
|
* __preinit_array_end
|
||||||
|
* __init_array_start
|
||||||
|
* __init_array_end
|
||||||
|
* __fini_array_start
|
||||||
|
* __fini_array_end
|
||||||
|
* __data_end__
|
||||||
|
* __bss_start__
|
||||||
|
* __bss_end__
|
||||||
|
* __end__
|
||||||
|
* end
|
||||||
|
* __HeapLimit
|
||||||
|
* __StackLimit
|
||||||
|
* __StackTop
|
||||||
|
* __stack
|
||||||
|
*/
|
||||||
|
ENTRY(Reset_Handler)
|
||||||
|
|
||||||
|
|
||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
.text :
|
||||||
|
{
|
||||||
|
KEEP(*(.Vectors))
|
||||||
|
*(.text*)
|
||||||
|
|
||||||
|
KEEP(*(.init))
|
||||||
|
KEEP(*(.fini))
|
||||||
|
|
||||||
|
/* .ctors */
|
||||||
|
*crtbegin.o(.ctors)
|
||||||
|
*crtbegin?.o(.ctors)
|
||||||
|
*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
|
||||||
|
*(SORT(.ctors.*))
|
||||||
|
*(.ctors)
|
||||||
|
|
||||||
|
/* .dtors */
|
||||||
|
*crtbegin.o(.dtors)
|
||||||
|
*crtbegin?.o(.dtors)
|
||||||
|
*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
|
||||||
|
*(SORT(.dtors.*))
|
||||||
|
*(.dtors)
|
||||||
|
|
||||||
|
*(.rodata*)
|
||||||
|
|
||||||
|
KEEP(*(.eh_frame*))
|
||||||
|
} > FLASH
|
||||||
|
|
||||||
|
.ARM.extab :
|
||||||
|
{
|
||||||
|
*(.ARM.extab* .gnu.linkonce.armextab.*)
|
||||||
|
. = ALIGN(4);
|
||||||
|
} > FLASH
|
||||||
|
|
||||||
|
__exidx_start = .;
|
||||||
|
.ARM.exidx :
|
||||||
|
{
|
||||||
|
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
|
||||||
|
. = ALIGN(4);
|
||||||
|
} > FLASH
|
||||||
|
__exidx_end = .;
|
||||||
|
|
||||||
|
__etext = .;
|
||||||
|
|
||||||
|
.data : AT (__etext)
|
||||||
|
{
|
||||||
|
__data_start__ = .;
|
||||||
|
*(vtable)
|
||||||
|
*(.data*)
|
||||||
|
|
||||||
|
. = ALIGN(4);
|
||||||
|
/* preinit data */
|
||||||
|
PROVIDE_HIDDEN (__preinit_array_start = .);
|
||||||
|
KEEP(*(.preinit_array))
|
||||||
|
PROVIDE_HIDDEN (__preinit_array_end = .);
|
||||||
|
|
||||||
|
. = ALIGN(4);
|
||||||
|
/* init data */
|
||||||
|
PROVIDE_HIDDEN (__init_array_start = .);
|
||||||
|
KEEP(*(SORT(.init_array.*)))
|
||||||
|
KEEP(*(.init_array))
|
||||||
|
PROVIDE_HIDDEN (__init_array_end = .);
|
||||||
|
|
||||||
|
|
||||||
|
. = ALIGN(4);
|
||||||
|
/* finit data */
|
||||||
|
PROVIDE_HIDDEN (__fini_array_start = .);
|
||||||
|
KEEP(*(SORT(.fini_array.*)))
|
||||||
|
KEEP(*(.fini_array))
|
||||||
|
PROVIDE_HIDDEN (__fini_array_end = .);
|
||||||
|
|
||||||
|
. = ALIGN(4);
|
||||||
|
PROVIDE(__start_fs_data = .);
|
||||||
|
KEEP(*(.fs_data))
|
||||||
|
PROVIDE(__stop_fs_data = .);
|
||||||
|
|
||||||
|
*(.jcr)
|
||||||
|
. = ALIGN(4);
|
||||||
|
/* All data end */
|
||||||
|
__data_end__ = .;
|
||||||
|
|
||||||
|
} > RAM
|
||||||
|
|
||||||
|
__edata = .;
|
||||||
|
|
||||||
|
.noinit :
|
||||||
|
{
|
||||||
|
PROVIDE(__start_noinit = .);
|
||||||
|
KEEP(*(.noinit))
|
||||||
|
PROVIDE(__stop_noinit = .);
|
||||||
|
} > RAM
|
||||||
|
|
||||||
|
.bss :
|
||||||
|
{
|
||||||
|
. = ALIGN(4);
|
||||||
|
__bss_start__ = .;
|
||||||
|
*(.bss*)
|
||||||
|
*(COMMON)
|
||||||
|
. = ALIGN(4);
|
||||||
|
__bss_end__ = .;
|
||||||
|
} > RAM
|
||||||
|
|
||||||
|
.heap (NOLOAD):
|
||||||
|
{
|
||||||
|
__end__ = .;
|
||||||
|
end = __end__;
|
||||||
|
*(.heap*);
|
||||||
|
|
||||||
|
/* Expand the heap to reach the stack boundary. */
|
||||||
|
ASSERT(. <= (ORIGIN(RAM) + LENGTH(RAM) - 0x800), "heap region overflowed into stack");
|
||||||
|
. += (ORIGIN(RAM) + LENGTH(RAM) - 0x800) - .;
|
||||||
|
} > RAM
|
||||||
|
PROVIDE(__heap_start = ADDR(.heap));
|
||||||
|
PROVIDE(__heap_size = SIZEOF(.heap));
|
||||||
|
PROVIDE(__mbed_sbrk_start = ADDR(.heap));
|
||||||
|
PROVIDE(__mbed_krbs_start = ADDR(.heap) + SIZEOF(.heap));
|
||||||
|
|
||||||
|
/* .stack_dummy section does not contain any symbols. It is only
|
||||||
|
* used for the linker script to calculate the size of stack sections
|
||||||
|
* and assign values to stack symbols later. */
|
||||||
|
.stack (NOLOAD):
|
||||||
|
{
|
||||||
|
__StackLimit = .;
|
||||||
|
*(.stack*)
|
||||||
|
. += (ORIGIN(RAM) + LENGTH(RAM) - .);
|
||||||
|
} > RAM
|
||||||
|
|
||||||
|
/* Set the stack top to the end of RAM and move down the stack limit by
|
||||||
|
* the size of the stack_dummy section. */
|
||||||
|
__StackTop = ORIGIN(RAM) + LENGTH(RAM);
|
||||||
|
__StackLimit = __StackTop - SIZEOF(.stack);
|
||||||
|
PROVIDE(__stack = __StackTop);
|
||||||
|
}
|
|
@ -0,0 +1,270 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2013 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 or object form under this license must not be reverse
|
||||||
|
* engineered, decompiled, modified and/or disassembled.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
NOTE: Template files (including this one) are application specific and therefore
|
||||||
|
expected to be copied into the application project folder prior to its use!
|
||||||
|
*/
|
||||||
|
|
||||||
|
.syntax unified
|
||||||
|
.arch armv7e-m
|
||||||
|
|
||||||
|
.section .Vectors
|
||||||
|
.align 2
|
||||||
|
.globl __Vectors
|
||||||
|
__Vectors:
|
||||||
|
.long __StackTop /* Top of Stack */
|
||||||
|
.long Reset_Handler
|
||||||
|
.long NMI_Handler
|
||||||
|
.long HardFault_Handler
|
||||||
|
.long MemoryManagement_Handler
|
||||||
|
.long BusFault_Handler
|
||||||
|
.long UsageFault_Handler
|
||||||
|
.long 0 /*Reserved */
|
||||||
|
.long 0 /*Reserved */
|
||||||
|
.long 0 /*Reserved */
|
||||||
|
.long 0 /*Reserved */
|
||||||
|
.long SVC_Handler
|
||||||
|
.long 0 /*Reserved */
|
||||||
|
.long 0 /*Reserved */
|
||||||
|
.long PendSV_Handler
|
||||||
|
.long SysTick_Handler
|
||||||
|
|
||||||
|
/* External Interrupts */
|
||||||
|
.long POWER_CLOCK_IRQHandler
|
||||||
|
.long RADIO_IRQHandler
|
||||||
|
.long UARTE0_UART0_IRQHandler_v
|
||||||
|
.long SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQHandler_v
|
||||||
|
.long SPIM1_SPIS1_TWIM1_TWIS1_SPI1_TWI1_IRQHandler_v
|
||||||
|
.long NFCT_IRQHandler_v
|
||||||
|
.long GPIOTE_IRQHandler_v
|
||||||
|
.long SAADC_IRQHandler_v
|
||||||
|
.long TIMER0_IRQHandler_v
|
||||||
|
.long TIMER1_IRQHandler_v
|
||||||
|
.long TIMER2_IRQHandler_v
|
||||||
|
.long RTC0_IRQHandler
|
||||||
|
.long TEMP_IRQHandler_v
|
||||||
|
.long RNG_IRQHandler
|
||||||
|
.long ECB_IRQHandler
|
||||||
|
.long CCM_AAR_IRQHandler
|
||||||
|
.long WDT_IRQHandler_v
|
||||||
|
.long RTC1_IRQHandler_v
|
||||||
|
.long QDEC_IRQHandler_v
|
||||||
|
.long COMP_LPCOMP_IRQHandler_v
|
||||||
|
.long SWI0_EGU0_IRQHandler_v
|
||||||
|
.long SWI1_EGU1_IRQHandler_v
|
||||||
|
.long SWI2_EGU2_IRQHandler_v
|
||||||
|
.long SWI3_EGU3_IRQHandler_v
|
||||||
|
.long SWI4_EGU4_IRQHandler
|
||||||
|
.long SWI5_EGU5_IRQHandler
|
||||||
|
.long TIMER3_IRQHandler_v
|
||||||
|
.long TIMER4_IRQHandler_v
|
||||||
|
.long PWM0_IRQHandler_v
|
||||||
|
.long PDM_IRQHandler_v
|
||||||
|
.long 0 /*Reserved */
|
||||||
|
.long 0 /*Reserved */
|
||||||
|
.long MWU_IRQHandler
|
||||||
|
.long PWM1_IRQHandler_v
|
||||||
|
.long PWM2_IRQHandler_v
|
||||||
|
.long SPIM2_SPIS2_SPI2_IRQHandler_v
|
||||||
|
.long RTC2_IRQHandler_v
|
||||||
|
.long I2S_IRQHandler_v
|
||||||
|
.long FPU_IRQHandler_v
|
||||||
|
|
||||||
|
|
||||||
|
.size __Vectors, . - __Vectors
|
||||||
|
|
||||||
|
/* Reset Handler */
|
||||||
|
|
||||||
|
.text
|
||||||
|
.thumb
|
||||||
|
.thumb_func
|
||||||
|
.align 1
|
||||||
|
.globl Reset_Handler
|
||||||
|
.type Reset_Handler, %function
|
||||||
|
Reset_Handler:
|
||||||
|
.fnstart
|
||||||
|
|
||||||
|
|
||||||
|
/* Loop to copy data from read only memory to RAM. The ranges
|
||||||
|
* of copy from/to are specified by following symbols evaluated in
|
||||||
|
* linker script.
|
||||||
|
* __etext: End of code section, i.e., begin of data sections to copy from.
|
||||||
|
* __data_start__/__data_end__: RAM address range that data should be
|
||||||
|
* copied to. Both must be aligned to 4 bytes boundary. */
|
||||||
|
|
||||||
|
ldr r1, =__etext
|
||||||
|
ldr r2, =__data_start__
|
||||||
|
ldr r3, =__data_end__
|
||||||
|
|
||||||
|
subs r3, r2
|
||||||
|
ble .LC0
|
||||||
|
|
||||||
|
.LC1:
|
||||||
|
subs r3, 4
|
||||||
|
ldr r0, [r1,r3]
|
||||||
|
str r0, [r2,r3]
|
||||||
|
bgt .LC1
|
||||||
|
.LC0:
|
||||||
|
|
||||||
|
LDR R0, =SystemInit
|
||||||
|
BLX R0
|
||||||
|
LDR R0, =nrf_reloc_vector_table
|
||||||
|
BLX R0
|
||||||
|
LDR R0, =_start
|
||||||
|
BX R0
|
||||||
|
|
||||||
|
.pool
|
||||||
|
.cantunwind
|
||||||
|
.fnend
|
||||||
|
.size Reset_Handler,.-Reset_Handler
|
||||||
|
|
||||||
|
.section ".text"
|
||||||
|
|
||||||
|
|
||||||
|
/* Dummy Exception Handlers (infinite loops which can be modified) */
|
||||||
|
|
||||||
|
.weak NMI_Handler
|
||||||
|
.type NMI_Handler, %function
|
||||||
|
NMI_Handler:
|
||||||
|
B .
|
||||||
|
.size NMI_Handler, . - NMI_Handler
|
||||||
|
|
||||||
|
|
||||||
|
.weak HardFault_Handler
|
||||||
|
.type HardFault_Handler, %function
|
||||||
|
HardFault_Handler:
|
||||||
|
B .
|
||||||
|
.size HardFault_Handler, . - HardFault_Handler
|
||||||
|
|
||||||
|
|
||||||
|
.weak MemoryManagement_Handler
|
||||||
|
.type MemoryManagement_Handler, %function
|
||||||
|
MemoryManagement_Handler:
|
||||||
|
B .
|
||||||
|
.size MemoryManagement_Handler, . - MemoryManagement_Handler
|
||||||
|
|
||||||
|
|
||||||
|
.weak BusFault_Handler
|
||||||
|
.type BusFault_Handler, %function
|
||||||
|
BusFault_Handler:
|
||||||
|
B .
|
||||||
|
.size BusFault_Handler, . - BusFault_Handler
|
||||||
|
|
||||||
|
|
||||||
|
.weak UsageFault_Handler
|
||||||
|
.type UsageFault_Handler, %function
|
||||||
|
UsageFault_Handler:
|
||||||
|
B .
|
||||||
|
.size UsageFault_Handler, . - UsageFault_Handler
|
||||||
|
|
||||||
|
|
||||||
|
.weak SVC_Handler
|
||||||
|
.type SVC_Handler, %function
|
||||||
|
SVC_Handler:
|
||||||
|
B .
|
||||||
|
.size SVC_Handler, . - SVC_Handler
|
||||||
|
|
||||||
|
|
||||||
|
.weak PendSV_Handler
|
||||||
|
.type PendSV_Handler, %function
|
||||||
|
PendSV_Handler:
|
||||||
|
B .
|
||||||
|
.size PendSV_Handler, . - PendSV_Handler
|
||||||
|
|
||||||
|
|
||||||
|
.weak SysTick_Handler
|
||||||
|
.type SysTick_Handler, %function
|
||||||
|
SysTick_Handler:
|
||||||
|
B .
|
||||||
|
.size SysTick_Handler, . - SysTick_Handler
|
||||||
|
|
||||||
|
|
||||||
|
/* IRQ Handlers */
|
||||||
|
|
||||||
|
.globl Default_Handler
|
||||||
|
.type Default_Handler, %function
|
||||||
|
Default_Handler:
|
||||||
|
B .
|
||||||
|
.size Default_Handler, . - Default_Handler
|
||||||
|
|
||||||
|
.macro IRQ handler
|
||||||
|
.weak \handler
|
||||||
|
.set \handler, Default_Handler
|
||||||
|
.endm
|
||||||
|
|
||||||
|
IRQ POWER_CLOCK_IRQHandler /* restricted */
|
||||||
|
IRQ RADIO_IRQHandler /* blocked */
|
||||||
|
IRQ UARTE0_UART0_IRQHandler_v
|
||||||
|
IRQ SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQHandler_v
|
||||||
|
IRQ SPIM1_SPIS1_TWIM1_TWIS1_SPI1_TWI1_IRQHandler_v
|
||||||
|
IRQ NFCT_IRQHandler_v
|
||||||
|
IRQ GPIOTE_IRQHandler_v
|
||||||
|
IRQ SAADC_IRQHandler_v
|
||||||
|
IRQ TIMER0_IRQHandler_v
|
||||||
|
IRQ TIMER1_IRQHandler_v
|
||||||
|
IRQ TIMER2_IRQHandler_v
|
||||||
|
IRQ RTC0_IRQHandler /* blocked */
|
||||||
|
IRQ TEMP_IRQHandler_v
|
||||||
|
IRQ RNG_IRQHandler /* restricted */
|
||||||
|
IRQ ECB_IRQHandler /* restricted */
|
||||||
|
IRQ CCM_AAR_IRQHandler /* blocked */
|
||||||
|
IRQ WDT_IRQHandler_v
|
||||||
|
IRQ RTC1_IRQHandler_v
|
||||||
|
IRQ QDEC_IRQHandler_v
|
||||||
|
IRQ COMP_LPCOMP_IRQHandler_v
|
||||||
|
IRQ SWI0_EGU0_IRQHandler_v
|
||||||
|
IRQ SWI1_EGU1_IRQHandler_v /* restricted for Radio Notification */
|
||||||
|
IRQ SWI2_EGU2_IRQHandler_v /* blocked for SoftDevice Event */
|
||||||
|
IRQ SWI3_EGU3_IRQHandler_v
|
||||||
|
IRQ SWI4_EGU4_IRQHandler /* blocked */
|
||||||
|
IRQ SWI5_EGU5_IRQHandler /* blocked */
|
||||||
|
IRQ TIMER3_IRQHandler_v
|
||||||
|
IRQ TIMER4_IRQHandler_v
|
||||||
|
IRQ PWM0_IRQHandler_v
|
||||||
|
IRQ PDM_IRQHandler_v
|
||||||
|
IRQ MWU_IRQHandler /* restricted */
|
||||||
|
IRQ PWM1_IRQHandler_v
|
||||||
|
IRQ PWM2_IRQHandler_v
|
||||||
|
IRQ SPIM2_SPIS2_SPI2_IRQHandler_v
|
||||||
|
IRQ RTC2_IRQHandler_v
|
||||||
|
IRQ I2S_IRQHandler_v
|
||||||
|
IRQ FPU_IRQHandler_v
|
||||||
|
|
||||||
|
.end
|
|
@ -0,0 +1,57 @@
|
||||||
|
/*###ICF### Section handled by ICF editor, don't touch! ****/
|
||||||
|
/*-Editor annotation file-*/
|
||||||
|
/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
|
||||||
|
|
||||||
|
if (!isdefinedsymbol(MBED_APP_START)) {
|
||||||
|
define symbol MBED_APP_START = 0x23000;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isdefinedsymbol(MBED_APP_SIZE)) {
|
||||||
|
define symbol MBED_APP_SIZE = 0x5d000;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-Specials-*/
|
||||||
|
define symbol __ICFEDIT_intvec_start__ = MBED_APP_START;
|
||||||
|
|
||||||
|
/*-Memory Regions-*/
|
||||||
|
define symbol __ICFEDIT_region_ROM_start__ = MBED_APP_START;
|
||||||
|
define symbol __ICFEDIT_region_ROM_end__ = MBED_APP_START + MBED_APP_SIZE - 1;
|
||||||
|
define symbol __ICFEDIT_region_RAM_start__ = 0x20003000;
|
||||||
|
define symbol __ICFEDIT_region_RAM_end__ = 0x2000ffff;
|
||||||
|
export symbol __ICFEDIT_region_RAM_start__;
|
||||||
|
export symbol __ICFEDIT_region_RAM_end__;
|
||||||
|
|
||||||
|
/*-Sizes-*/
|
||||||
|
/*Heap 1/4 of ram and stack 1/8*/
|
||||||
|
define symbol __ICFEDIT_size_cstack__ = 0x800;
|
||||||
|
define symbol __ICFEDIT_size_heap__ = 0x1800;
|
||||||
|
/**** End of ICF editor section. ###ICF###*/
|
||||||
|
|
||||||
|
define symbol __code_start_soft_device__ = 0x0;
|
||||||
|
|
||||||
|
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__ { };
|
||||||
|
|
||||||
|
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 };
|
||||||
|
place in RAM_region { readwrite,
|
||||||
|
block HEAP,
|
||||||
|
block CSTACK };
|
||||||
|
|
||||||
|
/*This is used for mbed applications build inside the Embedded workbench
|
||||||
|
Applications build with the python scritps use a hex merge so need to merge it
|
||||||
|
inside the linker. The linker can only use binary files so the hex merge is not possible
|
||||||
|
through the linker. That is why a binary is used instead of a hex image for the embedded project.
|
||||||
|
*/
|
||||||
|
if(isdefinedsymbol(SOFT_DEVICE_BIN))
|
||||||
|
{
|
||||||
|
place at address mem:__code_start_soft_device__ { section .noinit_softdevice };
|
||||||
|
}
|
|
@ -0,0 +1,381 @@
|
||||||
|
;/* Copyright (c) 2012 ARM LIMITED
|
||||||
|
;
|
||||||
|
; All rights reserved.
|
||||||
|
; Redistribution and use in source and binary forms, with or without
|
||||||
|
; modification, are permitted provided that the following conditions are met:
|
||||||
|
; - Redistributions of source code must retain the above copyright
|
||||||
|
; notice, this list of conditions and the following disclaimer.
|
||||||
|
; - Redistributions in binary form 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.
|
||||||
|
; - Neither the name of ARM nor the names of its contributors may be used
|
||||||
|
; to endorse or promote products derived from this software without
|
||||||
|
; specific prior written permission.
|
||||||
|
; *
|
||||||
|
; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
; ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND 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.
|
||||||
|
; ---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
||||||
|
; The modules in this file are included in the libraries, and may be replaced
|
||||||
|
; by any user-defined modules that define the PUBLIC symbol _program_start or
|
||||||
|
; a user defined start symbol.
|
||||||
|
; To override the cstartup defined in the library, simply add your modified
|
||||||
|
; version to the workbench project.
|
||||||
|
;
|
||||||
|
; The vector table is normally located at address 0.
|
||||||
|
; When debugging in RAM, it can be located in RAM, aligned to at least 2^6.
|
||||||
|
; The name "__vector_table" has special meaning for C-SPY:
|
||||||
|
; it is where the SP start value is found, and the NVIC vector
|
||||||
|
; table register (VTOR) is initialized to this address if != 0.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
MODULE ?cstartup
|
||||||
|
|
||||||
|
;; Stack size default : Defined in *.icf (linker file). Can be modified inside EW.
|
||||||
|
;; Heap size default : Defined in *.icf (linker file). Can be modified inside EW.
|
||||||
|
|
||||||
|
;; Forward declaration of sections.
|
||||||
|
SECTION CSTACK:DATA:NOROOT(3)
|
||||||
|
|
||||||
|
SECTION .intvec:CODE:NOROOT(2)
|
||||||
|
|
||||||
|
EXTERN __iar_program_start
|
||||||
|
EXTERN SystemInit
|
||||||
|
EXTERN nrf_reloc_vector_table
|
||||||
|
PUBLIC __vector_table
|
||||||
|
PUBLIC __Vectors
|
||||||
|
PUBLIC __Vectors_End
|
||||||
|
PUBLIC __Vectors_Size
|
||||||
|
|
||||||
|
DATA
|
||||||
|
|
||||||
|
__vector_table
|
||||||
|
DCD sfe(CSTACK)
|
||||||
|
DCD Reset_Handler
|
||||||
|
DCD NMI_Handler
|
||||||
|
DCD HardFault_Handler
|
||||||
|
DCD MemoryManagement_Handler
|
||||||
|
DCD BusFault_Handler
|
||||||
|
DCD UsageFault_Handler
|
||||||
|
DCD 0 ; Reserved
|
||||||
|
DCD 0 ; Reserved
|
||||||
|
DCD 0 ; Reserved
|
||||||
|
DCD 0 ; Reserved
|
||||||
|
DCD SVC_Handler
|
||||||
|
DCD DebugMonitor_Handler
|
||||||
|
DCD 0 ; Reserved
|
||||||
|
DCD PendSV_Handler
|
||||||
|
DCD SysTick_Handler
|
||||||
|
|
||||||
|
; External Interrupts
|
||||||
|
DCD POWER_CLOCK_IRQHandler
|
||||||
|
DCD RADIO_IRQHandler
|
||||||
|
DCD UARTE0_UART0_IRQHandler_v
|
||||||
|
DCD SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQHandler_v
|
||||||
|
DCD SPIM1_SPIS1_TWIM1_TWIS1_SPI1_TWI1_IRQHandler_v
|
||||||
|
DCD NFCT_IRQHandler_v
|
||||||
|
DCD GPIOTE_IRQHandler_v
|
||||||
|
DCD SAADC_IRQHandler_v
|
||||||
|
DCD TIMER0_IRQHandler_v
|
||||||
|
DCD TIMER1_IRQHandler_v
|
||||||
|
DCD TIMER2_IRQHandler_v
|
||||||
|
DCD RTC0_IRQHandler
|
||||||
|
DCD TEMP_IRQHandler_v
|
||||||
|
DCD RNG_IRQHandler
|
||||||
|
DCD ECB_IRQHandler
|
||||||
|
DCD CCM_AAR_IRQHandler
|
||||||
|
DCD WDT_IRQHandler_v
|
||||||
|
DCD RTC1_IRQHandler_v
|
||||||
|
DCD QDEC_IRQHandler_v
|
||||||
|
DCD COMP_LPCOMP_IRQHandler_v
|
||||||
|
DCD SWI0_EGU0_IRQHandler_v
|
||||||
|
DCD SWI1_EGU1_IRQHandler_v
|
||||||
|
DCD SWI2_EGU2_IRQHandler_v
|
||||||
|
DCD SWI3_EGU3_IRQHandler_v
|
||||||
|
DCD SWI4_EGU4_IRQHandler
|
||||||
|
DCD SWI5_EGU5_IRQHandler
|
||||||
|
DCD TIMER3_IRQHandler_v
|
||||||
|
DCD TIMER4_IRQHandler_v
|
||||||
|
DCD PWM0_IRQHandler_v
|
||||||
|
DCD PDM_IRQHandler_v
|
||||||
|
DCD 0 ; Reserved
|
||||||
|
DCD 0 ; Reserved
|
||||||
|
DCD MWU_IRQHandler
|
||||||
|
DCD PWM1_IRQHandler_v
|
||||||
|
DCD PWM2_IRQHandler_v
|
||||||
|
DCD SPIM2_SPIS2_SPI2_IRQHandler_v
|
||||||
|
DCD RTC2_IRQHandler_v
|
||||||
|
DCD I2S_IRQHandler_v
|
||||||
|
DCD FPU_IRQHandler_v
|
||||||
|
|
||||||
|
|
||||||
|
__Vectors_End
|
||||||
|
__Vectors EQU __vector_table
|
||||||
|
__Vectors_Size EQU __Vectors_End - __Vectors
|
||||||
|
|
||||||
|
|
||||||
|
; Default handlers.
|
||||||
|
THUMB
|
||||||
|
|
||||||
|
PUBWEAK Reset_Handler
|
||||||
|
SECTION .text:CODE:NOROOT(2)
|
||||||
|
Reset_Handler
|
||||||
|
|
||||||
|
LDR R0, =SystemInit
|
||||||
|
BLX R0
|
||||||
|
LDR R0, =nrf_reloc_vector_table
|
||||||
|
BLX R0
|
||||||
|
LDR R0, =__iar_program_start
|
||||||
|
BX R0
|
||||||
|
|
||||||
|
; Dummy exception handlers
|
||||||
|
|
||||||
|
|
||||||
|
PUBWEAK NMI_Handler
|
||||||
|
SECTION .text:CODE:NOROOT(1)
|
||||||
|
NMI_Handler
|
||||||
|
B .
|
||||||
|
|
||||||
|
PUBWEAK HardFault_Handler
|
||||||
|
SECTION .text:CODE:NOROOT(1)
|
||||||
|
HardFault_Handler
|
||||||
|
B .
|
||||||
|
|
||||||
|
PUBWEAK MemoryManagement_Handler
|
||||||
|
SECTION .text:CODE:NOROOT(1)
|
||||||
|
MemoryManagement_Handler
|
||||||
|
B .
|
||||||
|
|
||||||
|
PUBWEAK BusFault_Handler
|
||||||
|
SECTION .text:CODE:NOROOT(1)
|
||||||
|
BusFault_Handler
|
||||||
|
B .
|
||||||
|
|
||||||
|
PUBWEAK UsageFault_Handler
|
||||||
|
SECTION .text:CODE:NOROOT(1)
|
||||||
|
UsageFault_Handler
|
||||||
|
B .
|
||||||
|
|
||||||
|
PUBWEAK SVC_Handler
|
||||||
|
SECTION .text:CODE:NOROOT(1)
|
||||||
|
SVC_Handler
|
||||||
|
B .
|
||||||
|
|
||||||
|
PUBWEAK DebugMonitor_Handler
|
||||||
|
SECTION .text:CODE:NOROOT(1)
|
||||||
|
DebugMonitor_Handler
|
||||||
|
B .
|
||||||
|
|
||||||
|
PUBWEAK PendSV_Handler
|
||||||
|
SECTION .text:CODE:NOROOT(1)
|
||||||
|
PendSV_Handler
|
||||||
|
B .
|
||||||
|
|
||||||
|
PUBWEAK SysTick_Handler
|
||||||
|
SECTION .text:CODE:NOROOT(1)
|
||||||
|
SysTick_Handler
|
||||||
|
B .
|
||||||
|
|
||||||
|
|
||||||
|
; Dummy interrupt handlers
|
||||||
|
|
||||||
|
PUBWEAK POWER_CLOCK_IRQHandler
|
||||||
|
SECTION .text:CODE:NOROOT(1)
|
||||||
|
POWER_CLOCK_IRQHandler
|
||||||
|
B .
|
||||||
|
|
||||||
|
PUBWEAK RADIO_IRQHandler
|
||||||
|
SECTION .text:CODE:NOROOT(1)
|
||||||
|
RADIO_IRQHandler
|
||||||
|
B .
|
||||||
|
|
||||||
|
PUBWEAK UARTE0_UART0_IRQHandler_v
|
||||||
|
SECTION .text:CODE:NOROOT(1)
|
||||||
|
UARTE0_UART0_IRQHandler_v
|
||||||
|
B .
|
||||||
|
|
||||||
|
PUBWEAK SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQHandler_v
|
||||||
|
SECTION .text:CODE:NOROOT(1)
|
||||||
|
SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQHandler_v
|
||||||
|
B .
|
||||||
|
|
||||||
|
PUBWEAK SPIM1_SPIS1_TWIM1_TWIS1_SPI1_TWI1_IRQHandler_v
|
||||||
|
SECTION .text:CODE:NOROOT(1)
|
||||||
|
SPIM1_SPIS1_TWIM1_TWIS1_SPI1_TWI1_IRQHandler_v
|
||||||
|
B .
|
||||||
|
|
||||||
|
PUBWEAK NFCT_IRQHandler_v
|
||||||
|
SECTION .text:CODE:NOROOT(1)
|
||||||
|
NFCT_IRQHandler_v
|
||||||
|
B .
|
||||||
|
|
||||||
|
PUBWEAK GPIOTE_IRQHandler_v
|
||||||
|
SECTION .text:CODE:NOROOT(1)
|
||||||
|
GPIOTE_IRQHandler_v
|
||||||
|
B .
|
||||||
|
|
||||||
|
PUBWEAK SAADC_IRQHandler_v
|
||||||
|
SECTION .text:CODE:NOROOT(1)
|
||||||
|
SAADC_IRQHandler_v
|
||||||
|
B .
|
||||||
|
|
||||||
|
PUBWEAK TIMER0_IRQHandler_v
|
||||||
|
SECTION .text:CODE:NOROOT(1)
|
||||||
|
TIMER0_IRQHandler_v
|
||||||
|
B .
|
||||||
|
|
||||||
|
PUBWEAK TIMER1_IRQHandler_v
|
||||||
|
SECTION .text:CODE:NOROOT(1)
|
||||||
|
TIMER1_IRQHandler_v
|
||||||
|
B .
|
||||||
|
|
||||||
|
PUBWEAK TIMER2_IRQHandler_v
|
||||||
|
SECTION .text:CODE:NOROOT(1)
|
||||||
|
TIMER2_IRQHandler_v
|
||||||
|
B .
|
||||||
|
|
||||||
|
PUBWEAK RTC0_IRQHandler
|
||||||
|
SECTION .text:CODE:NOROOT(1)
|
||||||
|
RTC0_IRQHandler
|
||||||
|
B .
|
||||||
|
|
||||||
|
PUBWEAK TEMP_IRQHandler_v
|
||||||
|
SECTION .text:CODE:NOROOT(1)
|
||||||
|
TEMP_IRQHandler_v
|
||||||
|
B .
|
||||||
|
|
||||||
|
PUBWEAK RNG_IRQHandler
|
||||||
|
SECTION .text:CODE:NOROOT(1)
|
||||||
|
RNG_IRQHandler
|
||||||
|
B .
|
||||||
|
|
||||||
|
PUBWEAK ECB_IRQHandler
|
||||||
|
SECTION .text:CODE:NOROOT(1)
|
||||||
|
ECB_IRQHandler
|
||||||
|
B .
|
||||||
|
|
||||||
|
PUBWEAK CCM_AAR_IRQHandler
|
||||||
|
SECTION .text:CODE:NOROOT(1)
|
||||||
|
CCM_AAR_IRQHandler
|
||||||
|
B .
|
||||||
|
|
||||||
|
PUBWEAK WDT_IRQHandler_v
|
||||||
|
SECTION .text:CODE:NOROOT(1)
|
||||||
|
WDT_IRQHandler_v
|
||||||
|
B .
|
||||||
|
|
||||||
|
PUBWEAK RTC1_IRQHandler_v
|
||||||
|
SECTION .text:CODE:NOROOT(1)
|
||||||
|
RTC1_IRQHandler_v
|
||||||
|
B .
|
||||||
|
|
||||||
|
PUBWEAK QDEC_IRQHandler_v
|
||||||
|
SECTION .text:CODE:NOROOT(1)
|
||||||
|
QDEC_IRQHandler_v
|
||||||
|
B .
|
||||||
|
|
||||||
|
PUBWEAK COMP_LPCOMP_IRQHandler_v
|
||||||
|
SECTION .text:CODE:NOROOT(1)
|
||||||
|
COMP_LPCOMP_IRQHandler_v
|
||||||
|
B .
|
||||||
|
|
||||||
|
PUBWEAK SWI0_EGU0_IRQHandler_v
|
||||||
|
SECTION .text:CODE:NOROOT(1)
|
||||||
|
SWI0_EGU0_IRQHandler_v
|
||||||
|
B .
|
||||||
|
|
||||||
|
PUBWEAK SWI1_EGU1_IRQHandler_v
|
||||||
|
SECTION .text:CODE:NOROOT(1)
|
||||||
|
SWI1_EGU1_IRQHandler_v
|
||||||
|
B .
|
||||||
|
|
||||||
|
PUBWEAK SWI2_EGU2_IRQHandler_v
|
||||||
|
SECTION .text:CODE:NOROOT(1)
|
||||||
|
SWI2_EGU2_IRQHandler_v
|
||||||
|
B .
|
||||||
|
|
||||||
|
PUBWEAK SWI3_EGU3_IRQHandler_v
|
||||||
|
SECTION .text:CODE:NOROOT(1)
|
||||||
|
SWI3_EGU3_IRQHandler_v
|
||||||
|
B .
|
||||||
|
|
||||||
|
PUBWEAK SWI4_EGU4_IRQHandler
|
||||||
|
SECTION .text:CODE:NOROOT(1)
|
||||||
|
SWI4_EGU4_IRQHandler
|
||||||
|
B .
|
||||||
|
|
||||||
|
PUBWEAK SWI5_EGU5_IRQHandler
|
||||||
|
SECTION .text:CODE:NOROOT(1)
|
||||||
|
SWI5_EGU5_IRQHandler
|
||||||
|
B .
|
||||||
|
|
||||||
|
PUBWEAK TIMER3_IRQHandler_v
|
||||||
|
SECTION .text:CODE:NOROOT(1)
|
||||||
|
TIMER3_IRQHandler_v
|
||||||
|
B .
|
||||||
|
|
||||||
|
PUBWEAK TIMER4_IRQHandler_v
|
||||||
|
SECTION .text:CODE:NOROOT(1)
|
||||||
|
TIMER4_IRQHandler_v
|
||||||
|
B .
|
||||||
|
|
||||||
|
PUBWEAK PWM0_IRQHandler_v
|
||||||
|
SECTION .text:CODE:NOROOT(1)
|
||||||
|
PWM0_IRQHandler_v
|
||||||
|
B .
|
||||||
|
|
||||||
|
PUBWEAK PDM_IRQHandler_v
|
||||||
|
SECTION .text:CODE:NOROOT(1)
|
||||||
|
PDM_IRQHandler_v
|
||||||
|
B .
|
||||||
|
|
||||||
|
PUBWEAK MWU_IRQHandler
|
||||||
|
SECTION .text:CODE:NOROOT(1)
|
||||||
|
MWU_IRQHandler
|
||||||
|
B .
|
||||||
|
|
||||||
|
PUBWEAK PWM1_IRQHandler_v
|
||||||
|
SECTION .text:CODE:NOROOT(1)
|
||||||
|
PWM1_IRQHandler_v
|
||||||
|
B .
|
||||||
|
|
||||||
|
PUBWEAK PWM2_IRQHandler_v
|
||||||
|
SECTION .text:CODE:NOROOT(1)
|
||||||
|
PWM2_IRQHandler_v
|
||||||
|
B .
|
||||||
|
|
||||||
|
PUBWEAK SPIM2_SPIS2_SPI2_IRQHandler_v
|
||||||
|
SECTION .text:CODE:NOROOT(1)
|
||||||
|
SPIM2_SPIS2_SPI2_IRQHandler_v
|
||||||
|
B .
|
||||||
|
|
||||||
|
PUBWEAK RTC2_IRQHandler_v
|
||||||
|
SECTION .text:CODE:NOROOT(1)
|
||||||
|
RTC2_IRQHandler_v
|
||||||
|
B .
|
||||||
|
|
||||||
|
PUBWEAK I2S_IRQHandler_v
|
||||||
|
SECTION .text:CODE:NOROOT(1)
|
||||||
|
I2S_IRQHandler_v
|
||||||
|
B .
|
||||||
|
|
||||||
|
PUBWEAK FPU_IRQHandler_v
|
||||||
|
SECTION .text:CODE:NOROOT(1)
|
||||||
|
FPU_IRQHandler_v
|
||||||
|
B .
|
||||||
|
|
||||||
|
|
||||||
|
END
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
/*
|
||||||
|
* PackageLicenseDeclared: Apache-2.0
|
||||||
|
* Copyright (c) 2016 ARM Limited
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef MBED_CMSIS_H
|
||||||
|
#define MBED_CMSIS_H
|
||||||
|
|
||||||
|
#include "nrf.h"
|
||||||
|
#include "cmsis_nvic.h"
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,43 @@
|
||||||
|
/* mbed Microcontroller Library
|
||||||
|
* CMSIS-style functionality to support dynamic vectors
|
||||||
|
*******************************************************************************
|
||||||
|
* Copyright (c) 2016 ARM Limited. All rights reserved.
|
||||||
|
* 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 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 ARM Limited nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.
|
||||||
|
*******************************************************************************
|
||||||
|
*/
|
||||||
|
#include "cmsis_nvic.h"
|
||||||
|
|
||||||
|
extern uint32_t nrf_dispatch_vector[NVIC_NUM_VECTORS];
|
||||||
|
|
||||||
|
void NVIC_SetVector(IRQn_Type IRQn, uint32_t vector)
|
||||||
|
{
|
||||||
|
nrf_dispatch_vector[IRQn + NVIC_USER_IRQ_OFFSET] = vector;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t NVIC_GetVector(IRQn_Type IRQn)
|
||||||
|
{
|
||||||
|
return nrf_dispatch_vector[IRQn + NVIC_USER_IRQ_OFFSET];
|
||||||
|
}
|
|
@ -0,0 +1,52 @@
|
||||||
|
/* mbed Microcontroller Library
|
||||||
|
*******************************************************************************
|
||||||
|
* Copyright (c) 2016 ARM Limited. All rights reserved.
|
||||||
|
* 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 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 ARM Limited nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.
|
||||||
|
*******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef MBED_CMSIS_NVIC_H
|
||||||
|
#define MBED_CMSIS_NVIC_H
|
||||||
|
|
||||||
|
#define NVIC_NUM_VECTORS (16 + 38) // CORE + MCU Peripherals
|
||||||
|
#define NVIC_USER_IRQ_OFFSET 16
|
||||||
|
|
||||||
|
#include "nrf52.h"
|
||||||
|
#include "cmsis.h"
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void NVIC_SetVector(IRQn_Type IRQn, uint32_t vector);
|
||||||
|
uint32_t NVIC_GetVector(IRQn_Type IRQn);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,365 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
Copyright (c) 2009-2017 ARM Limited. All rights reserved.
|
||||||
|
|
||||||
|
SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
NOTICE: This file has been modified by Nordic Semiconductor ASA.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* NOTE: Template files (including this one) are application specific and therefore expected to
|
||||||
|
be copied into the application project folder prior to its use! */
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include "nrf.h"
|
||||||
|
#include "system_nrf52.h"
|
||||||
|
#include "nrf5x_lf_clk_helper.h"
|
||||||
|
|
||||||
|
/*lint ++flb "Enter library region" */
|
||||||
|
|
||||||
|
#define __SYSTEM_CLOCK_64M (64000000UL)
|
||||||
|
|
||||||
|
static bool errata_12(void);
|
||||||
|
static bool errata_16(void);
|
||||||
|
static bool errata_31(void);
|
||||||
|
static bool errata_32(void);
|
||||||
|
static bool errata_36(void);
|
||||||
|
static bool errata_37(void);
|
||||||
|
static bool errata_57(void);
|
||||||
|
static bool errata_66(void);
|
||||||
|
static bool errata_108(void);
|
||||||
|
static bool errata_136(void);
|
||||||
|
|
||||||
|
|
||||||
|
#if defined ( __CC_ARM )
|
||||||
|
uint32_t SystemCoreClock __attribute__((used)) = __SYSTEM_CLOCK_64M;
|
||||||
|
#elif defined ( __ICCARM__ )
|
||||||
|
__root uint32_t SystemCoreClock = __SYSTEM_CLOCK_64M;
|
||||||
|
#elif defined ( __GNUC__ )
|
||||||
|
uint32_t SystemCoreClock __attribute__((used)) = __SYSTEM_CLOCK_64M;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void SystemCoreClockUpdate(void)
|
||||||
|
{
|
||||||
|
SystemCoreClock = __SYSTEM_CLOCK_64M;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SystemInit(void)
|
||||||
|
{
|
||||||
|
/* Enable SWO trace functionality. If ENABLE_SWO is not defined, SWO pin will be used as GPIO (see Product
|
||||||
|
Specification to see which one). */
|
||||||
|
#if defined (ENABLE_SWO)
|
||||||
|
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
|
||||||
|
NRF_CLOCK->TRACECONFIG |= CLOCK_TRACECONFIG_TRACEMUX_Serial << CLOCK_TRACECONFIG_TRACEMUX_Pos;
|
||||||
|
NRF_P0->PIN_CNF[18] = (GPIO_PIN_CNF_DRIVE_H0H1 << GPIO_PIN_CNF_DRIVE_Pos) | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) | (GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Enable Trace functionality. If ENABLE_TRACE is not defined, TRACE pins will be used as GPIOs (see Product
|
||||||
|
Specification to see which ones). */
|
||||||
|
#if defined (ENABLE_TRACE)
|
||||||
|
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
|
||||||
|
NRF_CLOCK->TRACECONFIG |= CLOCK_TRACECONFIG_TRACEMUX_Parallel << CLOCK_TRACECONFIG_TRACEMUX_Pos;
|
||||||
|
NRF_P0->PIN_CNF[14] = (GPIO_PIN_CNF_DRIVE_H0H1 << GPIO_PIN_CNF_DRIVE_Pos) | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) | (GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos);
|
||||||
|
NRF_P0->PIN_CNF[15] = (GPIO_PIN_CNF_DRIVE_H0H1 << GPIO_PIN_CNF_DRIVE_Pos) | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) | (GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos);
|
||||||
|
NRF_P0->PIN_CNF[16] = (GPIO_PIN_CNF_DRIVE_H0H1 << GPIO_PIN_CNF_DRIVE_Pos) | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) | (GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos);
|
||||||
|
NRF_P0->PIN_CNF[18] = (GPIO_PIN_CNF_DRIVE_H0H1 << GPIO_PIN_CNF_DRIVE_Pos) | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) | (GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos);
|
||||||
|
NRF_P0->PIN_CNF[20] = (GPIO_PIN_CNF_DRIVE_H0H1 << GPIO_PIN_CNF_DRIVE_Pos) | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) | (GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Workaround for Errata 12 "COMP: Reference ladder not correctly calibrated" found at the Errata document
|
||||||
|
for your device located at https://infocenter.nordicsemi.com/ */
|
||||||
|
if (errata_12()){
|
||||||
|
*(volatile uint32_t *)0x40013540 = (*(uint32_t *)0x10000324 & 0x00001F00) >> 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Workaround for Errata 16 "System: RAM may be corrupt on wakeup from CPU IDLE" found at the Errata document
|
||||||
|
for your device located at https://infocenter.nordicsemi.com/ */
|
||||||
|
if (errata_16()){
|
||||||
|
*(volatile uint32_t *)0x4007C074 = 3131961357ul;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Workaround for Errata 31 "CLOCK: Calibration values are not correctly loaded from FICR at reset" found at the Errata document
|
||||||
|
for your device located at https://infocenter.nordicsemi.com/ */
|
||||||
|
if (errata_31()){
|
||||||
|
*(volatile uint32_t *)0x4000053C = ((*(volatile uint32_t *)0x10000244) & 0x0000E000) >> 13;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Workaround for Errata 32 "DIF: Debug session automatically enables TracePort pins" found at the Errata document
|
||||||
|
for your device located at https://infocenter.nordicsemi.com/ */
|
||||||
|
if (errata_32()){
|
||||||
|
CoreDebug->DEMCR &= ~CoreDebug_DEMCR_TRCENA_Msk;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Workaround for Errata 36 "CLOCK: Some registers are not reset when expected" found at the Errata document
|
||||||
|
for your device located at https://infocenter.nordicsemi.com/ */
|
||||||
|
if (errata_36()){
|
||||||
|
NRF_CLOCK->EVENTS_DONE = 0;
|
||||||
|
NRF_CLOCK->EVENTS_CTTO = 0;
|
||||||
|
NRF_CLOCK->CTIV = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Workaround for Errata 37 "RADIO: Encryption engine is slow by default" found at the Errata document
|
||||||
|
for your device located at https://infocenter.nordicsemi.com/ */
|
||||||
|
if (errata_37()){
|
||||||
|
*(volatile uint32_t *)0x400005A0 = 0x3;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Workaround for Errata 57 "NFCT: NFC Modulation amplitude" found at the Errata document
|
||||||
|
for your device located at https://infocenter.nordicsemi.com/ */
|
||||||
|
if (errata_57()){
|
||||||
|
*(volatile uint32_t *)0x40005610 = 0x00000005;
|
||||||
|
*(volatile uint32_t *)0x40005688 = 0x00000001;
|
||||||
|
*(volatile uint32_t *)0x40005618 = 0x00000000;
|
||||||
|
*(volatile uint32_t *)0x40005614 = 0x0000003F;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Workaround for Errata 66 "TEMP: Linearity specification not met with default settings" found at the Errata document
|
||||||
|
for your device located at https://infocenter.nordicsemi.com/ */
|
||||||
|
if (errata_66()){
|
||||||
|
NRF_TEMP->A0 = NRF_FICR->TEMP.A0;
|
||||||
|
NRF_TEMP->A1 = NRF_FICR->TEMP.A1;
|
||||||
|
NRF_TEMP->A2 = NRF_FICR->TEMP.A2;
|
||||||
|
NRF_TEMP->A3 = NRF_FICR->TEMP.A3;
|
||||||
|
NRF_TEMP->A4 = NRF_FICR->TEMP.A4;
|
||||||
|
NRF_TEMP->A5 = NRF_FICR->TEMP.A5;
|
||||||
|
NRF_TEMP->B0 = NRF_FICR->TEMP.B0;
|
||||||
|
NRF_TEMP->B1 = NRF_FICR->TEMP.B1;
|
||||||
|
NRF_TEMP->B2 = NRF_FICR->TEMP.B2;
|
||||||
|
NRF_TEMP->B3 = NRF_FICR->TEMP.B3;
|
||||||
|
NRF_TEMP->B4 = NRF_FICR->TEMP.B4;
|
||||||
|
NRF_TEMP->B5 = NRF_FICR->TEMP.B5;
|
||||||
|
NRF_TEMP->T0 = NRF_FICR->TEMP.T0;
|
||||||
|
NRF_TEMP->T1 = NRF_FICR->TEMP.T1;
|
||||||
|
NRF_TEMP->T2 = NRF_FICR->TEMP.T2;
|
||||||
|
NRF_TEMP->T3 = NRF_FICR->TEMP.T3;
|
||||||
|
NRF_TEMP->T4 = NRF_FICR->TEMP.T4;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Workaround for Errata 108 "RAM: RAM content cannot be trusted upon waking up from System ON Idle or System OFF mode" found at the Errata document
|
||||||
|
for your device located at https://infocenter.nordicsemi.com/ */
|
||||||
|
if (errata_108()){
|
||||||
|
*(volatile uint32_t *)0x40000EE4 = *(volatile uint32_t *)0x10000258 & 0x0000004F;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Workaround for Errata 136 "System: Bits in RESETREAS are set when they should not be" found at the Errata document
|
||||||
|
for your device located at https://infocenter.nordicsemi.com/ */
|
||||||
|
if (errata_136()){
|
||||||
|
if (NRF_POWER->RESETREAS & POWER_RESETREAS_RESETPIN_Msk){
|
||||||
|
NRF_POWER->RESETREAS = ~POWER_RESETREAS_RESETPIN_Msk;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Enable the FPU if the compiler used floating point unit instructions. __FPU_USED is a MACRO defined by the
|
||||||
|
* compiler. Since the FPU consumes energy, remember to disable FPU use in the compiler if floating point unit
|
||||||
|
* operations are not used in your code. */
|
||||||
|
#if (__FPU_USED == 1)
|
||||||
|
SCB->CPACR |= (3UL << 20) | (3UL << 22);
|
||||||
|
__DSB();
|
||||||
|
__ISB();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Configure NFCT pins as GPIOs if NFCT is not to be used in your code. If CONFIG_NFCT_PINS_AS_GPIOS is not defined,
|
||||||
|
two GPIOs (see Product Specification to see which ones) will be reserved for NFC and will not be available as
|
||||||
|
normal GPIOs. */
|
||||||
|
#if defined (CONFIG_NFCT_PINS_AS_GPIOS)
|
||||||
|
if ((NRF_UICR->NFCPINS & UICR_NFCPINS_PROTECT_Msk) == (UICR_NFCPINS_PROTECT_NFC << UICR_NFCPINS_PROTECT_Pos)){
|
||||||
|
NRF_NVMC->CONFIG = NVMC_CONFIG_WEN_Wen << NVMC_CONFIG_WEN_Pos;
|
||||||
|
while (NRF_NVMC->READY == NVMC_READY_READY_Busy){}
|
||||||
|
NRF_UICR->NFCPINS &= ~UICR_NFCPINS_PROTECT_Msk;
|
||||||
|
while (NRF_NVMC->READY == NVMC_READY_READY_Busy){}
|
||||||
|
NRF_NVMC->CONFIG = NVMC_CONFIG_WEN_Ren << NVMC_CONFIG_WEN_Pos;
|
||||||
|
while (NRF_NVMC->READY == NVMC_READY_READY_Busy){}
|
||||||
|
NVIC_SystemReset();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Configure GPIO pads as pPin Reset pin if Pin Reset capabilities desired. If CONFIG_GPIO_AS_PINRESET is not
|
||||||
|
defined, pin reset will not be available. One GPIO (see Product Specification to see which one) will then be
|
||||||
|
reserved for PinReset and not available as normal GPIO. */
|
||||||
|
#if defined (CONFIG_GPIO_AS_PINRESET)
|
||||||
|
if (((NRF_UICR->PSELRESET[0] & UICR_PSELRESET_CONNECT_Msk) != (UICR_PSELRESET_CONNECT_Connected << UICR_PSELRESET_CONNECT_Pos)) ||
|
||||||
|
((NRF_UICR->PSELRESET[1] & UICR_PSELRESET_CONNECT_Msk) != (UICR_PSELRESET_CONNECT_Connected << UICR_PSELRESET_CONNECT_Pos))){
|
||||||
|
NRF_NVMC->CONFIG = NVMC_CONFIG_WEN_Wen << NVMC_CONFIG_WEN_Pos;
|
||||||
|
while (NRF_NVMC->READY == NVMC_READY_READY_Busy){}
|
||||||
|
NRF_UICR->PSELRESET[0] = 21;
|
||||||
|
while (NRF_NVMC->READY == NVMC_READY_READY_Busy){}
|
||||||
|
NRF_UICR->PSELRESET[1] = 21;
|
||||||
|
while (NRF_NVMC->READY == NVMC_READY_READY_Busy){}
|
||||||
|
NRF_NVMC->CONFIG = NVMC_CONFIG_WEN_Ren << NVMC_CONFIG_WEN_Pos;
|
||||||
|
while (NRF_NVMC->READY == NVMC_READY_READY_Busy){}
|
||||||
|
NVIC_SystemReset();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
SystemCoreClockUpdate();
|
||||||
|
|
||||||
|
// Start the LF oscilator according to the mbed configuration (over the nrf5x_lf_clk_helper.h file)
|
||||||
|
NRF_CLOCK->LFCLKSRC = (CLOCK_LFCLKSRC_SRC_TO_USE << CLOCK_LFCLKSRC_SRC_Pos);
|
||||||
|
NRF_CLOCK->EVENTS_LFCLKSTARTED = 0;
|
||||||
|
NRF_CLOCK->TASKS_LFCLKSTART = 1;
|
||||||
|
|
||||||
|
// Wait for the external oscillator to start up.
|
||||||
|
while (NRF_CLOCK->EVENTS_LFCLKSTARTED == 0) {
|
||||||
|
// Do nothing.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static bool errata_12(void)
|
||||||
|
{
|
||||||
|
if ((((*(uint32_t *)0xF0000FE0) & 0x000000FF) == 0x6) && (((*(uint32_t *)0xF0000FE4) & 0x0000000F) == 0x0)){
|
||||||
|
if (((*(uint32_t *)0xF0000FE8) & 0x000000F0) == 0x30){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (((*(uint32_t *)0xF0000FE8) & 0x000000F0) == 0x40){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (((*(uint32_t *)0xF0000FE8) & 0x000000F0) == 0x50){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool errata_16(void)
|
||||||
|
{
|
||||||
|
if ((((*(uint32_t *)0xF0000FE0) & 0x000000FF) == 0x6) && (((*(uint32_t *)0xF0000FE4) & 0x0000000F) == 0x0)){
|
||||||
|
if (((*(uint32_t *)0xF0000FE8) & 0x000000F0) == 0x30){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool errata_31(void)
|
||||||
|
{
|
||||||
|
if ((((*(uint32_t *)0xF0000FE0) & 0x000000FF) == 0x6) && (((*(uint32_t *)0xF0000FE4) & 0x0000000F) == 0x0)){
|
||||||
|
if (((*(uint32_t *)0xF0000FE8) & 0x000000F0) == 0x30){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (((*(uint32_t *)0xF0000FE8) & 0x000000F0) == 0x40){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (((*(uint32_t *)0xF0000FE8) & 0x000000F0) == 0x50){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool errata_32(void)
|
||||||
|
{
|
||||||
|
if ((((*(uint32_t *)0xF0000FE0) & 0x000000FF) == 0x6) && (((*(uint32_t *)0xF0000FE4) & 0x0000000F) == 0x0)){
|
||||||
|
if (((*(uint32_t *)0xF0000FE8) & 0x000000F0) == 0x30){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool errata_36(void)
|
||||||
|
{
|
||||||
|
if ((((*(uint32_t *)0xF0000FE0) & 0x000000FF) == 0x6) && (((*(uint32_t *)0xF0000FE4) & 0x0000000F) == 0x0)){
|
||||||
|
if (((*(uint32_t *)0xF0000FE8) & 0x000000F0) == 0x30){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (((*(uint32_t *)0xF0000FE8) & 0x000000F0) == 0x40){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (((*(uint32_t *)0xF0000FE8) & 0x000000F0) == 0x50){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool errata_37(void)
|
||||||
|
{
|
||||||
|
if ((((*(uint32_t *)0xF0000FE0) & 0x000000FF) == 0x6) && (((*(uint32_t *)0xF0000FE4) & 0x0000000F) == 0x0)){
|
||||||
|
if (((*(uint32_t *)0xF0000FE8) & 0x000000F0) == 0x30){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool errata_57(void)
|
||||||
|
{
|
||||||
|
if ((((*(uint32_t *)0xF0000FE0) & 0x000000FF) == 0x6) && (((*(uint32_t *)0xF0000FE4) & 0x0000000F) == 0x0)){
|
||||||
|
if (((*(uint32_t *)0xF0000FE8) & 0x000000F0) == 0x30){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool errata_66(void)
|
||||||
|
{
|
||||||
|
if ((((*(uint32_t *)0xF0000FE0) & 0x000000FF) == 0x6) && (((*(uint32_t *)0xF0000FE4) & 0x0000000F) == 0x0)){
|
||||||
|
if (((*(uint32_t *)0xF0000FE8) & 0x000000F0) == 0x50){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static bool errata_108(void)
|
||||||
|
{
|
||||||
|
if ((((*(uint32_t *)0xF0000FE0) & 0x000000FF) == 0x6) && (((*(uint32_t *)0xF0000FE4) & 0x0000000F) == 0x0)){
|
||||||
|
if (((*(uint32_t *)0xF0000FE8) & 0x000000F0) == 0x30){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (((*(uint32_t *)0xF0000FE8) & 0x000000F0) == 0x40){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (((*(uint32_t *)0xF0000FE8) & 0x000000F0) == 0x50){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static bool errata_136(void)
|
||||||
|
{
|
||||||
|
if ((((*(uint32_t *)0xF0000FE0) & 0x000000FF) == 0x6) && (((*(uint32_t *)0xF0000FE4) & 0x0000000F) == 0x0)){
|
||||||
|
if (((*(uint32_t *)0xF0000FE8) & 0x000000F0) == 0x30){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (((*(uint32_t *)0xF0000FE8) & 0x000000F0) == 0x40){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (((*(uint32_t *)0xF0000FE8) & 0x000000F0) == 0x50){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*lint --flb "Leave library region" */
|
|
@ -0,0 +1,61 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
Copyright (c) 2009-2017 ARM Limited. All rights reserved.
|
||||||
|
|
||||||
|
SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
NOTICE: This file has been modified by Nordic Semiconductor ASA.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SYSTEM_NRF52_H
|
||||||
|
#define SYSTEM_NRF52_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
|
||||||
|
extern uint32_t SystemCoreClock; /*!< System Clock Frequency (Core Clock) */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize the system
|
||||||
|
*
|
||||||
|
* @param none
|
||||||
|
* @return none
|
||||||
|
*
|
||||||
|
* @brief Setup the microcontroller system.
|
||||||
|
* Initialize the System and update the SystemCoreClock variable.
|
||||||
|
*/
|
||||||
|
extern void SystemInit (void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update SystemCoreClock variable
|
||||||
|
*
|
||||||
|
* @param none
|
||||||
|
* @return none
|
||||||
|
*
|
||||||
|
* @brief Updates the SystemCoreClock with current core Clock
|
||||||
|
* retrieved from cpu registers.
|
||||||
|
*/
|
||||||
|
extern void SystemCoreClockUpdate (void);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* SYSTEM_NRF52_H */
|
Loading…
Reference in New Issue