| [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 |  | 
|---|