STM32 범용 프로젝트 템플릿 생성하기

범용 링커 스크립트

링커 스크립트는 프로그램 진입점인 Reset_Handler 함수의 위치를 정의하고, 메모리 영역 배치를 설정하며, 표준 라이브러리 관련 정보를 제거하는 역할을 합니다.

ST 사에서는 표준 주변장치 라이브러리에 다양한 모델에 대응하는 링커 스크립트를 제공하지 않았으며, HAL 라이브러리에서만 일부 예시를 찾을 수 있습니다:

  • STM32F100XB_FLASH.ld
  • STM32F100XE_FLASH.ld
  • STM32F101X6_FLASH.ld
  • STM32F101XB_FLASH.ld
  • STM32F101XE_FLASH.ld
  • STM32F101XG_FLASH.ld
  • STM32F102X6_FLASH.ld
  • STM32F102XB_FLASH.ld
  • STM32F103X6_FLASH.ld
  • STM32F103XB_FLASH.ld
  • STM32F103XE_FLASH.ld
  • STM32F103XG_FLASH.ld
  • STM32F105XC_FLASH.ld
  • STM32F107XC_FLASH.ld

위 파일들은 ST 공식 STM32F1 시리즈 HAL 라이브러리에서 확인할 수 있으며, 경로는 다음과 같습니다: STM32Cube_FW_F1_V1.8.7/Drivers/CMSIS/Device/ST/STM32F1xx/Source/Templates/gcc/linker/

각 스크립트를 분석해보면 거의 동일한 구조를 가지며, 차이점은 스택 포인터 상단 주소와 RAM, FLASH 영역 크기뿐입니다:

/* STM32F101X6_FLASH.ld */
/* Highest address of the user mode stack */
_estack = 0x200017FF;    /* end of RAM */

/* Generate a link error if heap and stack don't fit into RAM */
_Min_Heap_Size = 0x200;      /* required amount of heap  */
_Min_Stack_Size = 0x400; /* required amount of stack */

/* Specify the memory areas */
MEMORY
{
FLASH (rx)      : ORIGIN = 0x08000000, LENGTH = 32K
RAM (xrw)       : ORIGIN = 0x20000000, LENGTH = 6K
}


/* STM32F103XB_FLASH.ld */
/* Highest address of the user mode stack */
_estack = 0x20004FFF;    /* end of RAM */

/* Generate a link error if heap and stack don't fit into RAM */
_Min_Heap_Size = 0x200;      /* required amount of heap  */
_Min_Stack_Size = 0x400; /* required amount of stack */

/* Specify the memory areas */
MEMORY
{
FLASH (rx)      : ORIGIN = 0x08000000, LENGTH = 128K
RAM (xrw)       : ORIGIN = 0x20000000, LENGTH = 20K
}

이를 해결하기 위해 GNU 링커 스크립트의 PROVIDE 명령어를 활용하여 범용 링커 스크립트를 구현할 수 있습니다. PROVIDE는 변수에 기본값을 할당하면서도 링커 파라미터 -Wl,--defsym=symbol=value를 통해 값을 재정의할 수 있게 해줍니다:

PROVIDE(_Ram_Size   = 10K); /* RAM 크기, 기본값 : 10K */
PROVIDE(_Flash_Size = 32K); /* FLASH 크기, 기본값 : 32K */

PROVIDE(_Min_Heap_Size  = 0);  /* 힙 크기, 기본값 : 0 */
PROVIDE(_Min_Stack_Size = 1K); /* 스택 크기, 기본값 : 1K */

MEMORY
{
    FLASH (rx)  : ORIGIN = 0x08000000, LENGTH = _Flash_Size
    RAM   (rwx) : ORIGIN = 0x20000000, LENGTH = _Ram_Size
}

스택 포인터 상단 _estack은 항상 RAM 영역의 끝 주소여야 하므로, 다음과 같이 동적 계산식으로 정의합니다:

_estack = ORIGIN(RAM) + _Ram_Size;

사용 예제

위 범용 링커 스크립트를 프로젝트에 적용하고, 기본값인 10K RAM/32K FLASH를 STM32F103C6T6에 맞추었다면, 다음 링커 파라미터를 추가하여 STM32F103C8T6(20K RAM/64K FLASH)에도 쉽게 적용할 수 있습니다:

-Wl,--defsym=_Ram_Size=20K -Wl,--defsym=_Flash_Size=64K

범용 시작 파일

시작 파일은 ARM 어셈블리로 세 가지 작업을 수행합니다: Reset_Handler 함수 구현, 인터럽트 벡터 테이블 정의, 각 인터럽트 함수의 기본 구현 및 약한 심볼 정의입니다.

ST 사는 STM32F10X 시리즈 MCU를 위해 다음과 같은 시작 파일들을 제공합니다:

  • startup_stm32f10x_cl.s
  • startup_stm32f10x_hd.s
  • startup_stm32f10x_hd_vl.s
  • startup_stm32f10x_ld.s
  • startup_stm32f10x_ld_vl.s
  • startup_stm32f10x_md.s
  • startup_stm32f10x_md_vl.s
  • startup_stm32f10x_xl.s

이 파일들은 ST 공식 STM32F10X 시리즈 표준 주변장치 라이브러리에서 찾을 수 있으며, 경로는 STM32F10x_StdPeriph_Lib_V3.6.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/TrueSTUDIO/입니다.

명명 규칙은 일반적인 F101, 102, 103을 저용량(Low Density), 중용량(Medium Density), 고용량(High Density)으로 나누어 ld, md, hd 접미사를 사용합니다.

  • F100은 가치형(Value Line) 시리즈로 vl 접미사를 사용하며, 용량에 따라 ld_vl, md_vl, hd_vl로 구분됩니다.
  • F105/107은 연결형(Connectivity Line) 시리즈로 cl 접미사를 사용합니다.
  • xl은 초대용량 제품을 나타내며, F101과 F103의 ZF, ZG 버전(각각 768K/80K, 1M/80K)을 포함합니다.

각 버전의 시작 파일을 살펴보면 대부분 동일하며, 유일한 차이점은 BootRAM 값, 인터럽트 벡터 테이블 크기, 인터럽트 함수 이름입니다. 이를 해결하기 위해 C 언어의 조건부 컴파일 기능을 활용하여 범용 시작 파일을 구현할 수 있습니다.

