view Small_CPU/Src/startup_stm32f4xx.S @ 752:4f19336a3f21

Dev Bugfix: Alignment problem in lifedata structure: Since the introduction of the 64 bit DigO2 sensor ID the potential risk of a misalignment is present in the lifedata structure. E.g. If a new 8bit variable is added in front of the data structure containing the 64bit value. To avoid this in future the sensor data structure which may contain the 64bit value has been moved to the top of the structure (first element)
author Ideenmodellierer
date Tue, 07 Mar 2023 19:51:30 +0100
parents 22864a24973b
children
line wrap: on
line source

/* File: startup_ARMCM4.S
 * Purpose: startup file for Cortex-M4 devices. Should use with
 *   GCC for ARM Embedded Processors
 * Version: V1.3
 * Date: 08 Feb 2012
 *
 * Copyright (c) 2012, 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 the ARM Limited 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 ARM LIMITED 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.
 */
    .syntax unified
    .arch armv7-m

    .section .stack
    .align 3
#ifdef __STACK_SIZE
    .equ    Stack_Size, __STACK_SIZE
#else
    .equ    Stack_Size, 0x400
#endif
    .globl    __StackTop
    .globl    __StackLimit
__StackLimit:
    .space    Stack_Size
    .size __StackLimit, . - __StackLimit
__StackTop:
    .size __StackTop, . - __StackTop

    .section .heap
    .align 3
#ifdef __HEAP_SIZE
    .equ    Heap_Size, __HEAP_SIZE
#else
    .equ    Heap_Size, 0xC00
