/* * kinetis_sysinit.c - Default init routines for Flycatcher * Kinetis ARM systems * Copyright © 2012 Freescale semiConductor Inc. All Rights Reserved. */ #include "hal/derivative.h" #include "kinetis_sysinit.h" /** **=========================================================================== ** External declarations **=========================================================================== */ #if __cplusplus extern "C" { #endif extern unsigned long _estack; extern void __thumb_startup(void); #if __cplusplus } #endif /** **=========================================================================== ** Default interrupt handler **=========================================================================== */ void Default_Handler(void) { // Uncomment this breakpoint instruction if you are debugging a hard // fault during development. If this breakpoint is hit without a // debugger attached a LOCKUP is triggered. For this processor this // causes an immediate system reset. //asm volatile ("bkpt"); while(1); /* Fault registers: * 0xE000ED2C: HFSR (HardFault status register) * 0xE000ED28: MMFSR (MemManage fault status register) * 0xE000ED34: MMFAR (MemManage fault address register) * 0xE000ED29: BFSR (BusFault status register) * 0xE000ED38: BFAR (BusFault address register) */ } /* Weak definitions of handlers point to Default_Handler if not implemented */ void NMI_Handler(void) __attribute__ ((weak, alias("Default_Handler"))); void HardFault_Handler(void) __attribute__ ((weak, alias("Default_Handler"))); void MemManage_Handler(void) __attribute__ ((weak, alias("Default_Handler"))); void BusFault_Handler(void) __attribute__ ((weak, alias("Default_Handler"))); void UsageFault_Handler(void) __attribute__ ((weak, alias("Default_Handler"))); void SVC_Handler(void) __attribute__ ((weak, alias("Default_Handler"))); void DebugMon_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 DMA0_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* DMA channel 0 transfer complete interrupt */ void DMA1_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* DMA channel 1 transfer complete interrupt */ void DMA2_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* DMA channel 2 transfer complete interrupt */ void DMA3_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* DMA channel 3 transfer complete interrupt */ void DMA4_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* DMA channel 4 transfer complete interrupt */ void DMA5_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* DMA channel 5 transfer complete interrupt */ void DMA6_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* DMA channel 6 transfer complete interrupt */ void DMA7_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* DMA channel 7 transfer complete interrupt */ void DMA8_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* DMA channel 8 transfer complete interrupt */ void DMA9_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* DMA channel 9 transfer complete interrupt */ void DMA10_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* DMA channel 10 transfer complete interrupt */ void DMA11_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* DMA channel 11 transfer complete interrupt */ void DMA12_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* DMA channel 12 transfer complete interrupt */ void DMA13_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* DMA channel 13 transfer complete interrupt */ void DMA14_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* DMA channel 14 transfer complete interrupt */ void DMA15_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* DMA channel 15 transfer complete interrupt */ void DMA_Error_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* DMA error interrupt */ void MCMNormal_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* MCM normal interrupt */ void FlashCmd_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* Flash memory command complete interrupt */ void FlashReadErr_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* Flash read collision interrupt */ void LVD_LVW_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* Low Voltage Detect, Low Voltage Warning */ void LLW_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* Low Leakage Wakeup */ void Watchdog_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* WDOG or EVM interrupt (shared) */ void Reserved39_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* Reserved interrupt 39 */ void I2C0_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* I2C0 interrupt */ void I2C1_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* I2C1 interrupt */ void SPI0_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* SPI0 interrupt */ void SPI1_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* SPI1 interrupt */ void SPI2_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* SPI 2 interrupt */ void CAN0Msg_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* CAN0 message buffer (0-15) interrupt */ void CAN0BusOff_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* CAN0 Bus Off interrupt */ void CAN0Error_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* CAN0 Error interrupt */ void CAN0Xmit_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* CAN0 Transmit warning interrupt */ void CAN0Rcv_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* CAN0 Recieve warning interrupt */ void CAN0Wake_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* CAN0 Wake Up interrupt */ void I2S0_Tx_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* I2S0 transmit interrupt */ void I2S0_Rx_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* I2S0 receive interrupt */ void CAN1Msg_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* CAN1Msg interrupt */ void CAN1BusOff_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* CAN1BusOff interrupt */ void CAN1Error_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* CAN1Error interrupt */ void CAN1Xmit_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* CAN1Xmit interrupt */ void CAN1Rcv_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* CAN1Rcv interrupt */ void CAN1Wake_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* CAN1Wake interrupt */ void Reserved59_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* Reserved interrupt 59 */ void UART0_LON_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* UART0 LON interrupt */ void UART0_RX_TX_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* UART0 receive/transmit interrupt */ void UART0Error_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* UART0 error interrupt */ void UART1_RX_TX_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* UART1 receive/transmit interrupt */ void UART1Error_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* UART1 error interrupt */ void UART2_RX_TX_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* UART2 receive/transmit interrupt */ void UART2Error_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* UART2 error interrupt */ void UART3_RX_TX_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* UART3 receive/transmit interrupt */ void UART3Error_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* UART3 error interrupt */ void UART4_RX_TX_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* UART4 receive/transmit interrupt */ void UART4Error_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* UART4 error interrupt */ void Reserved71_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* Reserved interrupt 71 */ void Reserved72_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* Reserved interrupt 72 */ void ADC0_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* ADC0 interrupt */ void ADC1_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* ADC1 interrupt */ void CMP0_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* CMP0 interrupt */ void CMP1_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* CMP1 interrupt */ void CMP2_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* CMP2 interrupt */ void FTM0_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* FTM0 fault, all sources interrupt */ void FTM1_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* FTM1 fault, all sources interrupt */ void FTM2_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* FTM2 fault, all sources interrupt */ void CMT_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* CMT interrupt */ void RTC_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* RTC alarm interrupt */ void RTCSeconds_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* RTC seconds interrupt */ void PIT0_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* PIT timer channel 0 interrupt */ void PIT1_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* PIT timer channel 1 interrupt */ void PIT2_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* PIT timer channel 2 interrupt */ void PIT3_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* PIT timer channel 3 interrupt */ void PDB0_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* PDB0 interrupt */ void USB_ISR(void) __attribute__ ((weak, alias("Default_Handler"))); /* USB OTG interrupt */ void USBCharge_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* USB charger detect interrupt */ void Reserved91_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* Reserved interrupt 91 */ void Reserved92_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* Reserved interrupt 92 */ void Reserved93_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* Reserved interrupt 93 */ void Reserved94_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* Reserved interrupt 94 */ void Reserved95_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* Reserved interrupt 95 */ void SDHC_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* SDHC interrupt */ void DAC0_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* DAC0 interrupt */ void Reserved98_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* Reserved interrupt 98 */ void TSI_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* TSI all sources interrupt */ void MCG_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* MCG interrupt */ void LPTimer_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* Low-power Timer interrupt */ void Reserved102_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* Reserved interrupt 102 */ void PORTA_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* Port A pin detect interrupt */ void PORTB_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* Port B pin detect interrupt */ void PORTC_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* Port C pin detect interrupt */ void PORTD_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* Port D pin detect interrupt */ void PORTE_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* Port E pin detect interrupt */ void Reserved108_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* Reserved interrupt 108 */ void Reserved109_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* Reserved interrupt 109 */ void SWI_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler"))); /* Software interrupt */ /* The Interrupt Vector Table */ void (* const InterruptVector[])(void) __attribute__ ((section(".vectortable"))) = { /* Processor exceptions */ (void(*)(void)) &_estack, __thumb_startup, NMI_Handler, HardFault_Handler, MemManage_Handler, BusFault_Handler, UsageFault_Handler, 0, 0, 0, 0, SVC_Handler, DebugMon_Handler, 0, PendSV_Handler, SysTick_Handler, /* Interrupts */ DMA0_IRQHandler, /* DMA channel 0 transfer complete interrupt */ DMA1_IRQHandler, /* DMA channel 1 transfer complete interrupt */ DMA2_IRQHandler, /* DMA channel 2 transfer complete interrupt */ DMA3_IRQHandler, /* DMA channel 3 transfer complete interrupt */ DMA4_IRQHandler, /* DMA channel 4 transfer complete interrupt */ DMA5_IRQHandler, /* DMA channel 5 transfer complete interrupt */ DMA6_IRQHandler, /* DMA channel 6 transfer complete interrupt */ DMA7_IRQHandler, /* DMA channel 7 transfer complete interrupt */ DMA8_IRQHandler, /* DMA channel 8 transfer complete interrupt */ DMA9_IRQHandler, /* DMA channel 9 transfer complete interrupt */ DMA10_IRQHandler, /* DMA channel 10 transfer complete interrupt */ DMA11_IRQHandler, /* DMA channel 11 transfer complete interrupt */ DMA12_IRQHandler, /* DMA channel 12 transfer complete interrupt */ DMA13_IRQHandler, /* DMA channel 13 transfer complete interrupt */ DMA14_IRQHandler, /* DMA channel 14 transfer complete interrupt */ DMA15_IRQHandler, /* DMA channel 15 transfer complete interrupt */ DMA_Error_IRQHandler, /* DMA error interrupt */ MCMNormal_IRQHandler, /* MCM normal interrupt */ FlashCmd_IRQHandler, /* Flash memory command complete interrupt */ FlashReadErr_IRQHandler, /* Flash read collision interrupt */ LVD_LVW_IRQHandler, /* Low Voltage Detect, Low Voltage Warning */ LLW_IRQHandler, /* Low Leakage Wakeup */ Watchdog_IRQHandler, /* WDOG or EVM interrupt (shared) */ Reserved39_IRQHandler, /* Reserved interrupt 39 */ I2C0_IRQHandler, /* I2C0 interrupt */ I2C1_IRQHandler, /* I2C1 interrupt */ SPI0_IRQHandler, /* SPI0 interrupt */ SPI1_IRQHandler, /* SPI1 interrupt */ SPI2_IRQHandler, /* SPI2 interrupt 44 */ CAN0Msg_IRQHandler, /* CAN0 message buffer (0-15) interrupt */ CAN0BusOff_IRQHandler, /* CAN0 Bus Off interrupt */ CAN0Error_IRQHandler, /* CAN0 Error interrupt */ CAN0Xmit_IRQHandler, /* CAN0 Transmit warning interrupt */ CAN0Rcv_IRQHandler, /* CAN0 Recieve warning interrupt */ CAN0Wake_IRQHandler, /* CAN0 Wake Up interrupt */ I2S0_Tx_IRQHandler, /* I2S0 transmit interrupt */ I2S0_Rx_IRQHandler, /* I2S0 receive interrupt */ CAN1Msg_IRQHandler, /* Reserved interrupt 53 */ CAN1BusOff_IRQHandler, /* Reserved interrupt 54 */ CAN1Error_IRQHandler, /* Reserved interrupt 55 */ CAN1Xmit_IRQHandler, /* Reserved interrupt 56 */ CAN1Rcv_IRQHandler, /* Reserved interrupt 57 */ CAN1Wake_IRQHandler, /* Reserved interrupt 58 */ Reserved59_IRQHandler, /* Reserved interrupt 59 */ UART0_LON_IRQHandler, /* UART0 LON interrupt */ UART0_RX_TX_IRQHandler, /* UART0 receive/transmit interrupt */ UART0Error_IRQHandler, /* UART0 error interrupt */ UART1_RX_TX_IRQHandler, /* UART1 receive/transmit interrupt */ UART1Error_IRQHandler, /* UART1 error interrupt */ UART2_RX_TX_IRQHandler, /* UART2 receive/transmit interrupt */ UART2Error_IRQHandler, /* UART2 error interrupt */ UART3_RX_TX_IRQHandler, /* UART3 receive/transmit interrupt */ UART3Error_IRQHandler, /* UART3 error interrupt */ UART4_RX_TX_IRQHandler, /* UART4 receive/transmit */ UART4Error_IRQHandler, /* UART4 error interrupt */ Reserved71_IRQHandler, /* Reserved interrupt 71 */ Reserved72_IRQHandler, /* Reserved interrupt 72 */ ADC0_IRQHandler, /* ADC0 interrupt */ ADC1_IRQHandler, /* ADC1 interrupt */ CMP0_IRQHandler, /* CMP0 interrupt */ CMP1_IRQHandler, /* CMP1 interrupt */ CMP2_IRQHandler, /* CMP2 interrupt */ FTM0_IRQHandler, /* FTM0 fault, all sources interrupt */ FTM1_IRQHandler, /* FTM1 fault, all sources interrupt */ FTM2_IRQHandler, /* FTM2 fault, all sources interrupt */ CMT_IRQHandler, /* CMT interrupt */ RTC_IRQHandler, /* RTC alarm interrupt */ RTCSeconds_IRQHandler, /* RTC seconds interrupt */ PIT0_IRQHandler, /* PIT timer channel 0 interrupt */ PIT1_IRQHandler, /* PIT timer channel 1 interrupt */ PIT2_IRQHandler, /* PIT timer channel 2 interrupt */ PIT3_IRQHandler, /* PIT timer channel 3 interrupt */ PDB0_IRQHandler, /* PDB0 interrupt */ USB_ISR, /* USB OTG interrupt */ USBCharge_IRQHandler, /* USB charger detect interrupt */ Reserved91_IRQHandler, /* Reserved interrupt 91 */ Reserved92_IRQHandler, /* Reserved interrupt 92 */ Reserved93_IRQHandler, /* Reserved interrupt 93 */ Reserved94_IRQHandler, /* Reserved interrupt 94 */ Reserved95_IRQHandler, /* Reserved interrupt 95 */ SDHC_IRQHandler, /* SDHC interrupt */ DAC0_IRQHandler, /* DAC0 interrupt */ Reserved98_IRQHandler, /* Reserved interrupt 98 */ TSI_IRQHandler, /* TSI all sources interrupt */ MCG_IRQHandler, /* MCG interrupt */ LPTimer_IRQHandler, /* Low-power Timer interrupt */ Reserved102_IRQHandler, /* Reserved interrupt 102 */ PORTA_IRQHandler, /* Port A pin detect interrupt */ PORTB_IRQHandler, /* Port B pin detect interrupt */ PORTC_IRQHandler, /* Port C pin detect interrupt */ PORTD_IRQHandler, /* Port D pin detect interrupt */ PORTE_IRQHandler, /* Port E pin detect interrupt */ Reserved108_IRQHandler, /* Reserved interrupt 108 */ Reserved109_IRQHandler, /* Reserved interrupt 109 */ SWI_IRQHandler /* Software interrupt */ }; /** **=========================================================================== ** Reset handler **=========================================================================== */ void __init_hardware(void) { SCB_VTOR = (uint32)&InterruptVector[0]; /* Set the interrupt vector table position */ #if defined(MKL25Z128) // Disable the Watchdog because it may reset the core before entering main(). SIM_COPC = KINETIS_WDOG_DISABLED_CTRL; #elif defined(MKE02Z64) // Disable the Watchdog because it may reset the core before entering main(). WDOG_CNT = 0x20C5; WDOG_CNT = 0x28D9; WDOG_TOVAL = 0x28D9; WDOG_CS2 = WDOG_CS2_CLK(0); WDOG_CS1 = WDOG_CS1_UPDATE_MASK; //watchdog setting can be changed later #elif defined(MK20DN512) || defined(MK20DX256) // Disable the Watchdog because it may reset the core before entering main(). WDOG_UNLOCK = 0xC520; // Write 0xC520 to the unlock register WDOG_UNLOCK = 0xD928; // Followed by 0xD928 to complete the unlock WDOG_STCTRLH &= ~WDOG_STCTRLH_WDOGEN_MASK; // Clear the WDOGEN bit to disable the watchdog #else #error "MCU sub-model not supported!" #endif }