able to build
This commit is contained in:
		@@ -0,0 +1,410 @@
 | 
			
		||||
/*
 | 
			
		||||
 
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
    .syntax unified
 | 
			
		||||
    .arch armv7e-m
 | 
			
		||||
 | 
			
		||||
#ifdef __STARTUP_CONFIG
 | 
			
		||||
#include "startup_config.h"
 | 
			
		||||
#ifndef __STARTUP_CONFIG_STACK_ALIGNEMENT
 | 
			
		||||
#define __STARTUP_CONFIG_STACK_ALIGNEMENT 3
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    .section .stack
 | 
			
		||||
#if defined(__STARTUP_CONFIG)
 | 
			
		||||
    .align __STARTUP_CONFIG_STACK_ALIGNEMENT
 | 
			
		||||
    .equ    Stack_Size, __STARTUP_CONFIG_STACK_SIZE
 | 
			
		||||
#elif defined(__STACK_SIZE)
 | 
			
		||||
    .align 3
 | 
			
		||||
    .equ    Stack_Size, __STACK_SIZE
 | 
			
		||||
#else
 | 
			
		||||
    .align 3
 | 
			
		||||
    .equ    Stack_Size, 8192
 | 
			
		||||
#endif
 | 
			
		||||
    .globl __StackTop
 | 
			
		||||
    .globl __StackLimit
 | 
			
		||||
__StackLimit:
 | 
			
		||||
    .space Stack_Size
 | 
			
		||||
    .size __StackLimit, . - __StackLimit
 | 
			
		||||
__StackTop:
 | 
			
		||||
    .size __StackTop, . - __StackTop
 | 
			
		||||
 | 
			
		||||
    .section .heap
 | 
			
		||||
    .align 3
 | 
			
		||||
#if defined(__STARTUP_CONFIG)
 | 
			
		||||
    .equ Heap_Size, __STARTUP_CONFIG_HEAP_SIZE
 | 
			
		||||
#elif defined(__HEAP_SIZE)
 | 
			
		||||
    .equ Heap_Size, __HEAP_SIZE
 | 
			
		||||
#else
 | 
			
		||||
    .equ    Heap_Size, 8192
 | 
			
		||||
#endif
 | 
			
		||||
    .globl __HeapBase
 | 
			
		||||
    .globl __HeapLimit
 | 
			
		||||
__HeapBase:
 | 
			
		||||
    .if Heap_Size
 | 
			
		||||
    .space Heap_Size
 | 
			
		||||
    .endif
 | 
			
		||||
    .size __HeapBase, . - __HeapBase
 | 
			
		||||
__HeapLimit:
 | 
			
		||||
    .size __HeapLimit, . - __HeapLimit
 | 
			
		||||
 | 
			
		||||
    .section .isr_vector
 | 
			
		||||
    .align 2
 | 
			
		||||
    .globl __isr_vector
 | 
			
		||||
__isr_vector:
 | 
			
		||||
    .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   DebugMon_Handler
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   PendSV_Handler
 | 
			
		||||
    .long   SysTick_Handler
 | 
			
		||||
 | 
			
		||||
  /* External Interrupts */
 | 
			
		||||
    .long   POWER_CLOCK_IRQHandler
 | 
			
		||||
    .long   RADIO_IRQHandler
 | 
			
		||||
    .long   UARTE0_UART0_IRQHandler
 | 
			
		||||
    .long   SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQHandler
 | 
			
		||||
    .long   SPIM1_SPIS1_TWIM1_TWIS1_SPI1_TWI1_IRQHandler
 | 
			
		||||
    .long   NFCT_IRQHandler
 | 
			
		||||
    .long   GPIOTE_IRQHandler
 | 
			
		||||
    .long   SAADC_IRQHandler
 | 
			
		||||
    .long   TIMER0_IRQHandler
 | 
			
		||||
    .long   TIMER1_IRQHandler
 | 
			
		||||
    .long   TIMER2_IRQHandler
 | 
			
		||||
    .long   RTC0_IRQHandler
 | 
			
		||||
    .long   TEMP_IRQHandler
 | 
			
		||||
    .long   RNG_IRQHandler
 | 
			
		||||
    .long   ECB_IRQHandler
 | 
			
		||||
    .long   CCM_AAR_IRQHandler
 | 
			
		||||
    .long   WDT_IRQHandler
 | 
			
		||||
    .long   RTC1_IRQHandler
 | 
			
		||||
    .long   QDEC_IRQHandler
 | 
			
		||||
    .long   COMP_LPCOMP_IRQHandler
 | 
			
		||||
    .long   SWI0_EGU0_IRQHandler
 | 
			
		||||
    .long   SWI1_EGU1_IRQHandler
 | 
			
		||||
    .long   SWI2_EGU2_IRQHandler
 | 
			
		||||
    .long   SWI3_EGU3_IRQHandler
 | 
			
		||||
    .long   SWI4_EGU4_IRQHandler
 | 
			
		||||
    .long   SWI5_EGU5_IRQHandler
 | 
			
		||||
    .long   TIMER3_IRQHandler
 | 
			
		||||
    .long   TIMER4_IRQHandler
 | 
			
		||||
    .long   PWM0_IRQHandler
 | 
			
		||||
    .long   PDM_IRQHandler
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   MWU_IRQHandler
 | 
			
		||||
    .long   PWM1_IRQHandler
 | 
			
		||||
    .long   PWM2_IRQHandler
 | 
			
		||||
    .long   SPIM2_SPIS2_SPI2_IRQHandler
 | 
			
		||||
    .long   RTC2_IRQHandler
 | 
			
		||||
    .long   I2S_IRQHandler
 | 
			
		||||
    .long   FPU_IRQHandler
 | 
			
		||||
    .long   USBD_IRQHandler
 | 
			
		||||
    .long   UARTE1_IRQHandler
 | 
			
		||||
    .long   QSPI_IRQHandler
 | 
			
		||||
    .long   CRYPTOCELL_IRQHandler
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   PWM3_IRQHandler
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   SPIM3_IRQHandler
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
    .long   0                           /*Reserved */
 | 
			
		||||
 | 
			
		||||
    .size __isr_vector, . - __isr_vector
 | 
			
		||||
 | 
			
		||||