#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         /* Reset Handler */
    .long    NMI_Handler           /* NMI Handler */
    .long    HardFault_Handler     /* Hard Fault Handler */
    .long    MemManage_Handler     /* MPU Fault Handler */
    .long    BusFault_Handler      /* Bus Fault Handler */
    .long    UsageFault_Handler    /* Usage Fault Handler */
    .long    0                     /* Reserved */
    .long    0                     /* Reserved */
    .long    0                     /* Reserved */
    .long    0                     /* Reserved */
    .long    SVC_Handler           /* SVCall Handler */
    .long    DebugMon_Handler      /* Debug Monitor Handler */
    .long    0                     /* Reserved */
    .long    PendSV_Handler        /* PendSV Handler */
    .long    SysTick_Handler       /* SysTick Handler */

                // External Interrupts
    .long    WWDG_IRQHandler                   // Window WatchDog
    .long    PVD_IRQHandler                    // PVD through EXTI Line detection
    .long    TAMP_STAMP_IRQHandler             // Tamper and TimeStamps through the EXTI line
    .long    RTC_WKUP_IRQHandler               // RTC Wakeup through the EXTI line
    .long    FLASH_IRQHandler                  // FLASH
    .long    RCC_IRQHandler                    // RCC
    .long    EXTI0_IRQHandler                  // EXTI Line0
    .long    EXTI1_IRQHandler                  // EXTI Line1
    .long    EXTI2_IRQHandler                  // EXTI Line2
    .long    EXTI3_IRQHandler                  // EXTI Line3
    .long    EXTI4_IRQHandler                  // EXTI Line4
    .long    DMA1_Stream0_IRQHandler           // DMA1 Stream 0
    .long    DMA1_Stream1_IRQHandler           // DMA1 Stream 1
    .long    DMA1_Stream2_IRQHandler           // DMA1 Stream 2
    .long    DMA1_Stream3_IRQHandler           // DMA1 Stream 3
    .long    DMA1_Stream4_IRQHandler           // DMA1 Stream 4
    .long    DMA1_Stream5_IRQHandler           // DMA1 Stream 5
    .long    DMA1_Stream6_IRQHandler           // DMA1 Stream 6
    .long    ADC_IRQHandler                    // ADC1, ADC2 and ADC3s
    .long    CAN1_TX_IRQHandler                // CAN1 TX
    .long    CAN1_RX0_IRQHandler               // CAN1 RX0
    .long    CAN1_RX1_IRQHandler               // CAN1 RX1
    .long    CAN1_SCE_IRQHandler               // CAN1 SCE
    .long    EXTI9_5_IRQHandler                // External Line[9:5]s
    .long    TIM1_BRK_TIM9_IRQHandler          // TIM1 Break and TIM9
    .long    TIM1_UP_TIM10_IRQHandler          // TIM1 Update and TIM10
    .long    TIM1_TRG_COM_TIM11_IRQHandler     // TIM1 Trigger and Commutation and TIM11
    .long    TIM1_CC_IRQHandler                // TIM1 Capture Compare
    .long    TIM2_IRQHandler                   // TIM2
    .long    TIM3_IRQHandler                   // TIM3
    .long    TIM4_IRQHandler                   // TIM4
    .long    I2C1_EV_IRQHandler                // I2C1 Event
    .long    I2C1_ER_IRQHandler                // I2C1 Error
    .long    I2C2_EV_IRQHandler                // I2C2 Event
    .long    I2C2_ER_IRQHandler                // I2C2 Error
    .long    SPI1_IRQHandler                   // SPI1
    .long    SPI2_IRQHandler                   // SPI2
    .long    USART1_IRQHandler                 // USART1
    .long    USART2_IRQHandler                 // USART2
    .long    USART3_IRQHandler                 // USART3
    .long    EXTI15_10_IRQHandler              // External Line[15:10]s
    .long    RTC_Alarm_IRQHandler              // RTC Alarm (A and B) through EXTI Line
    .long    OTG_FS_WKUP_IRQHandler            // USB OTG FS Wakeup through EXTI line
    .long    TIM8_BRK_TIM12_IRQHandler         // TIM8 Break and TIM12
    .long    TIM8_UP_TIM13_IRQHandler          // TIM8 Update and TIM13
    .long    TIM8_TRG_COM_TIM14_IRQHandler     // TIM8 Trigger and Commutation and TIM14
    .long    TIM8_CC_IRQHandler                // TIM8 Capture Compare
    .long    DMA1_Stream7_IRQHandler           // DMA1 Stream7
    .long    FSMC_IRQHandler                   // FSMC
    .long    SDIO_IRQHandler                   // SDIO
    .long    TIM5_IRQHandler                   // TIM5
    .long    SPI3_IRQHandler                   // SPI3
    .long    UART4_IRQHandler                  // UART4
    .long    UART5_IRQHandler                  // UART5
    .long    TIM6_DAC_IRQHandler               // TIM6 and DAC1&2 underrun errors
    .long    TIM7_IRQHandler                   // TIM7
    .long    DMA2_Stream0_IRQHandler           // DMA2 Stream 0
    .long    DMA2_Stream1_IRQHandler           // DMA2 Stream 1
    .long    DMA2_Stream2_IRQHandler           // DMA2 Stream 2
    .long    DMA2_Stream3_IRQHandler           // DMA2 Stream 3
    .long    DMA2_Stream4_IRQHandler           // DMA2 Stream 4
    .long    ETH_IRQHandler                    // Ethernet
    .long    ETH_WKUP_IRQHandler               // Ethernet Wakeup through EXTI line
    .long    CAN2_TX_IRQHandler                // CAN2 TX
    .long    CAN2_RX0_IRQHandler               // CAN2 RX0
    .long    CAN2_RX1_IRQHandler               // CAN2 RX1
    .long    CAN2_SCE_IRQHandler               // CAN2 SCE
    .long    OTG_FS_IRQHandler                 // USB OTG FS
    .long    DMA2_Stream5_IRQHandler           // DMA2 Stream 5
    .long    DMA2_Stream6_IRQHandler           // DMA2 Stream 6
    .long    DMA2_Stream7_IRQHandler           // DMA2 Stream 7
    .long    USART6_IRQHandler                 // USART6
    .long    I2C3_EV_IRQHandler                // I2C3 event
    .long    I2C3_ER_IRQHandler                // I2C3 error
    .long    OTG_HS_EP1_OUT_IRQHandler         // USB OTG HS End Point 1 Out
    .long    OTG_HS_EP1_IN_IRQHandler          // USB OTG HS End Point 1 In
    .long    OTG_HS_WKUP_IRQHandler            // USB OTG HS Wakeup through EXTI
    .long    OTG_HS_IRQHandler                 // USB OTG HS
    .long    DCMI_IRQHandler                   // DCMI
    .long    CRYP_IRQHandler                   // CRYP crypto
    .long    HASH_RNG_IRQHandler               // Hash and Rng
    .long    FPU_IRQHandler                    // FPU

    .size    __isr_vector, . - __isr_vector

    .text
    .thumb
    .thumb_func
    .align 2
    .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 evaluated in
 *      linker script.
 *      __etext: End of code section, i.e., begin of data sections to copy from.
 *      __data_start__/__data_end__: RAM address range that data should be
 *      copied to. Both must be aligned to 4 bytes boundary.  */

    ldr    r1, =_sidata /*__etext*/
    ldr    r2, =__data_start__
    ldr    r3, =__data_end__

#if 1
/* Here are two copies of loop implemenations. First one favors code size
 * and the second one favors performance. Default uses the first one.
 * Change to "#if 0" to use the second one */
.flash_to_ram_loop:
    cmp     r2, r3
    ittt    lt
    ldrlt   r0, [r1], #4
    strlt   r0, [r2], #4
    blt    .flash_to_ram_loop
