summaryrefslogtreecommitdiff
path: root/app/platform/stm32f0-gcc/startup
diff options
context:
space:
mode:
Diffstat (limited to 'app/platform/stm32f0-gcc/startup')
-rw-r--r--app/platform/stm32f0-gcc/startup/handlers_cm.c113
-rw-r--r--app/platform/stm32f0-gcc/startup/stack.cpp7
-rw-r--r--app/platform/stm32f0-gcc/startup/startup.cpp96
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);
+}