free-dap/platform/m484/startup_m480.c
2022-07-19 21:38:18 -07:00

307 lines
12 KiB
C

// SPDX-License-Identifier: BSD-3-Clause
// Copyright (c) 2022, Alex Taradov <alex@taradov.com>. All rights reserved.
/*- Includes ----------------------------------------------------------------*/
#include "M480.h"
/*- Definitions -------------------------------------------------------------*/
#define DUMMY __attribute__ ((weak, alias ("irq_handler_dummy")))
/*- Prototypes --------------------------------------------------------------*/
void irq_handler_reset(void);
DUMMY void irq_handler_nmi(void);
DUMMY void irq_handler_hard_fault(void);
DUMMY void irq_handler_mm_fault(void);
DUMMY void irq_handler_bus_fault(void);
DUMMY void irq_handler_usage_fault(void);
DUMMY void irq_handler_sv_call(void);
DUMMY void irq_handler_debug_mon(void);
DUMMY void irq_handler_pend_sv(void);
DUMMY void irq_handler_sys_tick(void);
DUMMY void irq_handler_bod(void);
DUMMY void irq_handler_irc(void);
DUMMY void irq_handler_pwrwu(void);
DUMMY void irq_handler_rampe(void);
DUMMY void irq_handler_ckfail(void);
DUMMY void irq_handler_rtc(void);
DUMMY void irq_handler_tamper(void);
DUMMY void irq_handler_wdt(void);
DUMMY void irq_handler_wwdt(void);
DUMMY void irq_handler_eint0(void);
DUMMY void irq_handler_eint1(void);
DUMMY void irq_handler_eint2(void);
DUMMY void irq_handler_eint3(void);
DUMMY void irq_handler_eint4(void);
DUMMY void irq_handler_eint5(void);
DUMMY void irq_handler_gpa(void);
DUMMY void irq_handler_gpb(void);
DUMMY void irq_handler_gpc(void);
DUMMY void irq_handler_gpd(void);
DUMMY void irq_handler_gpe(void);
DUMMY void irq_handler_gpf(void);
DUMMY void irq_handler_qspi0(void);
DUMMY void irq_handler_spi0(void);
DUMMY void irq_handler_brake0(void);
DUMMY void irq_handler_epwm0p0(void);
DUMMY void irq_handler_epwm0p1(void);
DUMMY void irq_handler_epwm0p2(void);
DUMMY void irq_handler_brake1(void);
DUMMY void irq_handler_epwm1p0(void);
DUMMY void irq_handler_epwm1p1(void);
DUMMY void irq_handler_epwm1p2(void);
DUMMY void irq_handler_tmr0(void);
DUMMY void irq_handler_tmr1(void);
DUMMY void irq_handler_tmr2(void);
DUMMY void irq_handler_tmr3(void);
DUMMY void irq_handler_uart0(void);
DUMMY void irq_handler_uart1(void);
DUMMY void irq_handler_i2c0(void);
DUMMY void irq_handler_i2c1(void);
DUMMY void irq_handler_pdma(void);
DUMMY void irq_handler_dac(void);
DUMMY void irq_handler_eadc00(void);
DUMMY void irq_handler_eadc01(void);
DUMMY void irq_handler_acmp01(void);
DUMMY void irq_handler_eadc02(void);
DUMMY void irq_handler_eadc03(void);
DUMMY void irq_handler_uart2(void);
DUMMY void irq_handler_uart3(void);
DUMMY void irq_handler_qspi1(void);
DUMMY void irq_handler_spi1(void);
DUMMY void irq_handler_spi2(void);
DUMMY void irq_handler_usbd(void);
DUMMY void irq_handler_ohci(void);
DUMMY void irq_handler_usbotg(void);
DUMMY void irq_handler_can0(void);
DUMMY void irq_handler_can1(void);
DUMMY void irq_handler_sc0(void);
DUMMY void irq_handler_sc1(void);
DUMMY void irq_handler_sc2(void);
DUMMY void irq_handler_spi3(void);
DUMMY void irq_handler_sdh0(void);
DUMMY void irq_handler_usbd20(void);
DUMMY void irq_handler_emac_tx(void);
DUMMY void irq_handler_emac_rx(void);
DUMMY void irq_handler_i2s0(void);
DUMMY void irq_handler_opa0(void);
DUMMY void irq_handler_crypto(void);
DUMMY void irq_handler_gpg(void);
DUMMY void irq_handler_eint6(void);
DUMMY void irq_handler_uart4(void);
DUMMY void irq_handler_uart5(void);
DUMMY void irq_handler_usci0(void);
DUMMY void irq_handler_usci1(void);
DUMMY void irq_handler_bpwm0(void);
DUMMY void irq_handler_bpwm1(void);
DUMMY void irq_handler_spim(void);
DUMMY void irq_handler_ccap(void);
DUMMY void irq_handler_i2c2(void);
DUMMY void irq_handler_qei0(void);
DUMMY void irq_handler_qei1(void);
DUMMY void irq_handler_ecap0(void);
DUMMY void irq_handler_ecap1(void);
DUMMY void irq_handler_gph(void);
DUMMY void irq_handler_eint7(void);
DUMMY void irq_handler_sdh1(void);
DUMMY void irq_handler_ehci(void);
DUMMY void irq_handler_usbotg20(void);
DUMMY void irq_handler_trng(void);
DUMMY void irq_handler_uart6(void);
DUMMY void irq_handler_uart7(void);
DUMMY void irq_handler_eadc10(void);
DUMMY void irq_handler_eadc11(void);
DUMMY void irq_handler_eadc12(void);
DUMMY void irq_handler_eadc13(void);
DUMMY void irq_handler_can2(void);
int main(void);
extern void _stack_top(void);
extern unsigned int _etext;
extern unsigned int _data;
extern unsigned int _edata;
extern unsigned int _bss;
extern unsigned int _ebss;
/*- Variables ---------------------------------------------------------------*/
//-----------------------------------------------------------------------------
__attribute__ ((used, section(".rom_vectors")))
void (* const rom_vectors[])(void) =
{
&_stack_top,
irq_handler_reset,
};
//-----------------------------------------------------------------------------
__attribute__ ((used, section(".vectors")))
void (* const vectors[])(void) =
{
&_stack_top, // 0 - Initial Stack Pointer Value
// Cortex-M4 handlers
irq_handler_reset, // 1 - Reset
irq_handler_nmi, // 2 - NMI
irq_handler_hard_fault, // 3 - Hard Fault
irq_handler_mm_fault, // 4 - MM Fault
irq_handler_bus_fault, // 5 - Bus Fault
irq_handler_usage_fault, // 6 - Usage Fault
0, // 7 - Reserved
0, // 8 - Reserved
0, // 9 - Reserved
0, // 10 - Reserved
irq_handler_sv_call, // 11 - SVCall
irq_handler_debug_mon, // 12 - Debug
0, // 13 - Reserved
irq_handler_pend_sv, // 14 - PendSV
irq_handler_sys_tick, // 15 - SysTick
// Peripheral handlers
irq_handler_bod, // 0 - brown out detection
irq_handler_irc, // 1 - internal rc
irq_handler_pwrwu, // 2 - power down wake up
irq_handler_rampe, // 3 - ram parity error
irq_handler_ckfail, // 4 - clock detection fail
0, // 5 - reserved
irq_handler_rtc, // 6 - real time clock
irq_handler_tamper, // 7 - tamper detection
irq_handler_wdt, // 8 - watchdog timer
irq_handler_wwdt, // 9 - window watchdog timer
irq_handler_eint0, // 10 - external input 0
irq_handler_eint1, // 11 - external input 1
irq_handler_eint2, // 12 - external input 2
irq_handler_eint3, // 13 - external input 3
irq_handler_eint4, // 14 - external input 4
irq_handler_eint5, // 15 - external input 5
irq_handler_gpa, // 16 - gpio port a
irq_handler_gpb, // 17 - gpio port b
irq_handler_gpc, // 18 - gpio port c
irq_handler_gpd, // 19 - gpio port d
irq_handler_gpe, // 20 - gpio port e
irq_handler_gpf, // 21 - gpio port f
irq_handler_qspi0, // 22 - qspi0
irq_handler_spi0, // 23 - spi0
irq_handler_brake0, // 24
irq_handler_epwm0p0, // 25
irq_handler_epwm0p1, // 26
irq_handler_epwm0p2, // 27
irq_handler_brake1, // 28
irq_handler_epwm1p0, // 29
irq_handler_epwm1p1, // 30
irq_handler_epwm1p2, // 31
irq_handler_tmr0, // 32 - timer 0
irq_handler_tmr1, // 33 - timer 1
irq_handler_tmr2, // 34 - timer 2
irq_handler_tmr3, // 35 - timer 3
irq_handler_uart0, // 36 - uart0
irq_handler_uart1, // 37 - uart1
irq_handler_i2c0, // 38 - i2c0
irq_handler_i2c1, // 39 - i2c1
irq_handler_pdma, // 40 - peripheral dma
irq_handler_dac, // 41 - dac
irq_handler_eadc00, // 42 - eadc0 interrupt source 0
irq_handler_eadc01, // 43 - eadc0 interrupt source 1
irq_handler_acmp01, // 44 - acmp0 and acmp1
0, // 45 - reserved
irq_handler_eadc02, // 46 - eadc0 interrupt source 2
irq_handler_eadc03, // 47 - eadc0 interrupt source 3
irq_handler_uart2, // 48 - uart2
irq_handler_uart3, // 49 - uart3
irq_handler_qspi1, // 50 - qspi1
irq_handler_spi1, // 51 - spi1
irq_handler_spi2, // 52 - spi2
irq_handler_usbd, // 53 - usb device
irq_handler_ohci, // 54 - ohci
irq_handler_usbotg, // 55 - usb otg
irq_handler_can0, // 56 - can0
irq_handler_can1, // 57 - can1
irq_handler_sc0, // 58
irq_handler_sc1, // 59
irq_handler_sc2, // 60
0, // 61 - reserved
irq_handler_spi3, // 62 - spi3
0, // 63 - reserved
irq_handler_sdh0, // 64 - sdh0
irq_handler_usbd20, // 65 - usbd20
irq_handler_emac_tx, // 66 - emac_tx
irq_handler_emac_rx, // 67 - emax_rx
irq_handler_i2s0, // 68 - i2s0
0, // 69 - reserved
irq_handler_opa0, // 70 - opa0
irq_handler_crypto, // 71 - crypto
irq_handler_gpg, // 72
irq_handler_eint6, // 73
irq_handler_uart4, // 74 - uart4
irq_handler_uart5, // 75 - uart5
irq_handler_usci0, // 76 - usci0
irq_handler_usci1, // 77 - usci1
irq_handler_bpwm0, // 78 - bpwm0
irq_handler_bpwm1, // 79 - bpwm1
irq_handler_spim, // 80 - spim
irq_handler_ccap, // 81 - ccap
irq_handler_i2c2, // 82 - i2c2
0, // 83 - reserved
irq_handler_qei0, // 84 - qei0
irq_handler_qei1, // 85 - qei1
irq_handler_ecap0, // 86 - ecap0
irq_handler_ecap1, // 87 - ecap1
irq_handler_gph, // 88
irq_handler_eint7, // 89
irq_handler_sdh1, // 90 - sdh1
0, // 91 - reserved
irq_handler_ehci, // 92 - ehci
irq_handler_usbotg20, // 93
0, // 94 - reserved
0, // 95 - reserved
0, // 96 - reserved
0, // 97 - reserved
0, // 98 - reserved
0, // 99 - reserved
0, // 100 - reserved
irq_handler_trng, // 101 - trng
irq_handler_uart6, // 102 - uart6
irq_handler_uart7, // 103 - uart7
irq_handler_eadc10, // 104 - eadc1 interrupt source 0
irq_handler_eadc11, // 105 - eadc1 interrupt source 1
irq_handler_eadc12, // 106 - eadc1 interrupt source 2
irq_handler_eadc13, // 107 - eadc1 interrupt source 3
irq_handler_can2, // 108 - can2
};
/*- Implementations ---------------------------------------------------------*/
//-----------------------------------------------------------------------------
__attribute__ ((used, section(".reset_handler"), optimize("-fno-tree-loop-distribute-patterns")))
void irq_handler_reset(void)
{
unsigned int *src, *dst;
src = &_etext;
dst = &_data;
while (dst < &_edata)
*dst++ = *src++;
dst = &_bss;
while (dst < &_ebss)
*dst++ = 0;
// Enable FPU
SCB->CPACR |= (0xf << 20);
__DSB();
__ISB();
SCB->VTOR = (uint32_t)vectors;
main();
while (1);
}
//-----------------------------------------------------------------------------
void irq_handler_dummy(void)
{
while (1);
}