먼저 모델별 매크로 정의에 따라 다른 BootRAM 값을 정의합니다:

/* RAM 부트 모드를 위한 특정 값 */
#if defined(STM32F10X_LD)
#define BootRAM 0xF108F85F
#elif defined(STM32F10X_LD_VL)
#define BootRAM 0xF108F85F
#elif defined(STM32F10X_MD)
#define BootRAM 0xF108F85F
#elif defined(STM32F10X_MD_VL)
#define BootRAM 0xF108F85F
#elif defined(STM32F10X_HD)
#define BootRAM 0xF1E0F85F
#elif defined(STM32F10X_HD_VL)
#define BootRAM 0xF108F85F
#elif defined(STM32F10X_XL)
#define BootRAM 0xF1E0F85F
#elif defined(STM32F10X_CL)
#define BootRAM 0xF1E0F85F
#endif

다음은 인터럽트 함수 선언 부분입니다:

// 이 부분은 모든 모델에 공통으로 적용되는 인터럽트 함수이므로 조건부 컴파일에 넣지 않음
/* 시스템 예외 핸들러 */
__attribute__((weak, alias("Default_Handler"))) 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);
// 이 부분은 주변장치 인터럽트로 모델에 따라 다른 이름을 가짐
/* 주변장치 인터럽트 핸들러 */
#if defined(STM32F10X_LD) 
// ...
#elif defined(STM32F10X_LD_VL) 

#elif defined(STM32F10X_MD) 

#elif defined(STM32F10X_MD_VL) 

#elif defined(STM32F10X_HD) 

#elif defined(STM32F10X_HD_VL) 

#elif defined(STM32F10X_XL) 

#elif defined(STM32F10X_CL) 

#endif

마지막으로 인터럽트 벡터 테이블 정의입니다:

/* 인터럽트 핸들러 함수 포인터 타입 정의 */
typedef void (*InterruptHandlerPtr_TypeDef)(void);

/* 벡터 테이블 */
__attribute__((used, section(".isr_vector"))) 
InterruptHandlerPtr_TypeDef g_pfnVectors[] = {
    /* 초기 스택 포인터 */
    (InterruptHandlerPtr_TypeDef)(uintptr_t)_estack,
    /* 코어 예외 */
#if defined(STM32F10X_LD) 
// ...
#elif defined(STM32F10X_LD_VL) 

#elif defined(STM32F10X_MD) 

#elif defined(STM32F10X_MD_VL) 

#elif defined(STM32F10X_HD) 

#elif defined(STM32F10X_HD_VL) 

#elif defined(STM32F10X_XL) 

#elif defined(STM32F10X_CL) 

#endif
    (InterruptHandlerPtr_TypeDef)BootRAM,
};

각 시작 파일의 함수에 따라 위 조건부 컴파일 프레임워크를 채우면 STM32F10X 시리즈 모든 MCU에 적용 가능한 범용 시작 파일이 완성됩니다.

부록

링커 스크립트

/* STM32F10X 링커 스크립트 */

/* 프로그램 진입점 */
ENTRY(Reset_Handler)

/* 메모리 영역 지정 */
/* 링커 파라미터 -Wl,--defsym=_foo=_size로 RAM과 FLASH 크기 설정 가능 */
PROVIDE(_Ram_Size   = 10K); /* RAM 크기, 기본값 : 10K */
PROVIDE(_Flash_Size = 32K); /* FLASH 크기, 기본값 : 32K */

/* 사용자 힙/스택 크기 */
PROVIDE(_Min_Heap_Size  = 0);  /* 힙 크기, 기본값 : 0 */
PROVIDE(_Min_Stack_Size = 1K); /* 스택 크기, 기본값 : 1K */

/* 메모리 영역 정의 */
MEMORY
{
    FLASH (rx)  : ORIGIN = 0x08000000, LENGTH = _Flash_Size
    RAM   (rwx) : ORIGIN = 0x20000000, LENGTH = _Ram_Size
}

/* 스택 포인터 상단 */
_estack = ORIGIN(RAM) + _Ram_Size;

