// STM32F030XC Startup file
// GCC compatible

#include <stdint.h>
#include <stddef.h>

void SystemInit();
int main();
extern void *_estack;

void __attribute__((naked, noreturn)) Reset_Handler()
{
#ifdef __DEBUG_SRAM__
  __set_MSP((uint32_t)&_estack);
#endif

  SystemInit();

#ifndef __DEBUG_SRAM__
  extern uint32_t _sidata[], _sdata[], _edata[];
  for (volatile uint32_t *pSrc = _sidata, *pDst = _sdata; pDst != _edata; *pDst ++= *pSrc++) ;
#endif

  extern uint32_t _sbss[], _ebss[];
  for (volatile uint32_t *pDst = _sbss; pDst != _ebss; *pDst ++= 0) ; // Zero -> BSS

  main();
}

void Default_Handler() { for(;;); }

void NMI_Handler()                     __attribute__ ((weak, alias ("Default_Handler")));
void HardFault_Handler()               __attribute__ ((weak, alias ("Default_Handler")));
void SVC_Handler()                     __attribute__ ((weak, alias ("Default_Handler")));
void PendSV_Handler()                  __attribute__ ((weak, alias ("Default_Handler")));
void SysTick_Handler()                 __attribute__ ((weak, alias ("Default_Handler")));
void WWDG_IRQHandler()                 __attribute__ ((weak, alias ("Default_Handler")));
void RTC_IRQHandler()                  __attribute__ ((weak, alias ("Default_Handler")));
void FLASH_IRQHandler()                __attribute__ ((weak, alias ("Default_Handler")));
void RCC_IRQHandler()                  __attribute__ ((weak, alias ("Default_Handler")));
void EXTI0_1_IRQHandler()              __attribute__ ((weak, alias ("Default_Handler")));
void EXTI2_3_IRQHandler()              __attribute__ ((weak, alias ("Default_Handler")));
void EXTI4_15_IRQHandler()             __attribute__ ((weak, alias ("Default_Handler")));
void DMA1_Channel1_IRQHandler()        __attribute__ ((weak, alias ("Default_Handler")));
void DMA1_Channel2_3_IRQHandler()      __attribute__ ((weak, alias ("Default_Handler")));
void DMA1_Channel4_5_IRQHandler()      __attribute__ ((weak, alias ("Default_Handler")));
void ADC1_IRQHandler()                 __attribute__ ((weak, alias ("Default_Handler")));
void TIM1_BRK_UP_TRG_COM_IRQHandler()  __attribute__ ((weak, alias ("Default_Handler")));
void TIM1_CC_IRQHandler()              __attribute__ ((weak, alias ("Default_Handler")));
void TIM3_IRQHandler()                 __attribute__ ((weak, alias ("Default_Handler")));
void TIM6_IRQHandler()                 __attribute__ ((weak, alias ("Default_Handler")));
void TIM7_IRQHandler()                 __attribute__ ((weak, alias ("Default_Handler")));
void TIM14_IRQHandler()                __attribute__ ((weak, alias ("Default_Handler")));
void TIM15_IRQHandler()                __attribute__ ((weak, alias ("Default_Handler")));
void TIM16_IRQHandler()                __attribute__ ((weak, alias ("Default_Handler")));
void TIM17_IRQHandler()                __attribute__ ((weak, alias ("Default_Handler")));
void I2C1_IRQHandler()                 __attribute__ ((weak, alias ("Default_Handler")));
void I2C2_IRQHandler()                 __attribute__ ((weak, alias ("Default_Handler")));
void SPI1_IRQHandler()                 __attribute__ ((weak, alias ("Default_Handler")));
void SPI2_IRQHandler()                 __attribute__ ((weak, alias ("Default_Handler")));
void USART1_IRQHandler()               __attribute__ ((weak, alias ("Default_Handler")));
void USART2_IRQHandler()               __attribute__ ((weak, alias ("Default_Handler")));
void USART3_6_IRQHandler()             __attribute__ ((weak, alias ("Default_Handler")));

typedef void(*intvec_elem)();

// секцию ".vectors" написать так же как линкерскрипте !!!

const intvec_elem __vector_table[] __attribute__((used, section(".vectors"))) =
{ (intvec_elem)&_estack, &Reset_Handler,
  &NMI_Handler,
  &HardFault_Handler,
  NULL, NULL, NULL, NULL, NULL, NULL, NULL,
  &SVC_Handler,
  NULL, NULL,
  &PendSV_Handler,
  &SysTick_Handler,
  &WWDG_IRQHandler,
  NULL,
  &RTC_IRQHandler,
  &FLASH_IRQHandler,
  &RCC_IRQHandler,
  &EXTI0_1_IRQHandler,
  &EXTI2_3_IRQHandler,
  &EXTI4_15_IRQHandler,
  NULL,
  &DMA1_Channel1_IRQHandler,
  &DMA1_Channel2_3_IRQHandler,
  &DMA1_Channel4_5_IRQHandler,
  &ADC1_IRQHandler,
  &TIM1_BRK_UP_TRG_COM_IRQHandler,
  &TIM1_CC_IRQHandler,
  NULL,
  &TIM3_IRQHandler,
  &TIM6_IRQHandler,
  &TIM7_IRQHandler,
  &TIM14_IRQHandler,
  &TIM15_IRQHandler,
  &TIM16_IRQHandler,
  &TIM17_IRQHandler,
  &I2C1_IRQHandler,
  &I2C2_IRQHandler,
  &SPI1_IRQHandler,
  &SPI2_IRQHandler,
  &USART1_IRQHandler,
  &USART2_IRQHandler,
  &USART3_6_IRQHandler,
  NULL
};
