/* * 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