/* 섹션 정의 */
SECTIONS
{
    /* 벡터 테이블은 FLASH 영역 시작 위치에 배치 */
    .isr_vector :
    {
        . = ALIGN(4);           /* 시작 위치 4바이트 정렬 */
        KEEP(*(.isr_vector))    /* 항상 유지 */
        . = ALIGN(4);           /* 종료 위치 4바이트 정렬 */
    } >FLASH                    /* FLASH 영역에 저장 */

    /* 프로그램 코드는 FLASH에 저장 */
    .text :
    {
        . = ALIGN(4);
        *(.text*)       /* 코드 섹션 .text* */
        *(.glue_7) 
        *(.glue_7t)     /* arm과 thumb 간 연결 코드 */
        *(.eh_frame)    /* 예외 처리 프레임 */

        KEEP(*(.init))
        KEEP(*(.fini))
        . = ALIGN(4);

        _etext = .; /* 프로그램 섹션 종료 주소 정의 */
    } >FLASH

    /* 상수 데이터는 FLASH에 저장 */
    .rodata :
    {
        . = ALIGN(4);
        *(.rodata*) /* 읽기 전용 데이터 섹션 .rodata* (const 변수, 문자열 상수 등) */
        . = ALIGN(4);
    } >FLASH

    /* ARM 예외 처리 관련 섹션 */
    .ARM.extab : 
    {
        *(.ARM.extab* .gnu.linkonce.armextab.*)
    } >FLASH

    .ARM : 
    {
        __exidx_start = .;
        *(.ARM.exidx*)
        __exidx_end = .;
    } >FLASH

    .ARM.attributes :
    { 
        *(.ARM.attributes) 
    } >FLASH

    .preinit_array :
    {
        PROVIDE_HIDDEN(__preinit_array_start = .);
        KEEP(*(.preinit_array*))
        PROVIDE_HIDDEN(__preinit_array_end = .);
    } >FLASH

    .init_array :
    {
        PROVIDE_HIDDEN (__init_array_start = .);
        KEEP(*(SORT(.init_array.*)))
        KEEP(*(.init_array*))
        PROVIDE_HIDDEN (__init_array_end = .);
    } >FLASH
    
    .fini_array :
    {
        PROVIDE_HIDDEN (__fini_array_start = .);
        KEEP(*(.fini_array*))
        KEEP(*(SORT(.fini_array.*)))
        PROVIDE_HIDDEN (__fini_array_end = .);
    } >FLASH

    /* 시작 파일에서 데이터 초기화를 위한 심볼 내보내기 */
    _sidata = LOADADDR(.data);

    /* 초기화된 데이터 섹션은 실행 시 RAM으로 복사 */
    .data :
    {
        . = ALIGN(4);
        _sdata = .; /* .data 섹션 시작 주소 정의 */
        *(.data*)   /* .data 데이터 섹션 */
        . = ALIGN(4);

        _edata = .; /* .data 섹션 종료 주소 정의 */
    } >RAM AT>FLASH

    /* 초기화되지 않은 데이터 섹션 */
    .bss :
    {
        . = ALIGN(4);
        _sbss = .; /* .bss 섹션 시작 주소 정의 */
        __bss_start__ = _sbss;
        *(.bss*)   /* .bss 섹션 */
        *(COMMON)
        . = ALIGN(4);

        _ebss = .; /* .bss 섹션 종료 주소 정의 */
        __bss_end__ = _ebss;
    } >RAM

    /* 사용자 힙/스택 섹션 */
    ._user_heap_stack :
    {
        . = ALIGN(8);
        PROVIDE(end = .);       /* end 심볼 정의 */
        PROVIDE(_end = .);      /* _end 심볼 정의 */
        . = . + _Min_Heap_Size;     /* 사용자 힙 크기 추가 */
        . = . + _Min_Stack_Size;    /* 사용자 스택 크기 추가 */
        . = ALIGN(8);
    } >RAM

    /* C 표준 라이브러리 제거 */
    /DISCARD/ :
    {
        libc.a   ( * )
        libm.a   ( * )
        libgcc.a ( * )
    }
}

시작 파일

#include <stddef.h>
#include <stdint.h>

/* 링커 스크립트에서 정의된 심볼 */
extern uint8_t _estack[]; /* 스택 포인터 최상단 */

extern uint8_t _sidata[]; /* .data 초기화 값 시작 주소 (Flash) */
extern uint8_t _sdata[];  /* .data 섹션 시작 주소 (RAM) */
extern uint8_t _edata[];  /* .data 섹션 종료 주소 (RAM) */
extern uint8_t _sbss[];   /* .bss 섹션 시작 주소 (RAM) */
extern uint8_t _ebss[];   /* .bss 섹션 종료 주소 (RAM) */

/* RAM 부트 모드를 위한 특정 값 */
#if defined(STM32F10X_LD)
#define BootRAM 0xF108F85F
#elif defined(STM32F10X_LD_VL)
#define BootRAM 0xF108F85F
#elif defined(STM32F10X_MD)
#define BootRAM 0xF108F85F
#elif defined(STM32F10X_MD_VL)
#define BootRAM 0xF108F85F
#elif defined(STM32F10X_HD)
#define BootRAM 0xF1E0F85F
#elif defined(STM32F10X_HD_VL)
#define BootRAM 0xF108F85F
#elif defined(STM32F10X_XL)
#define BootRAM 0xF1E0F85F
#elif defined(STM32F10X_CL)
#define BootRAM 0xF1E0F85F
#elif
#error "잘못된 디바이스가 선택되었습니다."
#endif

/* 외부 함수 선언 */
extern void SystemInit(void);        /* system_stm32f10x.c에 정의됨 */
extern int  main(void);              /* main.c에 정의됨 */
extern void __libc_init_array(void); /* Newlib 라이브러리 초기화 */

/* 함수 프로토타입 */
void                       Default_Handler(void);
__attribute__((weak)) void Reset_Handler(void);

/* 각 예외 핸들러에 대한 약한 별칭을 Default_Handler로 제공 */
/* 시스템 예외 핸들러 */
__attribute__((weak, alias("Default_Handler"))) 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);

