111 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
		
		
			
		
	
	
			111 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
|   | /***************************************************************************** | ||
|  |  *                   SEGGER Microcontroller GmbH & Co. KG                    * | ||
|  |  *            Solutions for real time microcontroller applications           * | ||
|  |  ***************************************************************************** | ||
|  |  *                                                                           * | ||
|  |  *               (c) 2017 SEGGER Microcontroller GmbH & Co. KG               * | ||
|  |  *                                                                           * | ||
|  |  *           Internet: www.segger.com   Support: support@segger.com          *
 | ||
|  |  *                                                                           * | ||
|  |  *****************************************************************************/ | ||
|  | 
 | ||
|  | /***************************************************************************** | ||
|  |  *                         Preprocessor Definitions                          * | ||
|  |  *                         ------------------------                          * | ||
|  |  * NO_STACK_INIT                                                             * | ||
|  |  *                                                                           * | ||
|  |  *   If defined, the stack pointer will not be initialised.                  * | ||
|  |  *                                                                           * | ||
|  |  * NO_SYSTEM_INIT                                                            * | ||
|  |  *                                                                           * | ||
|  |  *   If defined, the SystemInit() function will not be called. By default    * | ||
|  |  *   SystemInit() is called after reset to enable the clocks and memories to * | ||
|  |  *   be initialised prior to any C startup initialisation.                   * | ||
|  |  *                                                                           * | ||
|  |  * NO_VTOR_CONFIG                                                            * | ||
|  |  *                                                                           * | ||
|  |  *   If defined, the vector table offset register will not be configured.    * | ||
|  |  *                                                                           * | ||
|  |  * MEMORY_INIT                                                               * | ||
|  |  *                                                                           * | ||
|  |  *   If defined, the MemoryInit() function will be called. By default        * | ||
|  |  *   MemoryInit() is called after SystemInit() to enable an external memory  * | ||
|  |  *   controller.                                                             * | ||
|  |  *                                                                           * | ||
|  |  * STACK_INIT_VAL                                                            * | ||
|  |  *                                                                           * | ||
|  |  *   If defined, specifies the initial stack pointer value. If undefined,    * | ||
|  |  *   the stack pointer will be initialised to point to the end of the        * | ||
|  |  *   RAM segment.                                                            * | ||
|  |  *                                                                           * | ||
|  |  * VECTORS_IN_RAM                                                            * | ||
|  |  *                                                                           * | ||
|  |  *   If defined, the exception vectors will be copied from Flash to RAM.     * | ||
|  |  *                                                                           * | ||
|  |  *****************************************************************************/ | ||
|  | 
 | ||
|  |   .syntax unified
 | ||
|  | 
 | ||
|  |   .global Reset_Handler
 | ||
|  |   .extern _vectors
 | ||
|  | 
 | ||
|  |   .section .init, "ax" | ||
|  |   .thumb_func | ||
|  | 
 | ||
|  |   .equ VTOR_REG, 0xE000ED08 | ||
|  | 
 | ||
|  | #ifndef STACK_INIT_VAL | ||
|  | #define STACK_INIT_VAL __RAM_segment_end__ | ||
|  | #endif | ||
|  | 
 | ||
|  | Reset_Handler: | ||
|  | #ifndef NO_STACK_INIT | ||
|  |   /* Initialise main stack */ | ||
|  |   ldr r0, =STACK_INIT_VAL | ||
|  |   bic r0, #0x7 | ||
|  |   mov sp, r0 | ||
|  | #endif | ||
|  | 
 | ||
|  | #ifndef NO_SYSTEM_INIT | ||
|  |   /* Initialise system */ | ||
|  |   ldr r0, =SystemInit | ||
|  |   blx r0 | ||
|  | #endif | ||
|  | 
 | ||
|  | #ifdef MEMORY_INIT | ||
|  |   ldr r0, =MemoryInit | ||
|  |   blx r0 | ||
|  | #endif | ||
|  | 
 | ||
|  | #ifdef VECTORS_IN_RAM | ||
|  |   /* Copy exception vectors into RAM */ | ||
|  |   ldr r0, =__vectors_start__ | ||
|  |   ldr r1, =__vectors_end__ | ||
|  |   ldr r2, =__vectors_ram_start__ | ||
|  | 1: | ||
|  |   cmp r0, r1 | ||
|  |   beq 2f | ||
|  |   ldr r3, [r0] | ||
|  |   str r3, [r2] | ||
|  |   adds r0, r0, #4 | ||
|  |   adds r2, r2, #4 | ||
|  |   b 1b | ||
|  | 2: | ||
|  | #endif | ||
|  | 
 | ||
|  | #ifndef NO_VTOR_CONFIG | ||
|  |   /* Configure vector table offset register */ | ||
|  |   ldr r0, =VTOR_REG | ||
|  | #ifdef VECTORS_IN_RAM | ||
|  |   ldr r1, =_vectors_ram | ||
|  | #else | ||
|  |   ldr r1, =_vectors | ||
|  | #endif | ||
|  |   str r1, [r0] | ||
|  | #endif | ||
|  | 
 | ||
|  |   /* Jump to program start */ | ||
|  |   b _start | ||
|  | 
 | ||
|  | 
 |