#else
    subs    r3, r2
    ble    .flash_to_ram_loop_end
.flash_to_ram_loop:
    subs    r3, #4
    ldr    r0, [r1, r3]
    str    r0, [r2, r3]
    bgt    .flash_to_ram_loop
.flash_to_ram_loop_end:
#endif

#ifndef __NO_SYSTEM_INIT
    ldr    r0, =SystemInit
    blx    r0
#endif

    ldr    r0, =_start
    bx    r0
    .pool
    .size Reset_Handler, . - Reset_Handler

/* Our weak _start alternative if we don't use the library _start
 * The zero init section must be cleared, otherwise the librtary is
 * doing that */
    .align 1
    .thumb_func
    .weak _start
    .type _start, %function
_start:

    /* Zero fill the bss segment. */
    ldr   r1, = __bss_start__
    ldr   r2, = __bss_end__
    movs  r3, #0
    b  .fill_zero_bss
.loop_zero_bss:
    str  r3, [r1], #4

.fill_zero_bss:
    cmp  r1, r2
    bcc  .loop_zero_bss

    /* Jump to our main */
    bl main
    b .
    .size    _start, . - _start

/*    Macro to define default handlers. Default handler
 *    will be weak symbol and just dead loops. They can be
 *    overwritten by other handlers */
    .macro    def_irq_handler    handler_name
    .align 1
    .thumb_func
    .weak    \handler_name
    .type    \handler_name, %function