/* 주변장치 인터럽트 핸들러 */
#if defined(STM32F10X_LD)
__attribute__((weak, alias("Default_Handler"))) void WWDG_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void PVD_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TAMPER_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void RTC_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void FLASH_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void RCC_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI0_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI1_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI2_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI3_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI4_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel1_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel2_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel3_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel4_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel5_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel6_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel7_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void ADC1_2_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void USB_HP_CAN1_TX_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void USB_LP_CAN1_RX0_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void CAN1_RX1_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void CAN1_SCE_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI9_5_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM1_BRK_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM1_UP_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM1_TRG_COM_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM1_CC_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM2_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM3_IRQHandler(void);
/* 예약됨 */
__attribute__((weak, alias("Default_Handler"))) void I2C1_EV_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void I2C1_ER_IRQHandler(void);
/* 예약됨 */
/* 예약됨 */
__attribute__((weak, alias("Default_Handler"))) void SPI1_IRQHandler(void);
/* 예약됨 */
__attribute__((weak, alias("Default_Handler"))) void USART1_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void USART2_IRQHandler(void);
/* 예약됨 */
__attribute__((weak, alias("Default_Handler"))) void EXTI15_10_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void RTCAlarm_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void USBWakeUp_IRQHandler(void);
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* BootRAM */
#elif defined(STM32F10X_LD_VL)
__attribute__((weak, alias("Default_Handler"))) void WWDG_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void PVD_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TAMPER_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void RTC_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void FLASH_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void RCC_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI0_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI1_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI2_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI3_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI4_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel1_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel2_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel3_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel4_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel5_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel6_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel7_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void ADC1_IRQHandler(void);
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
__attribute__((weak, alias("Default_Handler"))) void EXTI9_5_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM1_BRK_TIM15_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM1_UP_TIM16_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM1_TRG_COM_TIM17_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM1_CC_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM2_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM3_IRQHandler(void);
/* 예약됨 */
__attribute__((weak, alias("Default_Handler"))) void I2C1_EV_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void I2C1_ER_IRQHandler(void);
/* 예약됨 */
/* 예약됨 */
__attribute__((weak, alias("Default_Handler"))) void SPI1_IRQHandler(void);
/* 예약됨 */
__attribute__((weak, alias("Default_Handler"))) void USART1_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void USART2_IRQHandler(void);
/* 예약됨 */
__attribute__((weak, alias("Default_Handler"))) void EXTI15_10_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void RTCAlarm_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void CEC_IRQHandler(void);
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
__attribute__((weak, alias("Default_Handler"))) void TIM6_DAC_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM7_IRQHandler(void);
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* BootRAM */
#elif defined(STM32F10X_MD)
__attribute__((weak, alias("Default_Handler"))) void WWDG_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void PVD_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TAMPER_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void RTC_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void FLASH_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void RCC_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI0_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI1_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI2_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI3_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI4_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel1_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel2_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel3_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel4_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel5_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel6_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel7_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void ADC1_2_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void USB_HP_CAN1_TX_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void USB_LP_CAN1_RX0_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void CAN1_RX1_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void CAN1_SCE_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI9_5_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM1_BRK_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM1_UP_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM1_TRG_COM_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM1_CC_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM2_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM3_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM4_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void I2C1_EV_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void I2C1_ER_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void I2C2_EV_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void I2C2_ER_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void SPI1_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void SPI2_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void USART1_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void USART2_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void USART3_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI15_10_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void RTCAlarm_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void USBWakeUp_IRQHandler(void);
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* BootRAM */
#elif defined(STM32F10X_MD_VL)
__attribute__((weak, alias("Default_Handler"))) void WWDG_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void PVD_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TAMPER_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void RTC_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void FLASH_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void RCC_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI0_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI1_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI2_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI3_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI4_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel1_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel2_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel3_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel4_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel5_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel6_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel7_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void ADC1_IRQHandler(void);
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
__attribute__((weak, alias("Default_Handler"))) void EXTI9_5_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM1_BRK_TIM15_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM1_UP_TIM16_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM1_TRG_COM_TIM17_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM1_CC_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM2_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM3_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM4_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void I2C1_EV_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void I2C1_ER_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void I2C2_EV_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void I2C2_ER_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void SPI1_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void SPI2_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void USART1_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void USART2_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void USART3_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI15_10_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void RTCAlarm_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void CEC_IRQHandler(void);
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
__attribute__((weak, alias("Default_Handler"))) void TIM6_DAC_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM7_IRQHandler(void);
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
#elif defined(STM32F10X_HD)
__attribute__((weak, alias("Default_Handler"))) void WWDG_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void PVD_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TAMPER_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void RTC_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void FLASH_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void RCC_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI0_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI1_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI2_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI3_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI4_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel1_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel2_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel3_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel4_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel5_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel6_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel7_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void ADC1_2_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void USB_HP_CAN1_TX_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void USB_LP_CAN1_RX0_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void CAN1_RX1_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void CAN1_SCE_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI9_5_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM1_BRK_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM1_UP_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM1_TRG_COM_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM1_CC_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM2_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM3_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM4_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void I2C1_EV_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void I2C1_ER_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void I2C2_EV_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void I2C2_ER_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void SPI1_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void SPI2_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void USART1_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void USART2_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void USART3_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI15_10_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void RTCAlarm_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void USBWakeUp_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM8_BRK_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM8_UP_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM8_TRG_COM_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM8_CC_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void ADC3_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void FSMC_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void SDIO_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM5_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void SPI3_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void UART4_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void UART5_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM6_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM7_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA2_Channel1_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA2_Channel2_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA2_Channel3_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA2_Channel4_5_IRQHandler(void);
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* BootRAM */
#elif defined(STM32F10X_HD_VL)
__attribute__((weak, alias("Default_Handler"))) void WWDG_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void PVD_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TAMPER_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void RTC_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void FLASH_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void RCC_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI0_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI1_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI2_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI3_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI4_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel1_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel2_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel3_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel4_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel5_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel6_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel7_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void ADC1_IRQHandler(void);
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
__attribute__((weak, alias("Default_Handler"))) void EXTI9_5_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM1_BRK_TIM15_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM1_UP_TIM16_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM1_TRG_COM_TIM17_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM1_CC_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM2_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM3_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM4_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void I2C1_EV_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void I2C1_ER_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void I2C2_EV_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void I2C2_ER_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void SPI1_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void SPI2_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void USART1_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void USART2_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void USART3_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI15_10_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void RTCAlarm_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void CEC_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM12_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM13_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM14_IRQHandler(void);
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
__attribute__((weak, alias("Default_Handler"))) void TIM5_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void SPI3_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void UART4_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void UART5_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM6_DAC_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM7_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA2_Channel1_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA2_Channel2_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA2_Channel3_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA2_Channel4_5_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA2_Channel5_IRQHandler(void);
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* BootRAM */
#elif defined(STM32F10X_XL)
__attribute__((weak, alias("Default_Handler"))) void WWDG_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void PVD_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TAMPER_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void RTC_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void FLASH_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void RCC_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI0_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI1_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI2_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI3_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI4_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel1_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel2_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel3_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel4_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel5_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel6_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel7_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void ADC1_2_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void USB_HP_CAN1_TX_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void USB_LP_CAN1_RX0_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void CAN1_RX1_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void CAN1_SCE_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI9_5_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM1_BRK_TIM9_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM1_UP_TIM10_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM1_TRG_COM_TIM11_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM1_CC_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM2_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM3_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM4_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void I2C1_EV_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void I2C1_ER_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void I2C2_EV_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void I2C2_ER_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void SPI1_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void SPI2_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void USART1_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void USART2_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void USART3_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI15_10_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void RTCAlarm_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void USBWakeUp_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM8_BRK_TIM12_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM8_UP_TIM13_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM8_TRG_COM_TIM14_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM8_CC_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void ADC3_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void FSMC_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void SDIO_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM5_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void SPI3_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void UART4_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void UART5_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM6_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM7_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA2_Channel1_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA2_Channel2_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA2_Channel3_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA2_Channel4_5_IRQHandler(void);
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* BootRAM */
#elif defined(STM32F10X_CL)
__attribute__((weak, alias("Default_Handler"))) void WWDG_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void PVD_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TAMPER_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void RTC_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void FLASH_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void RCC_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI0_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI1_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI2_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI3_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI4_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel1_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel2_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel3_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel4_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel5_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel6_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA1_Channel7_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void ADC1_2_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void CAN1_TX_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void CAN1_RX0_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void CAN1_RX1_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void CAN1_SCE_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI9_5_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM1_BRK_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM1_UP_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM1_TRG_COM_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM1_CC_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM2_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM3_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM4_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void I2C1_EV_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void I2C1_ER_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void I2C2_EV_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void I2C2_ER_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void SPI1_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void SPI2_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void USART1_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void USART2_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void USART3_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI15_10_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void RTCAlarm_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void OTG_FS_WKUP_IRQHandler(void);
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
__attribute__((weak, alias("Default_Handler"))) void TIM5_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void SPI3_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void UART4_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void UART5_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM6_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void TIM7_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA2_Channel1_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA2_Channel2_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA2_Channel3_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA2_Channel4_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void DMA2_Channel5_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void ETH_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void ETH_WKUP_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void CAN2_TX_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void CAN2_RX0_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void CAN2_RX1_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void CAN2_SCE_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void OTG_FS_IRQHandler(void);
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* 예약됨 */
/* BootRAM */
#endif

