From 5356bc886d53291a9a812f2aba35e4e165d96fba Mon Sep 17 00:00:00 2001 From: Matthew Wozniak Date: Thu, 11 Dec 2025 23:58:51 -0500 Subject: initial commit --- startup.c | 203 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 203 insertions(+) create mode 100644 startup.c (limited to 'startup.c') 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 + * + * 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 + +#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 -- cgit v1.2.3-54-g00ecf