diff options
Diffstat (limited to 'app/platform/stm32f0-gcc/startup')
-rw-r--r-- | app/platform/stm32f0-gcc/startup/handlers_cm.c | 113 | ||||
-rw-r--r-- | app/platform/stm32f0-gcc/startup/stack.cpp | 7 | ||||
-rw-r--r-- | app/platform/stm32f0-gcc/startup/startup.cpp | 96 |
3 files changed, 216 insertions, 0 deletions
diff --git a/app/platform/stm32f0-gcc/startup/handlers_cm.c b/app/platform/stm32f0-gcc/startup/handlers_cm.c new file mode 100644 index 0000000..95b59a9 --- /dev/null +++ b/app/platform/stm32f0-gcc/startup/handlers_cm.c @@ -0,0 +1,113 @@ +/** + * Handlers setup code for Cortex-M. + */ + +typedef void (*ptr_func_t)(); + +// Undefined handler is pointing to this function, this stop MCU. +// This function name must by not mangled, so must be C, +// because alias("..") is working only with C code +void __stop() { while (1); } + +// Handlers for Cortex-M core. +// These handler are with attribute 'weak' and can be overwritten +// by non-weak function, default is __stop() function +__attribute__((weak, alias("__stop"))) void RESET_handler(); +__attribute__((weak, alias("__stop"))) void NMI_handler(); +__attribute__((weak, alias("__stop"))) void HARDFAULT_handler(); +__attribute__((weak, alias("__stop"))) void MEMMANAGE_handler(); +__attribute__((weak, alias("__stop"))) void BUSFAULT_handler(); +__attribute__((weak, alias("__stop"))) void USAGEFAULT_handler(); +__attribute__((weak, alias("__stop"))) void SVCALL_handler(); +__attribute__((weak, alias("__stop"))) void DEBUGMONITOR_handler(); +__attribute__((weak, alias("__stop"))) void PENDSV_handler(); +__attribute__((weak, alias("__stop"))) void SYSTICK_handler(); + +// Handlers for peripherals' interrupts +__attribute__((weak, alias("__stop"))) void WWDG_handler(); +__attribute__((weak, alias("__stop"))) void PVD_VDDIO2_handler(); +__attribute__((weak, alias("__stop"))) void RTC_handler(); +__attribute__((weak, alias("__stop"))) void FLASH_handler(); +__attribute__((weak, alias("__stop"))) void RCC_CRS_handler(); +__attribute__((weak, alias("__stop"))) void EXTI0_1_handler(); +__attribute__((weak, alias("__stop"))) void EXTI2_3_handler(); +__attribute__((weak, alias("__stop"))) void EXTI4_15_handler(); +__attribute__((weak, alias("__stop"))) void TSC_handler(); +__attribute__((weak, alias("__stop"))) void DMA_0064_handler(); +__attribute__((weak, alias("__stop"))) void DMA_DMA2_0068_handler(); +__attribute__((weak, alias("__stop"))) void DMA_DMA2_006C_handler(); +__attribute__((weak, alias("__stop"))) void ADC_COMP_handler(); +__attribute__((weak, alias("__stop"))) void TIM1_0074_handler(); +__attribute__((weak, alias("__stop"))) void TIM1_0078_handler(); +__attribute__((weak, alias("__stop"))) void TIM2_handler(); +__attribute__((weak, alias("__stop"))) void TIM3_handler(); +__attribute__((weak, alias("__stop"))) void TIM6_DAC_handler(); +__attribute__((weak, alias("__stop"))) void TIM7_handler(); +__attribute__((weak, alias("__stop"))) void TIM14_handler(); +__attribute__((weak, alias("__stop"))) void TIM15_handler(); +__attribute__((weak, alias("__stop"))) void TIM16_handler(); +__attribute__((weak, alias("__stop"))) void TIM17_handler(); +__attribute__((weak, alias("__stop"))) void I2C1_handler(); +__attribute__((weak, alias("__stop"))) void I2C2_handler(); +__attribute__((weak, alias("__stop"))) void SPI1_handler(); +__attribute__((weak, alias("__stop"))) void SPI2_handler(); +__attribute__((weak, alias("__stop"))) void USART1_handler(); +__attribute__((weak, alias("__stop"))) void USART2_handler(); +__attribute__((weak, alias("__stop"))) void USART_00B3_handler(); +__attribute__((weak, alias("__stop"))) void CEC_CAN_handler(); +__attribute__((weak, alias("__stop"))) void USB_handler(); + +// Dummy handler (for unused vectors) +__attribute__((weak, alias("__stop"))) void DUMMY_handler(); + +// Vector table for handlers +// This array will be placed in ".vectors" section defined in linker script. +__attribute__((section(".vectors"), used)) ptr_func_t __isr_vectors[] = { + RESET_handler, + NMI_handler, + HARDFAULT_handler, + MEMMANAGE_handler, + BUSFAULT_handler, + USAGEFAULT_handler, + DUMMY_handler, + DUMMY_handler, + DUMMY_handler, + DUMMY_handler, + SVCALL_handler, + DEBUGMONITOR_handler, + DUMMY_handler, + PENDSV_handler, + SYSTICK_handler, + WWDG_handler, + PVD_VDDIO2_handler, + RTC_handler, + FLASH_handler, + RCC_CRS_handler, + EXTI0_1_handler, + EXTI2_3_handler, + EXTI4_15_handler, + TSC_handler, + DMA_0064_handler, + DMA_DMA2_0068_handler, + DMA_DMA2_006C_handler, + ADC_COMP_handler, + TIM1_0074_handler, + TIM1_0078_handler, + TIM2_handler, + TIM3_handler, + TIM6_DAC_handler, + TIM7_handler, + TIM14_handler, + TIM15_handler, + TIM16_handler, + TIM17_handler, + I2C1_handler, + I2C2_handler, + SPI1_handler, + SPI2_handler, + USART1_handler, + USART2_handler, + USART_00B3_handler, + CEC_CAN_handler, + USB_handler, +}; diff --git a/app/platform/stm32f0-gcc/startup/stack.cpp b/app/platform/stm32f0-gcc/startup/stack.cpp new file mode 100644 index 0000000..d10595c --- /dev/null +++ b/app/platform/stm32f0-gcc/startup/stack.cpp @@ -0,0 +1,7 @@ +// stack definition code + +// top of stack +extern unsigned __stacktop; + +// initial stack pointer is first address of program +__attribute__((section(".stack"), used)) unsigned *__stack_init = &__stacktop; diff --git a/app/platform/stm32f0-gcc/startup/startup.cpp b/app/platform/stm32f0-gcc/startup/startup.cpp new file mode 100644 index 0000000..95276ae --- /dev/null +++ b/app/platform/stm32f0-gcc/startup/startup.cpp @@ -0,0 +1,96 @@ +// very simple startup code with definition of handlers for all cortex-m cores + +typedef void (*ptr_func_t)(); + +// main application +extern "C" int main(); + +// location of these variables is defined in linker script +extern unsigned __data_start; +extern unsigned __data_end; +extern unsigned __data_load; + +extern unsigned __bss_start; +extern unsigned __bss_end; + +extern unsigned __heap_start; + +extern ptr_func_t __preinit_array_start[]; +extern ptr_func_t __preinit_array_end[]; + +extern ptr_func_t __init_array_start[]; +extern ptr_func_t __init_array_end[]; + +extern ptr_func_t __fini_array_start[]; +extern ptr_func_t __fini_array_end[]; + + +/** Copy default data to DATA section + */ +void copy_data() { + unsigned *src = &__data_load; + unsigned *dst = &__data_start; + while (dst < &__data_end) { + *dst++ = *src++; + } +} + +/** Erase BSS section + */ +void zero_bss() { + unsigned *dst = &__bss_start; + while (dst < &__bss_end) { + *dst++ = 0; + } +} + +/** Fill heap memory + */ +void fill_heap(unsigned fill=0x45455246) { + unsigned *dst = &__heap_start; + unsigned *msp_reg; + __asm__("mrs %0, msp\n" : "=r" (msp_reg) ); + while (dst < msp_reg) { + *dst++ = fill; + } +} + +/** Call constructors for static objects + */ +void call_init_array() { + auto array = __preinit_array_start; + while (array < __preinit_array_end) { + (*array)(); + array++; + } + + array = __init_array_start; + while (array < __init_array_end) { + (*array)(); + array++; + } +} + +/** Call destructors for static objects + */ +void call_fini_array() { + auto array = __fini_array_start; + while (array < __fini_array_end) { + (*array)(); + array++; + } +} + +// reset handler +extern "C" void RESET_handler() { + copy_data(); + zero_bss(); + fill_heap(); + call_init_array(); + // run application + main(); + // call destructors for static instances + call_fini_array(); + // stop + while (true); +} |