/* Reset Handler */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    .text
 | 
			
		||||
    .thumb
 | 
			
		||||
    .thumb_func
 | 
			
		||||
    .align 1
 | 
			
		||||
    .globl Reset_Handler
 | 
			
		||||
    .type Reset_Handler, %function
 | 
			
		||||
Reset_Handler:
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Loop to copy data from read only memory to RAM.
 | 
			
		||||
 * The ranges of copy from/to are specified by following symbols:
 | 
			
		||||
 *      __etext: LMA of start of the section to copy from. Usually end of text
 | 
			
		||||
 *      __data_start__: VMA of start of the section to copy to.
 | 
			
		||||
 *      __bss_start__: VMA of end of the section to copy to. Normally __data_end__ is used, but by using __bss_start__
 | 
			
		||||
 *                    the user can add their own initialized data section before BSS section with the INTERT AFTER command.
 | 
			
		||||
 *
 | 
			
		||||
 * All addresses must be aligned to 4 bytes boundary.
 | 
			
		||||
 */
 | 
			
		||||
    ldr r1, =__etext
 | 
			
		||||
    ldr r2, =__data_start__
 | 
			
		||||
    ldr r3, =__bss_start__
 | 
			
		||||
 | 
			
		||||
    subs r3, r2
 | 
			
		||||
    ble .L_loop1_done
 | 
			
		||||
 | 
			
		||||
.L_loop1:
 | 
			
		||||
    subs r3, #4
 | 
			
		||||
    ldr r0, [r1,r3]
 | 
			
		||||
    str r0, [r2,r3]
 | 
			
		||||
    bgt .L_loop1
 | 
			
		||||
 | 
			
		||||
.L_loop1_done:
 | 
			
		||||
 | 
			
		||||
/* This part of work usually is done in C library startup code. Otherwise,
 | 
			
		||||
 * define __STARTUP_CLEAR_BSS to enable it in this startup. This section
 | 
			
		||||
 * clears the RAM where BSS data is located.
 | 
			
		||||
 *
 | 
			
		||||
 * The BSS section is specified by following symbols
 | 
			
		||||
 *    __bss_start__: start of the BSS section.
 | 
			
		||||
 *    __bss_end__: end of the BSS section.
 | 
			
		||||
 *
 | 
			
		||||
 * All addresses must be aligned to 4 bytes boundary.
 | 
			
		||||
 */
 | 
			
		||||
#ifdef __STARTUP_CLEAR_BSS
 | 
			
		||||
    ldr r1, =__bss_start__
 | 
			
		||||
    ldr r2, =__bss_end__
 | 
			
		||||
 | 
			
		||||
    movs r0, 0
 | 
			
		||||
 | 
			
		||||
    subs r2, r1
 | 
			
		||||
    ble .L_loop3_done
 | 
			
		||||
 | 
			
		||||
