Skip to content

File startup_ch32v307.c

File List > ch32v307 > startup_ch32v307.c

Go to the documentation of this file

#include <stdint.h>

extern uint32_t _sidata;
extern uint32_t _sdata;
extern uint32_t _edata;
extern uint32_t _sbss;
extern uint32_t _ebss;
extern uint32_t _estack;

extern int main(void);

void Reset_Handler(void);

#if defined(__riscv)
#define SYN_ISR_ATTR __attribute__((interrupt("WCH-Interrupt-fast")))
#else
#define SYN_ISR_ATTR
#endif

SYN_ISR_ATTR void Default_Handler(void);

SYN_ISR_ATTR void NMI_Handler(void) __attribute__((weak, alias("Default_Handler")));

SYN_ISR_ATTR void HardFault_Handler(void) __attribute__((weak, alias("Default_Handler")));

SYN_ISR_ATTR void SysTick_Handler(void) __attribute__((weak, alias("Default_Handler")));

SYN_ISR_ATTR void USART1_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));

SYN_ISR_ATTR void CAN1_RX0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));

__attribute__((section(".vector_table"), used)) void (*const vector_table[])(void) = {
    Reset_Handler,
    NMI_Handler,
    HardFault_Handler,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    SysTick_Handler,
    0,
    0,
    USART1_IRQHandler,
    CAN1_RX0_IRQHandler};

void Reset_Handler(void)
{
    /* Initialize Stack Pointer sp */
    __asm__ volatile("la sp, _estack");

    /* Copy .data section from Flash to RAM */
    uint32_t *src = &_sidata;
    uint32_t *dst = &_sdata;
    while (dst < &_edata) {
        *dst++ = *src++;
    }

    /* Clear .bss section in RAM */
    dst = &_sbss;
    while (dst < &_ebss) {
        *dst++ = 0U;
    }

    /* Call application main */
    (void)main();

    /* Infinite loop if main returns */
    while (1) {
    }
}

SYN_ISR_ATTR void Default_Handler(void)
{
    while (1) {
    }
}