/* 인터럽트 핸들러 함수 포인터 타입 정의 */
typedef void (*InterruptHandlerPtr_TypeDef)(void);

/* 벡터 테이블 */
__attribute__((used, section(".isr_vector")))
InterruptHandlerPtr_TypeDef g_pfnVectors[] = {
    /* 초기 스택 포인터 */
    (InterruptHandlerPtr_TypeDef)(uintptr_t)_estack,
/* 코어 예외 */
#if defined(STM32F10X_LD)
    Reset_Handler,
    NMI_Handler,
    HardFault_Handler,
    MemManage_Handler,
    BusFault_Handler,
    UsageFault_Handler,
    NULL,
    NULL,
    NULL,
    NULL,
    SVC_Handler,
    DebugMon_Handler,
    NULL,
    PendSV_Handler,
    SysTick_Handler,
    /* 외부 인터럽트 */
    WWDG_IRQHandler,
    PVD_IRQHandler,
    TAMPER_IRQHandler,
    RTC_IRQHandler,
    FLASH_IRQHandler,
    RCC_IRQHandler,
    EXTI0_IRQHandler,
    EXTI1_IRQHandler,
    EXTI2_IRQHandler,
    EXTI3_IRQHandler,
    EXTI4_IRQHandler,
    DMA1_Channel1_IRQHandler,
    DMA1_Channel2_IRQHandler,
    DMA1_Channel3_IRQHandler,
    DMA1_Channel4_IRQHandler,
    DMA1_Channel5_IRQHandler,
    DMA1_Channel6_IRQHandler,
    DMA1_Channel7_IRQHandler,
    ADC1_2_IRQHandler,
    USB_HP_CAN1_TX_IRQHandler,
    USB_LP_CAN1_RX0_IRQHandler,
    CAN1_RX1_IRQHandler,
    CAN1_SCE_IRQHandler,
    EXTI9_5_IRQHandler,
    TIM1_BRK_IRQHandler,
    TIM1_UP_IRQHandler,
    TIM1_TRG_COM_IRQHandler,
    TIM1_CC_IRQHandler,
    TIM2_IRQHandler,
    TIM3_IRQHandler,
    NULL,
    I2C1_EV_IRQHandler,
    I2C1_ER_IRQHandler,
    NULL,
    NULL,
    SPI1_IRQHandler,
    NULL,
    USART1_IRQHandler,
    USART2_IRQHandler,
    NULL,
    EXTI15_10_IRQHandler,
    RTCAlarm_IRQHandler,
    USBWakeUp_IRQHandler,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
#elif defined(STM32F10X_LD_VL)
    (InterruptHandlerPtr_TypeDef)(uintptr_t)_estack,
    Reset_Handler,
    NMI_Handler,
    HardFault_Handler,
    MemManage_Handler,
    BusFault_Handler,
    UsageFault_Handler,
    NULL,
    NULL,
    NULL,
    NULL,
    SVC_Handler,
    DebugMon_Handler,
    NULL,
    PendSV_Handler,
    SysTick_Handler,
    WWDG_IRQHandler,
    PVD_IRQHandler,
    TAMPER_IRQHandler,
    RTC_IRQHandler,
    FLASH_IRQHandler,
    RCC_IRQHandler,
    EXTI0_IRQHandler,
    EXTI1_IRQHandler,
    EXTI2_IRQHandler,
    EXTI3_IRQHandler,
    EXTI4_IRQHandler,
    DMA1_Channel1_IRQHandler,
    DMA1_Channel2_IRQHandler,
    DMA1_Channel3_IRQHandler,
    DMA1_Channel4_IRQHandler,
    DMA1_Channel5_IRQHandler,
    DMA1_Channel6_IRQHandler,
    DMA1_Channel7_IRQHandler,
    ADC1_IRQHandler,
    NULL,
    NULL,
    NULL,
    NULL,
    EXTI9_5_IRQHandler,
    TIM1_BRK_TIM15_IRQHandler,
    TIM1_UP_TIM16_IRQHandler,
    TIM1_TRG_COM_TIM17_IRQHandler,
    TIM1_CC_IRQHandler,
    TIM2_IRQHandler,
    TIM3_IRQHandler,
    NULL,
    I2C1_EV_IRQHandler,
    I2C1_ER_IRQHandler,
    NULL,
    NULL,
    SPI1_IRQHandler,
    NULL,
    USART1_IRQHandler,
    USART2_IRQHandler,
    NULL,
    EXTI15_10_IRQHandler,
    RTCAlarm_IRQHandler,
    CEC_IRQHandler,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    TIM6_DAC_IRQHandler,
    TIM7_IRQHandler,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
#elif defined(STM32F10X_MD)
    Reset_Handler,
    NMI_Handler,
    HardFault_Handler,
    MemManage_Handler,
    BusFault_Handler,
    UsageFault_Handler,
    NULL,
    NULL,
    NULL,
    NULL,
    SVC_Handler,
    DebugMon_Handler,
    NULL,
    PendSV_Handler,
    SysTick_Handler,
    /* 외부 인터럽트 */
    WWDG_IRQHandler,
    PVD_IRQHandler,
    TAMPER_IRQHandler,
    RTC_IRQHandler,
    FLASH_IRQHandler,
    RCC_IRQHandler,
    EXTI0_IRQHandler,
    EXTI1_IRQHandler,
    EXTI2_IRQHandler,
    EXTI3_IRQHandler,
    EXTI4_IRQHandler,
    DMA1_Channel1_IRQHandler,
    DMA1_Channel2_IRQHandler,
    DMA1_Channel3_IRQHandler,
    DMA1_Channel4_IRQHandler,
    DMA1_Channel5_IRQHandler,
    DMA1_Channel6_IRQHandler,
    DMA1_Channel7_IRQHandler,
    ADC1_2_IRQHandler,
    USB_HP_CAN1_TX_IRQHandler,
    USB_LP_CAN1_RX0_IRQHandler,
    CAN1_RX1_IRQHandler,
    CAN1_SCE_IRQHandler,
    EXTI9_5_IRQHandler,
    TIM1_BRK_IRQHandler,
    TIM1_UP_IRQHandler,
    TIM1_TRG_COM_IRQHandler,
    TIM1_CC_IRQHandler,
    TIM2_IRQHandler,
    TIM3_IRQHandler,
    TIM4_IRQHandler,
    I2C1_EV_IRQHandler,
    I2C1_ER_IRQHandler,
    I2C2_EV_IRQHandler,
    I2C2_ER_IRQHandler,
    SPI1_IRQHandler,
    SPI2_IRQHandler,
    USART1_IRQHandler,
    USART2_IRQHandler,
    USART3_IRQHandler,
    EXTI15_10_IRQHandler,
    RTCAlarm_IRQHandler,
    USBWakeUp_IRQHandler,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
#elif defined(STM32F10X_MD_VL)
    Reset_Handler,
    NMI_Handler,
    HardFault_Handler,
    MemManage_Handler,
    BusFault_Handler,
    UsageFault_Handler,
    NULL,
    NULL,
    NULL,
    NULL,
    SVC_Handler,
    DebugMon_Handler,
    NULL,
    PendSV_Handler,
    SysTick_Handler,
    /* 외부 인터럽트 */
    WWDG_IRQHandler,
    PVD_IRQHandler,
    TAMPER_IRQHandler,
    RTC_IRQHandler,
    FLASH_IRQHandler,
    RCC_IRQHandler,
    EXTI0_IRQHandler,
    EXTI1_IRQHandler,
    EXTI2_IRQHandler,
    EXTI3_IRQHandler,
    EXTI4_IRQHandler,
    DMA1_Channel1_IRQHandler,
    DMA1_Channel2_IRQHandler,
    DMA1_Channel3_IRQHandler,
    DMA1_Channel4_IRQHandler,
    DMA1_Channel5_IRQHandler,
    DMA1_Channel6_IRQHandler,
    DMA1_Channel7_IRQHandler,
    ADC1_IRQHandler,
    NULL,
    NULL,
    NULL,
    NULL,
    EXTI9_5_IRQHandler,
    TIM1_BRK_TIM15_IRQHandler,
    TIM1_UP_TIM16_IRQHandler,
    TIM1_TRG_COM_TIM17_IRQHandler,
    TIM1_CC_IRQHandler,
    TIM2_IRQHandler,
    TIM3_IRQHandler,
    TIM4_IRQHandler,
    I2C1_EV_IRQHandler,
    I2C1_ER_IRQHandler,
    I2C2_EV_IRQHandler,
    I2C2_ER_IRQHandler,
    SPI1_IRQHandler,
    SPI2_IRQHandler,
    USART1_IRQHandler,
    USART2_IRQHandler,
    USART3_IRQHandler,
    EXTI15_10_IRQHandler,
    RTCAlarm_IRQHandler,
    CEC_IRQHandler,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    TIM6_DAC_IRQHandler,
    TIM7_IRQHandler,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
#elif defined(STM32F10X_HD)
    Reset_Handler,
    NMI_Handler,
    HardFault_Handler,
    MemManage_Handler,
    BusFault_Handler,
    UsageFault_Handler,
    NULL,
    NULL,
    NULL,
    NULL,
    SVC_Handler,
    DebugMon_Handler,
    NULL,
    PendSV_Handler,
    SysTick_Handler,
    /* 외부 인터럽트 */
    WWDG_IRQHandler,
    PVD_IRQHandler,
    TAMPER_IRQHandler,
    RTC_IRQHandler,
    FLASH_IRQHandler,
    RCC_IRQHandler,
    EXTI0_IRQHandler,
    EXTI1_IRQHandler,
    EXTI2_IRQHandler,
    EXTI3_IRQHandler,
    EXTI4_IRQHandler,
    DMA1_Channel1_IRQHandler,
    DMA1_Channel2_IRQHandler,
    DMA1_Channel3_IRQHandler,
    DMA1_Channel4_IRQHandler,
    DMA1_Channel5_IRQHandler,
    DMA1_Channel6_IRQHandler,
    DMA1_Channel7_IRQHandler,
    ADC1_2_IRQHandler,
    USB_HP_CAN1_TX_IRQHandler,
    USB_LP_CAN1_RX0_IRQHandler,
    CAN1_RX1_IRQHandler,
    CAN1_SCE_IRQHandler,
    EXTI9_5_IRQHandler,
    TIM1_BRK_IRQHandler,
    TIM1_UP_IRQHandler,
    TIM1_TRG_COM_IRQHandler,
    TIM1_CC_IRQHandler,
    TIM2_IRQHandler,
    TIM3_IRQHandler,
    TIM4_IRQHandler,
    I2C1_EV_IRQHandler,
    I2C1_ER_IRQHandler,
    I2C2_EV_IRQHandler,
    I2C2_ER_IRQHandler,
    SPI1_IRQHandler,
    SPI2_IRQHandler,
    USART1_IRQHandler,
    USART2_IRQHandler,
    USART3_IRQHandler,
    EXTI15_10_IRQHandler,
    RTCAlarm_IRQHandler,
    USBWakeUp_IRQHandler,
    TIM8_BRK_IRQHandler,
    TIM8_UP_IRQHandler,
    TIM8_TRG_COM_IRQHandler,
    TIM8_CC_IRQHandler,
    ADC3_IRQHandler,
    FSMC_IRQHandler,
    SDIO_IRQHandler,
    TIM5_IRQHandler,
    SPI3_IRQHandler,
    UART4_IRQHandler,
    UART5_IRQHandler,
    TIM6_IRQHandler,
    TIM7_IRQHandler,
    DMA2_Channel1_IRQHandler,
    DMA2_Channel2_IRQHandler,
    DMA2_Channel3_IRQHandler,
    DMA2_Channel4_5_IRQHandler,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
#elif defined(STM32F10X_HD_VL)
    Reset_Handler,
    NMI_Handler,
    HardFault_Handler,
    MemManage_Handler,
    BusFault_Handler,
    UsageFault_Handler,
    NULL,
    NULL,
    NULL,
    NULL,
    SVC_Handler,
    DebugMon_Handler,
    NULL,
    PendSV_Handler,
    SysTick_Handler,
    /* 외부 인터럽트 */
    WWDG_IRQHandler,
    PVD_IRQHandler,
    TAMPER_IRQHandler,
    RTC_IRQHandler,
    FLASH_IRQHandler,
    RCC_IRQHandler,
    EXTI0_IRQHandler,
    EXTI1_IRQHandler,
    EXTI2_IRQHandler,
    EXTI3_IRQHandler,
    EXTI4_IRQHandler,
    DMA1_Channel1_IRQHandler,
    DMA1_Channel2_IRQHandler,
    DMA1_Channel3_IRQHandler,
    DMA1_Channel4_IRQHandler,
    DMA1_Channel5_IRQHandler,
    DMA1_Channel6_IRQHandler,
    DMA1_Channel7_IRQHandler,
    ADC1_IRQHandler,
    NULL,
    NULL,
    NULL,
    NULL,
    EXTI9_5_IRQHandler,
    TIM1_BRK_TIM15_IRQHandler,
    TIM1_UP_TIM16_IRQHandler,
    TIM1_TRG_COM_TIM17_IRQHandler,
    TIM1_CC_IRQHandler,
    TIM2_IRQHandler,
    TIM3_IRQHandler,
    TIM4_IRQHandler,
    I2C1_EV_IRQHandler,
    I2C1_ER_IRQHandler,
    I2C2_EV_IRQHandler,
    I2C2_ER_IRQHandler,
    SPI1_IRQHandler,
    SPI2_IRQHandler,
    USART1_IRQHandler,
    USART2_IRQHandler,
    USART3_IRQHandler,
    EXTI15_10_IRQHandler,
    RTCAlarm_IRQHandler,
    CEC_IRQHandler,
    TIM12_IRQHandler,
    TIM13_IRQHandler,
    TIM14_IRQHandler,
    NULL,
    NULL,
    NULL,
    NULL,
    TIM5_IRQHandler,
    SPI3_IRQHandler,
    UART4_IRQHandler,
    UART5_IRQHandler,
    TIM6_DAC_IRQHandler,
    TIM7_IRQHandler,
    DMA2_Channel1_IRQHandler,
    DMA2_Channel2_IRQHandler,
    DMA2_Channel3_IRQHandler,
    DMA2_Channel4_5_IRQHandler,
    DMA2_Channel5_IRQHandler,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
#elif defined(STM32F10X_XL)
    Reset_Handler,      /* 리셋 핸들러 */
    NMI_Handler,        /* 마스크 불가능 인터럽트 핸들러 */
    HardFault_Handler,  /* 하드 폴트 핸들러 */
    MemManage_Handler,  /* 메모리 관리 폴트 핸들러 */
    BusFault_Handler,   /* 버스 폴트 핸들러 */
    UsageFault_Handler, /* 사용 폴트 핸들러 */
    NULL,               /* 예약됨 */
    NULL,               /* 예약됨 */
    NULL,               /* 예약됨 */
    NULL,               /* 예약됨 */
    SVC_Handler,        /* SVCall 핸들러 */
    DebugMon_Handler,   /* 디버그 모니터 핸들러 */
    NULL,               /* 예약됨 */
    PendSV_Handler,     /* PendSV 핸들러 */
    SysTick_Handler,    /* SysTick 핸들러 */
    /* 외부 인터럽트 */
    WWDG_IRQHandler,
    PVD_IRQHandler,
    TAMPER_IRQHandler,
    RTC_IRQHandler,
    FLASH_IRQHandler,
    RCC_IRQHandler,
    EXTI0_IRQHandler,
    EXTI1_IRQHandler,
    EXTI2_IRQHandler,
    EXTI3_IRQHandler,
    EXTI4_IRQHandler,
    DMA1_Channel1_IRQHandler,
    DMA1_Channel2_IRQHandler,
    DMA1_Channel3_IRQHandler,
    DMA1_Channel4_IRQHandler,
    DMA1_Channel5_IRQHandler,
    DMA1_Channel6_IRQHandler,
    DMA1_Channel7_IRQHandler,
    ADC1_2_IRQHandler,
    USB_HP_CAN1_TX_IRQHandler,
    USB_LP_CAN1_RX0_IRQHandler,
    CAN1_RX1_IRQHandler,
    CAN1_SCE_IRQHandler,
    EXTI9_5_IRQHandler,
    TIM1_BRK_TIM9_IRQHandler,
    TIM1_UP_TIM10_IRQHandler,
    TIM1_TRG_COM_TIM11_IRQHandler,
    TIM1_CC_IRQHandler,
    TIM2_IRQHandler,
    TIM3_IRQHandler,
    TIM4_IRQHandler,
    I2C1_EV_IRQHandler,
    I2C1_ER_IRQHandler,
    I2C2_EV_IRQHandler,
    I2C2_ER_IRQHandler,
    SPI1_IRQHandler,
    SPI2_IRQHandler,
    USART1_IRQHandler,
    USART2_IRQHandler,
    USART3_IRQHandler,
    EXTI15_10_IRQHandler,
    RTCAlarm_IRQHandler,
    USBWakeUp_IRQHandler,
    TIM8_BRK_TIM12_IRQHandler,
    TIM8_UP_TIM13_IRQHandler,
    TIM8_TRG_COM_TIM14_IRQHandler,
    TIM8_CC_IRQHandler,
    ADC3_IRQHandler,
    FSMC_IRQHandler,
    SDIO_IRQHandler,
    TIM5_IRQHandler,
    SPI3_IRQHandler,
    UART4_IRQHandler,
    UART5_IRQHandler,
    TIM6_IRQHandler,
    TIM7_IRQHandler,
    DMA2_Channel1_IRQHandler,
    DMA2_Channel2_IRQHandler,
    DMA2_Channel3_IRQHandler,
    DMA2_Channel4_5_IRQHandler,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
#elif defined(STM32F10X_CL)
    Reset_Handler,
    NMI_Handler,
    HardFault_Handler,
    MemManage_Handler,
    BusFault_Handler,
    UsageFault_Handler,
    NULL,
    NULL,
    NULL,
    NULL,
    SVC_Handler,
    DebugMon_Handler,
    NULL,
    PendSV_Handler,
    SysTick_Handler,
    /* 외부 인터럽트 */
    WWDG_IRQHandler,
    PVD_IRQHandler,
    TAMPER_IRQHandler,
    RTC_IRQHandler,
    FLASH_IRQHandler,
    RCC_IRQHandler,
    EXTI0_IRQHandler,
    EXTI1_IRQHandler,
    EXTI2_IRQHandler,
    EXTI3_IRQHandler,
    EXTI4_IRQHandler,
    DMA1_Channel1_IRQHandler,
    DMA1_Channel2_IRQHandler,
    DMA1_Channel3_IRQHandler,
    DMA1_Channel4_IRQHandler,
    DMA1_Channel5_IRQHandler,
    DMA1_Channel6_IRQHandler,
    DMA1_Channel7_IRQHandler,
    ADC1_2_IRQHandler,
    CAN1_TX_IRQHandler,
    CAN1_RX0_IRQHandler,
    CAN1_RX1_IRQHandler,
    CAN1_SCE_IRQHandler,
    EXTI9_5_IRQHandler,
    TIM1_BRK_IRQHandler,
    TIM1_UP_IRQHandler,
    TIM1_TRG_COM_IRQHandler,
    TIM1_CC_IRQHandler,
    TIM2_IRQHandler,
    TIM3_IRQHandler,
    TIM4_IRQHandler,
    I2C1_EV_IRQHandler,
    I2C1_ER_IRQHandler,
    I2C2_EV_IRQHandler,
    I2C2_ER_IRQHandler,
    SPI1_IRQHandler,
    SPI2_IRQHandler,
    USART1_IRQHandler,
    USART2_IRQHandler,
    USART3_IRQHandler,
    EXTI15_10_IRQHandler,
    RTCAlarm_IRQHandler,
    OTG_FS_WKUP_IRQHandler,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    TIM5_IRQHandler,
    SPI3_IRQHandler,
    UART4_IRQHandler,
    UART5_IRQHandler,
    TIM6_IRQHandler,
    TIM7_IRQHandler,
    DMA2_Channel1_IRQHandler,
    DMA2_Channel2_IRQHandler,
    DMA2_Channel3_IRQHandler,
    DMA2_Channel4_IRQHandler,
    DMA2_Channel5_IRQHandler,
    ETH_IRQHandler,
    ETH_WKUP_IRQHandler,
    CAN2_TX_IRQHandler,
    CAN2_RX0_IRQHandler,
    CAN2_RX1_IRQHandler,
    CAN2_SCE_IRQHandler,
    OTG_FS_IRQHandler,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
#endif
    (InterruptHandlerPtr_TypeDef)BootRAM,
};