\handler_name :
    b    .
    .size    \handler_name, . - \handler_name
    .endm

    def_irq_handler    NMI_Handler
    def_irq_handler    HardFault_Handler
    def_irq_handler    MemManage_Handler
    def_irq_handler    BusFault_Handler
    def_irq_handler    UsageFault_Handler
    def_irq_handler    SVC_Handler
    def_irq_handler    DebugMon_Handler
    def_irq_handler    PendSV_Handler
    def_irq_handler    SysTick_Handler
    def_irq_handler    Default_Handler

                // External Interrupts
    def_irq_handler    WWDG_IRQHandler                   // Window WatchDog
    def_irq_handler    PVD_IRQHandler                    // PVD through EXTI Line detection
    def_irq_handler    TAMP_STAMP_IRQHandler             // Tamper and TimeStamps through the EXTI line
    def_irq_handler    RTC_WKUP_IRQHandler               // RTC Wakeup through the EXTI line
    def_irq_handler    FLASH_IRQHandler                  // FLASH
    def_irq_handler    RCC_IRQHandler                    // RCC
    def_irq_handler    EXTI0_IRQHandler                  // EXTI Line0
    def_irq_handler    EXTI1_IRQHandler                  // EXTI Line1
    def_irq_handler    EXTI2_IRQHandler                  // EXTI Line2
    def_irq_handler    EXTI3_IRQHandler                  // EXTI Line3
    def_irq_handler    EXTI4_IRQHandler                  // EXTI Line4
    def_irq_handler    DMA1_Stream0_IRQHandler           // DMA1 Stream 0
    def_irq_handler    DMA1_Stream1_IRQHandler           // DMA1 Stream 1
    def_irq_handler    DMA1_Stream2_IRQHandler           // DMA1 Stream 2
    def_irq_handler    DMA1_Stream3_IRQHandler           // DMA1 Stream 3
    def_irq_handler    DMA1_Stream4_IRQHandler           // DMA1 Stream 4
    def_irq_handler    DMA1_Stream5_IRQHandler           // DMA1 Stream 5
    def_irq_handler    DMA1_Stream6_IRQHandler           // DMA1 Stream 6
    def_irq_handler    ADC_IRQHandler                    // ADC1, ADC2 and ADC3s
    def_irq_handler    CAN1_TX_IRQHandler                // CAN1 TX
    def_irq_handler    CAN1_RX0_IRQHandler               // CAN1 RX0
    def_irq_handler    CAN1_RX1_IRQHandler               // CAN1 RX1
    def_irq_handler    CAN1_SCE_IRQHandler               // CAN1 SCE
    def_irq_handler    EXTI9_5_IRQHandler                // External Line[9:5]s
    def_irq_handler    TIM1_BRK_TIM9_IRQHandler          // TIM1 Break and TIM9
    def_irq_handler    TIM1_UP_TIM10_IRQHandler          // TIM1 Update and TIM10
    def_irq_handler    TIM1_TRG_COM_TIM11_IRQHandler     // TIM1 Trigger and Commutation and TIM11
    def_irq_handler    TIM1_CC_IRQHandler                // TIM1 Capture Compare
    def_irq_handler    TIM2_IRQHandler                   // TIM2
    def_irq_handler    TIM3_IRQHandler                   // TIM3
    def_irq_handler    TIM4_IRQHandler                   // TIM4
    def_irq_handler    I2C1_EV_IRQHandler                // I2C1 Event
    def_irq_handler    I2C1_ER_IRQHandler                // I2C1 Error
    def_irq_handler    I2C2_EV_IRQHandler                // I2C2 Event
    def_irq_handler    I2C2_ER_IRQHandler                // I2C2 Error
    def_irq_handler    SPI1_IRQHandler                   // SPI1
    def_irq_handler    SPI2_IRQHandler                   // SPI2
    def_irq_handler    USART1_IRQHandler                 // USART1
    def_irq_handler    USART2_IRQHandler                 // USART2
    def_irq_handler    USART3_IRQHandler                 // USART3
    def_irq_handler    EXTI15_10_IRQHandler              // External Line[15:10]s
    def_irq_handler    RTC_Alarm_IRQHandler              // RTC Alarm (A and B) through EXTI Line
    def_irq_handler    OTG_FS_WKUP_IRQHandler            // USB OTG FS Wakeup through EXTI line
    def_irq_handler    TIM8_BRK_TIM12_IRQHandler         // TIM8 Break and TIM12
    def_irq_handler    TIM8_UP_TIM13_IRQHandler          // TIM8 Update and TIM13
    def_irq_handler    TIM8_TRG_COM_TIM14_IRQHandler     // TIM8 Trigger and Commutation and TIM14
    def_irq_handler    TIM8_CC_IRQHandler                // TIM8 Capture Compare
    def_irq_handler    DMA1_Stream7_IRQHandler           // DMA1 Stream7
    def_irq_handler    FSMC_IRQHandler                   // FSMC
    def_irq_handler    SDIO_IRQHandler                   // SDIO
    def_irq_handler    TIM5_IRQHandler                   // TIM5
    def_irq_handler    SPI3_IRQHandler                   // SPI3
    def_irq_handler    UART4_IRQHandler                  // UART4
    def_irq_handler    UART5_IRQHandler                  // UART5
    def_irq_handler    TIM6_DAC_IRQHandler               // TIM6 and DAC1&2 underrun errors
    def_irq_handler    TIM7_IRQHandler                   // TIM7
    def_irq_handler    DMA2_Stream0_IRQHandler           // DMA2 Stream 0
    def_irq_handler    DMA2_Stream1_IRQHandler           // DMA2 Stream 1
    def_irq_handler    DMA2_Stream2_IRQHandler           // DMA2 Stream 2
    def_irq_handler    DMA2_Stream3_IRQHandler           // DMA2 Stream 3
    def_irq_handler    DMA2_Stream4_IRQHandler           // DMA2 Stream 4
    def_irq_handler    ETH_IRQHandler                    // Ethernet
    def_irq_handler    ETH_WKUP_IRQHandler               // Ethernet Wakeup through EXTI line
    def_irq_handler    CAN2_TX_IRQHandler                // CAN2 TX
    def_irq_handler    CAN2_RX0_IRQHandler               // CAN2 RX0
    def_irq_handler    CAN2_RX1_IRQHandler               // CAN2 RX1
    def_irq_handler    CAN2_SCE_IRQHandler               // CAN2 SCE
    def_irq_handler    OTG_FS_IRQHandler                 // USB OTG FS
    def_irq_handler    DMA2_Stream5_IRQHandler           // DMA2 Stream 5
    def_irq_handler    DMA2_Stream6_IRQHandler           // DMA2 Stream 6
    def_irq_handler    DMA2_Stream7_IRQHandler           // DMA2 Stream 7
    def_irq_handler    USART6_IRQHandler                 // USART6
    def_irq_handler    I2C3_EV_IRQHandler                // I2C3 event
    def_irq_handler    I2C3_ER_IRQHandler                // I2C3 error
    def_irq_handler    OTG_HS_EP1_OUT_IRQHandler         // USB OTG HS End Point 1 Out
    def_irq_handler    OTG_HS_EP1_IN_IRQHandler          // USB OTG HS End Point 1 In
    def_irq_handler    OTG_HS_WKUP_IRQHandler            // USB OTG HS Wakeup through EXTI
    def_irq_handler    OTG_HS_IRQHandler                 // USB OTG HS
    def_irq_handler    DCMI_IRQHandler                   // DCMI
    def_irq_handler    CRYP_IRQHandler                   // CRYP crypto
    def_irq_handler    HASH_RNG_IRQHandler               // Hash and Rng
    def_irq_handler    FPU_IRQHandler                    // FPU

    .end