summaryrefslogtreecommitdiff
path: root/startup.c
diff options
context:
space:
mode:
authorGravatar Matthew Wozniak <me@woz.blue> 2025-12-11 23:58:51 -0500
committerGravatar Matthew Wozniak <me@woz.blue> 2025-12-11 23:58:51 -0500
commit5356bc886d53291a9a812f2aba35e4e165d96fba (patch)
tree55fbe7e4f3cb54a5b8c43b40aba4771dc0465d8a /startup.c
downloadstm32_can_demo-5356bc886d53291a9a812f2aba35e4e165d96fba.tar.gz
stm32_can_demo-5356bc886d53291a9a812f2aba35e4e165d96fba.zip
initial commit
Diffstat (limited to 'startup.c')
-rw-r--r--startup.c203
1 files changed, 203 insertions, 0 deletions
diff --git a/startup.c b/startup.c
new file mode 100644
index 0000000..12d8784
--- /dev/null
+++ b/startup.c
@@ -0,0 +1,203 @@
+/*
+ * Copyright © Matthew Wozniak <me@woz.blue>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED “AS IS” AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+ * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+ * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/*
+ * This startup.c file is for the STM32F103C8T6 used on the bluepill boards, and
+ * while it may work for others I provide no guarntees.
+ */
+
+#include "intdefs.h"
+
+#define SRAM_START (0x20000000U)
+#define SRAM_SIZE (20U * 1024U)
+#define SRAM_END (SRAM_START + SRAM_SIZE)
+#define STACK_POINTER_INIT_ADDRESS (SRAM_END)
+
+#include <string.h>
+
+#define ISR_VECTOR_SIZE 76
+
+void reset_handler();
+void default_handler();
+void nmi_handler() __attribute__((weak, alias("default_handler")));
+void hardfault_handler() __attribute__((weak, alias("default_handler")));
+void memory_management_handler() __attribute__((weak, alias("default_handler")));
+void bus_fault_handler() __attribute__((weak, alias("default_handler")));
+void usage_fault_handler() __attribute__((weak, alias("default_handler")));
+void svcall_handler() __attribute__((weak, alias("default_handler")));
+void debug_monitor_handler() __attribute__((weak, alias("default_handler")));
+void pendsv_handler() __attribute__((weak, alias("default_handler")));
+void systick_handler() __attribute__((weak, alias("default_handler")));
+void wwdg_handler() __attribute__((weak, alias("default_handler")));
+void pvd_handler() __attribute__((weak, alias("default_handler")));
+void tamper_handler() __attribute__((weak, alias("default_handler")));
+void rtc_handler() __attribute__((weak, alias("default_handler")));
+void flash_handler() __attribute__((weak, alias("default_handler")));
+void rcc_handler() __attribute__((weak, alias("default_handler")));
+void exti0_handler() __attribute__((weak, alias("default_handler")));
+void exti1_handler() __attribute__((weak, alias("default_handler")));
+void exti2_handler() __attribute__((weak, alias("default_handler")));
+void exti3_handler() __attribute__((weak, alias("default_handler")));
+void exti4_handler() __attribute__((weak, alias("default_handler")));
+void dma1_channel1_handler() __attribute__((weak, alias("default_handler")));
+void dma1_channel2_handler() __attribute__((weak, alias("default_handler")));
+void dma1_channel3_handler() __attribute__((weak, alias("default_handler")));
+void dma1_channel4_handler() __attribute__((weak, alias("default_handler")));
+void dma1_channel5_handler() __attribute__((weak, alias("default_handler")));
+void dma1_channel6_handler() __attribute__((weak, alias("default_handler")));
+void dma1_channel7_handler() __attribute__((weak, alias("default_handler")));
+void adc_handler() __attribute__((weak, alias("default_handler")));
+void usbhp_cantx_handler() __attribute__((weak, alias("default_handler")));
+void usblp_canrx0_handler() __attribute__((weak, alias("default_handler")));
+void canrx1_handler() __attribute__((weak, alias("default_handler")));
+void cansce_handler() __attribute__((weak, alias("default_handler")));
+void exti9_5_handler() __attribute__((weak, alias("default_handler")));
+void tim1brk_handler() __attribute__((weak, alias("default_handler")));
+void tim1up_handler() __attribute__((weak, alias("default_handler")));
+void tim1trgcom_handler() __attribute__((weak, alias("default_handler")));
+void tim1cc_handler() __attribute__((weak, alias("default_handler")));
+void tim2_handler() __attribute__((weak, alias("default_handler")));
+void tim3_handler() __attribute__((weak, alias("default_handler")));
+void tim4_handler() __attribute__((weak, alias("default_handler")));
+void i2c1_ev_handler() __attribute__((weak, alias("default_handler")));
+void i2c1_er_handler() __attribute__((weak, alias("default_handler")));
+void i2c2_ev_handler() __attribute__((weak, alias("default_handler")));
+void i2c2_er_handler() __attribute__((weak, alias("default_handler")));
+void spi1_handler() __attribute__((weak, alias("default_handler")));
+void spi2_handler() __attribute__((weak, alias("default_handler")));
+void usart1_handler() __attribute__((weak, alias("default_handler")));
+void usart2_handler() __attribute__((weak, alias("default_handler")));
+void usart3_handler() __attribute__((weak, alias("default_handler")));
+void exti15_10_handler() __attribute__((weak, alias("default_handler")));
+void rtcalarm_handler() __attribute__((weak, alias("default_handler")));
+void usbwakeup_handler() __attribute__((weak, alias("default_handler")));
+void tim8brk_handler() __attribute__((weak, alias("default_handler")));
+void tim8up_handler() __attribute__((weak, alias("default_handler")));
+void tim8trgcom_handler() __attribute__((weak, alias("default_handler")));
+void tim8cc_handler() __attribute__((weak, alias("default_handler")));
+void adc3_handler() __attribute__((weak, alias("default_handler")));
+void fsmc_handler() __attribute__((weak, alias("default_handler")));
+void sdio_handler() __attribute__((weak, alias("default_handler")));
+void tim5_handler() __attribute__((weak, alias("default_handler")));
+void spi3_handler() __attribute__((weak, alias("default_handler")));
+void uart4_handler() __attribute__((weak, alias("default_handler")));
+void uart5_handler() __attribute__((weak, alias("default_handler")));
+void tim6_handler() __attribute__((weak, alias("default_handler")));
+void tim7_handler() __attribute__((weak, alias("default_handler")));
+void dma2_channel1_handler() __attribute__((weak, alias("default_handler")));
+void dma2_channel2_handler() __attribute__((weak, alias("default_handler")));
+void dma2_channel3_handler() __attribute__((weak, alias("default_handler")));
+void dma2_channel4_5_handler() __attribute__((weak, alias("default_handler")));
+
+void (*isr_vector[ISR_VECTOR_SIZE])() __attribute__((section(".isr_vector"))) = {
+ (void (*)())STACK_POINTER_INIT_ADDRESS,
+ reset_handler,
+ nmi_handler,
+ hardfault_handler,
+ memory_management_handler,
+ bus_fault_handler,
+ usage_fault_handler,
+ nullptr, /* reserved */
+ svcall_handler,
+ debug_monitor_handler,
+ nullptr, /* reserved */
+ nullptr,
+ nullptr,
+ nullptr,
+ pendsv_handler,
+ systick_handler,
+ wwdg_handler,
+ pvd_handler,
+ tamper_handler,
+ rtc_handler,
+ flash_handler,
+ rcc_handler,
+ exti0_handler,
+ exti1_handler,
+ exti2_handler,
+ exti3_handler,
+ exti4_handler,
+ dma1_channel1_handler,
+ dma1_channel2_handler,
+ dma1_channel3_handler,
+ dma1_channel4_handler,
+ dma1_channel5_handler,
+ dma1_channel6_handler,
+ dma1_channel7_handler,
+ adc_handler,
+ usbhp_cantx_handler,
+ usblp_canrx0_handler,
+ canrx1_handler,
+ cansce_handler,
+ exti9_5_handler,
+ tim1brk_handler,
+ tim1up_handler,
+ tim1trgcom_handler,
+ tim1cc_handler,
+ tim2_handler,
+ tim3_handler,
+ tim4_handler,
+ i2c1_ev_handler,
+ i2c1_er_handler,
+ i2c2_ev_handler,
+ i2c2_er_handler,
+ spi1_handler,
+ spi2_handler,
+ usart1_handler,
+ usart2_handler,
+ usart3_handler,
+ exti15_10_handler,
+ rtcalarm_handler,
+ usbwakeup_handler,
+ tim8brk_handler,
+ tim8up_handler,
+ tim8trgcom_handler,
+ tim8cc_handler,
+ adc3_handler,
+ fsmc_handler,
+ sdio_handler,
+ tim5_handler,
+ spi3_handler,
+ uart4_handler,
+ uart5_handler,
+ tim6_handler,
+ tim7_handler,
+ dma2_channel1_handler,
+ dma2_channel2_handler,
+ dma2_channel3_handler,
+ dma2_channel4_5_handler,
+};
+
+void default_handler() {
+ while (1) {}
+}
+
+extern u32 _etext, _sdata, _sidata, _edata, _sbss, _ebss;
+int main();
+
+void reset_handler() {
+ // copy .data from FLASH to SRAM
+ u32 data_sz = (u32)&_edata - (u32)&_sdata;
+ memcpy(&_sdata, &_sidata, data_sz);
+
+ // zero-fill .bss
+ memset(&_sbss, 0, (u32)&_ebss - (u32)&_sbss);
+
+ // run our program
+ main();
+}
+
+// vi: sw=4 ts=4 noet tw=80 cc=80