/****************************************************************************** * @file startup_MK8000.c * @brief CMSIS-Core(M) Device Startup File for MK8000 * @version V2.0.3 * @date 31. March 2020 ******************************************************************************/ /* * Copyright (c) 2009-2020 Arm Limited. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the License); you may * not use this file except in compliance with the License. * You may obtain a copy of the License at * * www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an AS IS BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "MK800X.h" /*---------------------------------------------------------------------------- External References *----------------------------------------------------------------------------*/ extern uint32_t __INITIAL_SP; #ifndef STD_LIBC extern void update_libc_rom_table(void); #endif #if defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) extern __NO_RETURN void __PROGRAM_START(void); #endif const struct BOOT_DESC_T mk_boot_desc = { .header_marker = BOOT_HEADER_MARKER, .boot_flag = APP_BOOT_FLAG, #if defined(XIP_EN) .boot_addr = FLASH_BASE, #else .boot_addr = SRAM_BASE, #endif .cpc = APP_CPC, .image_len = (uint32_t)&mk_boot_desc, .image_crc = 0, .image_ver = APP_VERSION, .code_crc = 0, #if SECURE_EN .image_sig = {0}, #endif .isp_unprotect_pw = {0}, .isp_backdoor_pw = {0}, .copy_len = (uint32_t)&mk_build_inf + sizeof(mk_build_inf), .crc = 0, }; #if defined(__GNUC__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wdate-time" #endif const char mk_build_inf[80] = "\n" "Vendor\t: " "MKSEMI" "\n" "Chip\t: " "MK8000" "\n" "Date\t: " __DATE__ "\n" "Version\t: " FIRMWARE_VERSION "\0"; #if defined(__GNUC__) #pragma GCC diagnostic pop #endif /*---------------------------------------------------------------------------- Internal References *----------------------------------------------------------------------------*/ __NO_RETURN void Reset_Handler(void); __NO_RETURN void Default_Handler(void); /*---------------------------------------------------------------------------- Exception / Interrupt Handler *----------------------------------------------------------------------------*/ /* Exceptions */ void NMI_Handler(void) __attribute__((weak, alias("Default_Handler"))); void HardFault_Handler(void) __attribute__((weak, alias("Default_Handler"))); void SVC_Handler(void) __attribute__((weak, alias("Default_Handler"))); void PendSV_Handler(void) __attribute__((weak, alias("Default_Handler"))); void SysTick_Handler(void) __attribute__((weak, alias("Default_Handler"))); void BOD_IRQHandler(void) __attribute__((weak, alias("Default_Handler"))); void ACMP0_IRQHandler(void) __attribute__((weak, alias("Default_Handler"))); void ACMP1_IRQHandler(void) __attribute__((weak, alias("Default_Handler"))); void DMA_IRQHandler(void) __attribute__((weak, alias("Default_Handler"))); void SLEEP_TIMER_IRQHandler(void) __attribute__((weak, alias("Default_Handler"))); void MAC_IRQHandler(void) __attribute__((weak, alias("Default_Handler"))); void PHY_IRQHandler(void) __attribute__((weak, alias("Default_Handler"))); void GPIO_IRQHandler(void) __attribute__((weak, alias("Default_Handler"))); void AES_IRQHandler(void) __attribute__((weak, alias("Default_Handler"))); void ADC_IRQHandler(void) __attribute__((weak, alias("Default_Handler"))); void TRNG_IRQHandler(void) __attribute__((weak, alias("Default_Handler"))); void FLASH_CTRL_IRQHandler(void) __attribute__((weak, alias("Default_Handler"))); void LSP_IRQHandler(void) __attribute__((weak, alias("Default_Handler"))); void WDT_IRQHandler(void) __attribute__((weak, alias("Default_Handler"))); void RTC_ALARM_IRQHandler(void) __attribute__((weak, alias("Default_Handler"))); void RTC_TICK_IRQHandler(void) __attribute__((weak, alias("Default_Handler"))); void PWM_IRQHandler(void) __attribute__((weak, alias("Default_Handler"))); void TIMER0_IRQHandler(void) __attribute__((weak, alias("Default_Handler"))); void TIMER1_IRQHandler(void) __attribute__((weak, alias("Default_Handler"))); void TIMER2_IRQHandler(void) __attribute__((weak, alias("Default_Handler"))); void TIMER3_IRQHandler(void) __attribute__((weak, alias("Default_Handler"))); void I2C0_IRQHandler(void) __attribute__((weak, alias("Default_Handler"))); void SPI0_IRQHandler(void) __attribute__((weak, alias("Default_Handler"))); void SPI1_IRQHandler(void) __attribute__((weak, alias("Default_Handler"))); void UART0_IRQHandler(void) __attribute__((weak, alias("Default_Handler"))); void UART1_IRQHandler(void) __attribute__((weak, alias("Default_Handler"))); void CALIB_IRQHandler(void) __attribute__((weak, alias("Default_Handler"))); void RCO32K_CAL_IRQHandler(void) __attribute__((weak, alias("Default_Handler"))); void WAKEUP_IRQHandler(void) __attribute__((weak, alias("Default_Handler"))); void PHY_TIMER_IRQHandler(void) __attribute__((weak, alias("Default_Handler"))); /*---------------------------------------------------------------------------- Exception / Interrupt Vector table *----------------------------------------------------------------------------*/ #if defined(__GNUC__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wpedantic" #endif extern const VECTOR_TABLE_Type __VECTOR_TABLE[48]; const VECTOR_TABLE_Type __VECTOR_TABLE[48] __VECTOR_TABLE_ATTRIBUTE = { (VECTOR_TABLE_Type)(&__INITIAL_SP), /* Initial Stack Pointer */ Reset_Handler, /* Reset Handler */ NMI_Handler, /* -14 NMI Handler */ HardFault_Handler, /* -13 Hard Fault Handler */ 0, /* Reserved */ 0, /* Reserved */ 0, /* Reserved */ 0, /* Reserved */ 0, /* Reserved */ (VECTOR_TABLE_Type)((uint32_t)&mk_boot_desc), /* Pointer of boot descriptor */ (VECTOR_TABLE_Type)((uint32_t)&mk_build_inf), /* Pointer of build information */ SVC_Handler, /* -5 SVCall Handler */ 0, /* Reserved */ 0, /* Reserved */ PendSV_Handler, /* -2 PendSV Handler */ SysTick_Handler, /* -1 SysTick Handler */ /* Interrupts */ BOD_IRQHandler, /* 0 BOD */ ACMP0_IRQHandler, /* 1 ACMP0 */ ACMP1_IRQHandler, /* 2 ACMP1 */ SLEEP_TIMER_IRQHandler, /* 3 SLEEP_TIMER */ MAC_IRQHandler, /* 4 MAC */ PHY_IRQHandler, /* 5 PHY */ DMA_IRQHandler, /* 6 DMA */ GPIO_IRQHandler, /* 7 GPIO */ AES_IRQHandler, /* 8 AES */ ADC_IRQHandler, /* 9 ADC */ TRNG_IRQHandler, /* 10 TRNG */ FLASH_CTRL_IRQHandler, /* 11 FLASH_CTRL */ LSP_IRQHandler, /* 12 LSP */ WDT_IRQHandler, /* 13 WDT */ RTC_ALARM_IRQHandler, /* 14 RTC ALARM */ RTC_TICK_IRQHandler, /* 15 RTC TICK */ PWM_IRQHandler, /* 16 PWM */ TIMER0_IRQHandler, /* 17 TIMER0 */ TIMER1_IRQHandler, /* 18 TIMER1 */ TIMER2_IRQHandler, /* 19 TIMER2 */ TIMER3_IRQHandler, /* 20 TIMER3 */ I2C0_IRQHandler, /* 21 I2C0 */ SPI0_IRQHandler, /* 22 SPI0 */ SPI1_IRQHandler, /* 23 SPI1 */ UART0_IRQHandler, /* 24 UART0 */ UART1_IRQHandler, /* 25 UART1 */ CALIB_IRQHandler, /* 26 CALIBRATION */ RCO32K_CAL_IRQHandler, /* 27 RCO32K CAL */ WAKEUP_IRQHandler, /* 28 WAKEUP */ PHY_TIMER_IRQHandler, /* 29 PHY TIMER */ /* Interrupts 30..31 are left out */ }; #if defined(__GNUC__) #pragma GCC diagnostic pop #endif /*---------------------------------------------------------------------------- Reset Handler called on controller reset *----------------------------------------------------------------------------*/ #if defined(__CC_ARM) /* ARM RVDS or Keil MDK */ __asm void start_main_asm(void) { IMPORT __PROGRAM_START; LDR R0, = __PROGRAM_START; BX R0; } #elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) /* ARM CLANG */ __NO_RETURN void start_main_asm(void) __attribute__((naked)); void start_main_asm(void) { __ASM volatile( "ldr r0, = __main\n" "bx r0\n"); } #elif defined(__ICCARM__) /* IAR */ __NO_RETURN void start_main_asm(void) __attribute__((naked)); extern void __iar_program_start(void); void start_main_asm(void) { __ASM volatile( "ldr r0, = __iar_program_start\n" "bx r0\n"); while (1) { } } #else /* GCC */ __NO_RETURN void start_main_asm(void) __attribute__((naked)); __NO_RETURN void __cmsis_start_(void) { __cmsis_start(); } void start_main_asm(void) { __ASM volatile( "ldr r0, = __cmsis_start_\n" "bx r0\n"); } #endif __NO_RETURN void Reset_Handler(void) { #if defined(XIP_EN) // Remap FLASH SYSCON->SYS_CTRL &= ~(SYSCON_SYS_CTRL_REMAP_MSK); SYSCON->SYS_CTRL |= SYSCON_SYS_CTRL_REMAP(0x02); #else // Remap SRAM SYSCON->SYS_CTRL &= ~(SYSCON_SYS_CTRL_REMAP_MSK); SYSCON->SYS_CTRL |= SYSCON_SYS_CTRL_REMAP(0x01); #endif #ifndef STD_LIBC update_libc_rom_table(); #endif SystemInit(); /* CMSIS System Initialization */ start_main_asm(); /* Enter PreMain (C library entry point) */ } /*---------------------------------------------------------------------------- Default Handler for Exceptions / Interrupts *----------------------------------------------------------------------------*/ __NO_RETURN void Default_Handler(void) { while (1) { } }