.L_loop3:
 | 
			
		||||
    subs r2, #4
 | 
			
		||||
    str r0, [r1, r2]
 | 
			
		||||
    bgt .L_loop3
 | 
			
		||||
 | 
			
		||||
.L_loop3_done:
 | 
			
		||||
#endif /* __STARTUP_CLEAR_BSS */
 | 
			
		||||
 | 
			
		||||
/* Execute SystemInit function. */
 | 
			
		||||
    bl SystemInit
 | 
			
		||||
 | 
			
		||||
/* Call _start function provided by libraries.
 | 
			
		||||
 * If those libraries are not accessible, define __START as your entry point.
 | 
			
		||||
 */
 | 
			
		||||
#ifndef __START
 | 
			
		||||
#define __START _start
 | 
			
		||||
#endif
 | 
			
		||||
    bl __START
 | 
			
		||||
 | 
			
		||||
    .pool
 | 
			
		||||
    .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   DebugMon_Handler
 | 
			
		||||
    .type   DebugMon_Handler, %function
 | 
			
		||||
DebugMon_Handler:
 | 
			
		||||
    b       .
 | 
			
		||||
    .size   DebugMon_Handler, . - DebugMon_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
 | 
			
		||||
    IRQ  RADIO_IRQHandler
 | 
			
		||||
    IRQ  UARTE0_UART0_IRQHandler
 | 
			
		||||
    IRQ  SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQHandler
 | 
			
		||||
    IRQ  SPIM1_SPIS1_TWIM1_TWIS1_SPI1_TWI1_IRQHandler
 | 
			
		||||
    IRQ  NFCT_IRQHandler
 | 
			
		||||
    IRQ  GPIOTE_IRQHandler
 | 
			
		||||
    IRQ  SAADC_IRQHandler
 | 
			
		||||
    IRQ  TIMER0_IRQHandler
 | 
			
		||||
    IRQ  TIMER1_IRQHandler
 | 
			
		||||
    IRQ  TIMER2_IRQHandler
 | 
			
		||||
    IRQ  RTC0_IRQHandler
 | 
			
		||||
    IRQ  TEMP_IRQHandler
 | 
			
		||||
    IRQ  RNG_IRQHandler
 | 
			
		||||
    IRQ  ECB_IRQHandler
 | 
			
		||||
    IRQ  CCM_AAR_IRQHandler
 | 
			
		||||
    IRQ  WDT_IRQHandler
 | 
			
		||||
    IRQ  RTC1_IRQHandler
 | 
			
		||||
    IRQ  QDEC_IRQHandler
 | 
			
		||||
    IRQ  COMP_LPCOMP_IRQHandler
 | 
			
		||||
    IRQ  SWI0_EGU0_IRQHandler
 | 
			
		||||
    IRQ  SWI1_EGU1_IRQHandler
 | 
			
		||||
    IRQ  SWI2_EGU2_IRQHandler
 | 
			
		||||
    IRQ  SWI3_EGU3_IRQHandler
 | 
			
		||||
    IRQ  SWI4_EGU4_IRQHandler
 | 
			
		||||
    IRQ  SWI5_EGU5_IRQHandler
 | 
			
		||||
    IRQ  TIMER3_IRQHandler
 | 
			
		||||
    IRQ  TIMER4_IRQHandler
 | 
			
		||||
    IRQ  PWM0_IRQHandler
 | 
			
		||||
    IRQ  PDM_IRQHandler
 | 
			
		||||
    IRQ  MWU_IRQHandler
 | 
			
		||||
    IRQ  PWM1_IRQHandler
 | 
			
		||||
    IRQ  PWM2_IRQHandler
 | 
			
		||||
    IRQ  SPIM2_SPIS2_SPI2_IRQHandler
 | 
			
		||||
    IRQ  RTC2_IRQHandler
 | 
			
		||||
    IRQ  I2S_IRQHandler
 | 
			
		||||
    IRQ  FPU_IRQHandler
 | 
			
		||||
    IRQ  USBD_IRQHandler
 | 
			
		||||
    IRQ  UARTE1_IRQHandler
 | 
			
		||||
    IRQ  QSPI_IRQHandler
 | 
			
		||||
    IRQ  CRYPTOCELL_IRQHandler
 | 
			
		||||
    IRQ  PWM3_IRQHandler
 | 
			
		||||
    IRQ  SPIM3_IRQHandler
 | 
			
		||||
 | 
			
		||||
  .end
 | 
			
		||||
							
								
								
									
										256
									
								
								nRF5_SDK_11.0.0_89a8197/components/toolchain/system_nrf52840.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										256
									
								
								nRF5_SDK_11.0.0_89a8197/components/toolchain/system_nrf52840.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,256 @@
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
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_nrf52840.h"
 | 
			
		||||
 | 
			
		||||
