123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- /*******************************************************************************
- *
- * Copyright 2013 - 2016, Freescale Semiconductor, Inc.
- * Copyright 2016-2019 NXP
- *
- * This software is owned or controlled by NXP and may only be used
- * strictly in accordance with the applicable license terms. By expressly
- * accepting such terms or by downloading, installing, activating and/or
- * otherwise using the software, you are agreeing that you have read, and
- * that you agree to comply with and are bound by, such license terms. If
- * you do not agree to be bound by the applicable license terms, then you
- * may not retain, install, activate or otherwise use the software.
- *
- *
- *******************************************************************************/
- #include "safety_config.h"
- #pragma section = ".data"
- #pragma section = ".data_init"
- #pragma section = ".safety_ram"
- #pragma section = ".safety_ram_init"
- #pragma section = ".bss"
- /*******************************************************************************
- * Prototypes
- ******************************************************************************/
- void common_startup(void);
- void write_vtor(int32_t);
- /*******************************************************************************
- * Code
- ******************************************************************************/
- /*!
- * @brief Initialization of RAM sections.
- *
- * @param void
- *
- * @return None
- */
- void common_startup(void)
- {
- /* Set the IVT address in SCB */
- extern uint32_t __VECTOR_TABLE[];
- write_vtor((uint32_t)__VECTOR_TABLE);
- #if (__FPU_PRESENT)
- SCB->CPACR |= ((3UL << 10*2) | (3UL << 11*2)); /* set CP10, CP11 Full Access */
- #endif
- /* Declare a counter we'll use in all of the copy loops */
- uint32_t SectionLen;
- uint32_t *data_ram;
- uint32_t *data_rom;
- uint32_t *data_rom_end;
- /* Get the addresses for the .data section (initialized data section) */
- data_ram = __section_begin(".data");
- data_rom = __section_begin(".data_init");
- data_rom_end = __section_end(".data_init");
- /* Copy initialized data from ROM to RAM */
- SectionLen = data_rom_end - data_rom; /* This case in number of adress*/
- while (SectionLen--)
- {
- *data_ram++ = *data_rom++;
- #ifdef WATCHDOG_ON
- Watchdog_refresh;
- #endif
- }
- /* Get the addresses for the .safety_ram section (initialized safety_ram section) */
- data_ram = __section_begin(".safety_ram");
- data_rom = __section_begin(".safety_ram_init");
- data_rom_end = __section_end(".safety_ram_init");
- /* Copy initialized data from ROM to RAM */
- SectionLen = data_rom_end - data_rom; /* This case in number of adress*/
- while (SectionLen--)
- {
- *data_ram++ = *data_rom++;
- #ifdef WATCHDOG_ON
- Watchdog_refresh;
- #endif
- }
- /* Get the addresses for the .bss section (zero-initialized data) */
- uint32_t *bss_start, *bss_end;
- bss_start = __section_begin(".bss");
- bss_end = __section_end(".bss");
- SectionLen = bss_end - bss_start;
- while (SectionLen--)
- {
- *bss_start++ = 0;
- #ifdef WATCHDOG_ON
- Watchdog_refresh;
- #endif
- }
- #ifdef WATCHDOG_ON
- Watchdog_refresh;
- #endif
- }
- /*!
- * @brief write to VTOR register
- *
- * @param void
- *
- * @return None
- */
- void write_vtor(int32_t vtor)
- {
- unsigned long *pVTOR = (unsigned long *)0xE000ED08;
- *pVTOR = vtor;
- }
|