| ;/* File: startup_armv6-m.s |
| ; * Purpose: startup file for armv7-m architecture devices. |
| ; * Should be used with ARMCC |
| ; * Version: V2.00 |
| ; * Date: 16 November 2015 |
| ; * |
| ; */ |
| ;/* Copyright (c) 2011 - 2014 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. |
| ; ---------------------------------------------------------------------------*/ |
| ;/* |
| ; //-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ |
| ;*/ |
| |
| |
| ; <h> Stack Configuration |
| ; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> |
| ; </h> |
| |
| Stack_Size EQU 0x00000400 |
| |
| AREA STACK, NOINIT, READWRITE, ALIGN=3 |
| Stack_Mem SPACE Stack_Size |
| __initial_sp |
| |
| |
| ; <h> Heap Configuration |
| ; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> |
| ; </h> |
| |
| Heap_Size EQU 0x00000C00 |
| |
| AREA HEAP, NOINIT, READWRITE, ALIGN=3 |
| __heap_base |
| Heap_Mem SPACE Heap_Size |
| __heap_limit |
| |
| |
| 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 ; Reset Handler |
| DCD NMI_Handler ; NMI Handler |
| DCD HardFault_Handler ; Hard Fault Handler |
| DCD 0 ; Reserved |
| DCD 0 ; Reserved |
| DCD 0 ; Reserved |
| DCD 0 ; Reserved |
| DCD 0 ; Reserved |
| DCD 0 ; Reserved |
| DCD 0 ; Reserved |
| DCD SVC_Handler ; SVCall Handler |
| DCD 0 ; Reserved |
| DCD 0 ; Reserved |
| DCD PendSV_Handler ; PendSV Handler |
| DCD SysTick_Handler ; SysTick Handler |
| __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 |
| LDR R0, =SystemInit |
| BLX R0 |
| LDR R0, =__main |
| BX R0 |
| ENDP |
| |
| |
| ; Dummy Exception Handlers (infinite loops which can be modified) |
| |
| NMI_Handler PROC |
| EXPORT NMI_Handler [WEAK] |
| BKPT #0 |
| B . |
| ENDP |
| HardFault_Handler\ |
| PROC |
| EXPORT HardFault_Handler [WEAK] |
| BKPT #0 |
| B . |
| ENDP |
| SVC_Handler PROC |
| EXPORT SVC_Handler [WEAK] |
| B . |
| ENDP |
| PendSV_Handler PROC |
| EXPORT PendSV_Handler [WEAK] |
| B . |
| ENDP |
| SysTick_Handler PROC |
| EXPORT SysTick_Handler [WEAK] |
| B . |
| ENDP |
| |
| ALIGN |
| |
| ; User Initial Stack & Heap |
| IF :DEF:__MICROLIB |
| |
| EXPORT __initial_sp |
| EXPORT __heap_base |
| EXPORT __heap_limit |
| |
| ELSE |
| |
| IMPORT __use_two_region_memory |
| |
| ;/* |
| ; __user_setup_stackheap() returns the: |
| ; - heap base in r0 (if the program uses the heap) |
| ; - stack base in sp |
| ; - heap limit in r2 (if the program uses the heap and uses two-region memory). |
| ; */ |
| EXPORT __user_setup_stackheap |
| |
| __user_setup_stackheap PROC |
| LDR R0, = __initial_sp |
| MOV SP, R0 |
| IF Heap_Size > 0 |
| LDR R2, = __heap_limit |
| LDR R0, = __heap_base |
| ELSE |
| MOV R0, #0 |
| MOV R2, #0 |
| ENDIF |
| BX LR |
| ENDP |
| |
| |
| ;/* |
| ;__user_initial_stackheap() returns the: |
| ; - heap base in r0 |
| ; - stack base in r1, that is, the highest address in the stack region |
| ; - heap limit in r2 |
| ; - stack limit in r3, that is, the lowest address in the stack region. |
| ; */ |
| ; |
| ;/* DEPRICATED |
| ; EXPORT __user_initial_stackheap |
| ; |
| ;__user_initial_stackheap PROC |
| ; LDR R0, = Heap_Mem |
| ; LDR R1, =(Stack_Mem + Stack_Size) |
| ; LDR R2, = (Heap_Mem + Heap_Size) |
| ; LDR R3, = Stack_Mem |
| ; BX LR |
| ; ENDP |
| ; */ |
| |
| ALIGN |
| |
| ENDIF |
| |
| |
| END |