/*lint ++flb "Enter library region" */
 | 
			
		||||
 | 
			
		||||
#define __SYSTEM_CLOCK_64M      (64000000UL)
 | 
			
		||||
 | 
			
		||||
static bool errata_36(void);
 | 
			
		||||
static bool errata_66(void);
 | 
			
		||||
static bool errata_98(void);
 | 
			
		||||
static bool errata_103(void);
 | 
			
		||||
static bool errata_115(void);
 | 
			
		||||
static bool errata_120(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_P1->PIN_CNF[0] = (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[7]  = (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_P1->PIN_CNF[0]  = (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[12] = (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[11] = (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_P1->PIN_CNF[9]  = (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 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 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 98 "NFCT: Not able to communicate with the peer" found at the Errata document
 | 
			
		||||
       for your device located at https://infocenter.nordicsemi.com/  */
 | 
			
		||||
    if (errata_98()){
 | 
			
		||||
        *(volatile uint32_t *)0x4000568Cul = 0x00038148ul;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    /* Workaround for Errata 103 "CCM: Wrong reset value of CCM MAXPACKETSIZE" found at the Errata document
 | 
			
		||||
       for your device located at https://infocenter.nordicsemi.com/  */
 | 
			
		||||
    if (errata_103()){
 | 
			
		||||
        NRF_CCM->MAXPACKETSIZE = 0xFBul;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    /* Workaround for Errata 115 "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_115()){
 | 
			
		||||
        *(volatile uint32_t *)0x40000EE4 = (*(volatile uint32_t *)0x40000EE4 & 0xFFFFFFF0) | (*(uint32_t *)0x10000258 & 0x0000000F);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    /* Workaround for Errata 120 "QSPI: Data read or written is corrupted" found at the Errata document
 | 
			
		||||
       for your device located at https://infocenter.nordicsemi.com/  */
 | 
			
		||||
    if (errata_120()){
 | 
			
		||||
        *(volatile uint32_t *)0x40029640ul = 0x200ul;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    /* 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] = 18;
 | 
			
		||||
            while (NRF_NVMC->READY == NVMC_READY_READY_Busy){}
 | 
			
		||||
            NRF_UICR->PSELRESET[1] = 18;
 | 
			
		||||
            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();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static bool errata_36(void)
 | 
			
		||||
{
 | 
			
		||||
    if ((*(uint32_t *)0x10000130ul == 0x8ul) && (*(uint32_t *)0x10000134ul == 0x0ul)){
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static bool errata_66(void)
 | 
			
		||||
{
 | 
			
		||||
    if ((*(uint32_t *)0x10000130ul == 0x8ul) && (*(uint32_t *)0x10000134ul == 0x0ul)){
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static bool errata_98(void)
 | 
			
		||||
{
 | 
			
		||||
    if ((*(uint32_t *)0x10000130ul == 0x8ul) && (*(uint32_t *)0x10000134ul == 0x0ul)){
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static bool errata_103(void)
 | 
			
		||||
{
 | 
			
		||||
    if ((*(uint32_t *)0x10000130ul == 0x8ul) && (*(uint32_t *)0x10000134ul == 0x0ul)){
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static bool errata_115(void)
 | 
			
		||||
{
 | 
			
		||||
    if ((*(uint32_t *)0x10000130ul == 0x8ul) && (*(uint32_t *)0x10000134ul == 0x0ul)){
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static bool errata_120(void)
 | 
			
		||||
{
 | 
			
		||||
    if ((*(uint32_t *)0x10000130ul == 0x8ul) && (*(uint32_t *)0x10000134ul == 0x0ul)){
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static bool errata_136(void)
 | 
			
		||||
{
 | 
			
		||||
    if ((*(uint32_t *)0x10000130ul == 0x8ul) && (*(uint32_t *)0x10000134ul == 0x0ul)){
 | 
			
		||||
        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_NRF52840_H
 | 
			
		||||
#define SYSTEM_NRF52840_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_NRF52840_H */
 | 
			
		||||
		Reference in New Issue
	
	Block a user