[6] | 1 | /********************************************************************* |
---|
| 2 | * SEGGER Microcontroller GmbH * |
---|
| 3 | * The Embedded Experts * |
---|
| 4 | ********************************************************************** |
---|
| 5 | * * |
---|
| 6 | * (c) 2014 - 2019 SEGGER Microcontroller GmbH * |
---|
| 7 | * * |
---|
| 8 | * www.segger.com Support: support@segger.com * |
---|
| 9 | * * |
---|
| 10 | ********************************************************************** |
---|
| 11 | * * |
---|
| 12 | * All rights reserved. * |
---|
| 13 | * * |
---|
| 14 | * Redistribution and use in source and binary forms, with or * |
---|
| 15 | * without modification, are permitted provided that the following * |
---|
| 16 | * conditions are met: * |
---|
| 17 | * * |
---|
| 18 | * - Redistributions of source code must retain the above copyright * |
---|
| 19 | * notice, this list of conditions and the following disclaimer. * |
---|
| 20 | * * |
---|
| 21 | * - Neither the name of SEGGER Microcontroller GmbH * |
---|
| 22 | * nor the names of its contributors may be used to endorse or * |
---|
| 23 | * promote products derived from this software without specific * |
---|
| 24 | * prior written permission. * |
---|
| 25 | * * |
---|
| 26 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * |
---|
| 27 | * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * |
---|
| 28 | * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * |
---|
| 29 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * |
---|
| 30 | * DISCLAIMED. * |
---|
| 31 | * IN NO EVENT SHALL SEGGER Microcontroller GmbH BE LIABLE FOR * |
---|
| 32 | * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * |
---|
| 33 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * |
---|
| 34 | * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * |
---|
| 35 | * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * |
---|
| 36 | * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * |
---|
| 37 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * |
---|
| 38 | * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * |
---|
| 39 | * DAMAGE. * |
---|
| 40 | * * |
---|
| 41 | *********************************************************************/ |
---|
| 42 | |
---|
| 43 | /***************************************************************************** |
---|
| 44 | * Preprocessor Definitions * |
---|
| 45 | * ------------------------ * |
---|
| 46 | * NO_STACK_INIT * |
---|
| 47 | * * |
---|
| 48 | * If defined, the stack pointer will not be initialised. * |
---|
| 49 | * * |
---|
| 50 | * NO_SYSTEM_INIT * |
---|
| 51 | * * |
---|
| 52 | * If defined, the SystemInit() function will not be called. By default * |
---|
| 53 | * SystemInit() is called after reset to enable the clocks and memories to * |
---|
| 54 | * be initialised prior to any C startup initialisation. * |
---|
| 55 | * * |
---|
| 56 | * NO_VTOR_CONFIG * |
---|
| 57 | * * |
---|
| 58 | * If defined, the vector table offset register will not be configured. * |
---|
| 59 | * * |
---|
| 60 | * MEMORY_INIT * |
---|
| 61 | * * |
---|
| 62 | * If defined, the MemoryInit() function will be called. By default * |
---|
| 63 | * MemoryInit() is called after SystemInit() to enable an external memory * |
---|
| 64 | * controller. * |
---|
| 65 | * * |
---|
| 66 | * STACK_INIT_VAL * |
---|
| 67 | * * |
---|
| 68 | * If defined, specifies the initial stack pointer value. If undefined, * |
---|
| 69 | * the stack pointer will be initialised to point to the end of the * |
---|
| 70 | * RAM segment. * |
---|
| 71 | * * |
---|
| 72 | * VECTORS_IN_RAM * |
---|
| 73 | * * |
---|
| 74 | * If defined, the exception vectors will be copied from Flash to RAM. * |
---|
| 75 | * * |
---|
| 76 | *****************************************************************************/ |
---|
| 77 | |
---|
| 78 | .syntax unified |
---|
| 79 | |
---|
| 80 | .global Reset_Handler |
---|
| 81 | .extern _vectors |
---|
| 82 | |
---|
| 83 | .section .init, "ax" |
---|
| 84 | .thumb_func |
---|
| 85 | |
---|
| 86 | .equ VTOR_REG, 0xE000ED08 |
---|
| 87 | |
---|
| 88 | #ifndef STACK_INIT_VAL |
---|
| 89 | #define STACK_INIT_VAL __RAM_segment_end__ |
---|
| 90 | #endif |
---|
| 91 | |
---|
| 92 | Reset_Handler: |
---|
| 93 | #ifndef NO_STACK_INIT |
---|
| 94 | /* Initialize main stack */ |
---|
| 95 | ldr r0, =STACK_INIT_VAL |
---|
| 96 | ldr r1, =0x7 |
---|
| 97 | bics r0, r1 |
---|
| 98 | mov sp, r0 |
---|
| 99 | #endif |
---|
| 100 | |
---|
| 101 | #ifndef NO_SYSTEM_INIT |
---|
| 102 | /* Initialize system */ |
---|
| 103 | ldr r0, =SystemInit |
---|
| 104 | blx r0 |
---|
| 105 | .pushsection .init_array, "aw", %init_array |
---|
| 106 | .align 2 |
---|
| 107 | .word SystemCoreClockUpdate |
---|
| 108 | .popsection |
---|
| 109 | #endif |
---|
| 110 | |
---|
| 111 | #ifdef MEMORY_INIT |
---|
| 112 | ldr r0, =MemoryInit |
---|
| 113 | blx r0 |
---|
| 114 | #endif |
---|
| 115 | |
---|
| 116 | #ifdef VECTORS_IN_RAM |
---|
| 117 | /* Copy exception vectors into RAM */ |
---|
| 118 | ldr r0, =__vectors_start__ |
---|
| 119 | ldr r1, =__vectors_end__ |
---|
| 120 | ldr r2, =__vectors_ram_start__ |
---|
| 121 | 1: |
---|
| 122 | cmp r0, r1 |
---|
| 123 | beq 2f |
---|
| 124 | ldr r3, [r0] |
---|
| 125 | str r3, [r2] |
---|
| 126 | adds r0, r0, #4 |
---|
| 127 | adds r2, r2, #4 |
---|
| 128 | b 1b |
---|
| 129 | 2: |
---|
| 130 | #endif |
---|
| 131 | |
---|
| 132 | #ifndef NO_VTOR_CONFIG |
---|
| 133 | /* Configure vector table offset register */ |
---|
| 134 | ldr r0, =VTOR_REG |
---|
| 135 | #ifdef VECTORS_IN_RAM |
---|
| 136 | ldr r1, =_vectors_ram |
---|
| 137 | #else |
---|
| 138 | ldr r1, =_vectors |
---|
| 139 | #endif |
---|
| 140 | str r1, [r0] |
---|
| 141 | #endif |
---|
| 142 | |
---|
| 143 | /* Jump to program start */ |
---|
| 144 | b _start |
---|
| 145 | |
---|
| 146 | |
---|