/**
 * @brief 무한 루프 함수.
 *
 */
__attribute__((noreturn)) static void Infinite_Loop(void)
{
    while (1) {
        /* 무한 루프 */
    }
}

/**
 * @brief 기본 인터럽트 핸들러.
 *
 * @param 없음
 * @return 없음
 *
 * @note 다른 인터럽트 핸들러에서 처리되지 않은 인터럽트가 발생했을 때 호출됩니다.
 */
void Default_Handler(void)
{
    Infinite_Loop();
}

/**
 * @brief 데이터 섹션 초기화 값을 플래시에서 SRAM으로 복사
 * @param 없음
 * @retval 없음
 */
static void CopyDataInit(void)
{
    volatile const uint32_t *src_begin  = (void *)_sidata;
    const uint32_t          *data_end   = (void *)_edata;
    volatile uint32_t       *data_begin = (void *)_sdata;

    while (data_begin < data_end) {
        *data_begin = *src_begin;
        data_begin++;
        src_begin++;
    }
}

/**
 * @brief bss 섹션을 0으로 채움
 * @param 없음
 * @retval 없음
 */
static void FillZerobss(void)
{
    volatile uint32_t *bss_begin = (void *)_sbss;
    const uint32_t    *bss_end   = (void *)_ebss;

    while (bss_begin < bss_end) {
        *bss_begin = 0x00;
        bss_begin++;
    }
}

/**
 * @brief 리셋 이벤트 후 프로세서가 처음 실행될 때 호출되는 코드입니다.
 *        필요한 최소한의 작업만 수행한 후 애플리케이션의 main() 함수를 호출합니다.
 * @param 없음
 * @retval 없음
 */
__attribute__((noreturn)) void Reset_Handler(void)
{
    /* 데이터 섹션 초기화 값을 플래시에서 SRAM으로 복사 */
    CopyDataInit();

    /* bss 섹션을 0으로 채움 */
    FillZerobss();

    /* 클럭 시스템 초기화 함수 호출 */
    SystemInit();

    /* 정적 생성자 호출 */
    __libc_init_array();

    /* 애플리케이션 진입점 호출 */
    main();

    /* 여기에 도달해서는 안 됨 */
    Infinite_Loop();
}

태그: STM32 ARM Cortex-M3 GCC LinkerScript

5월 26일 02:34에 게시됨