rt-thread-official/bsp/imxrt/libraries/MIMXRT1020/MIMXRT1021/iar/startup_iar.c

118 lines
3.3 KiB
C

/*******************************************************************************
*
* 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;
}