You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
214 lines
11 KiB
C
214 lines
11 KiB
C
|
1 year ago
|
/* File: startup_stm32c031xx.c for GNU-ARM
|
||
|
|
* Purpose: startup file for STM32C031xx Cortex-M0+ device.
|
||
|
|
* Should be used with GCC 'GNU Tools ARM Embedded'
|
||
|
|
* Version: CMSIS 5.0.1
|
||
|
|
* Date: 2017-09-13
|
||
|
|
*
|
||
|
|
* Modified by Quantum Leaps:
|
||
|
|
* - Added relocating of the Vector Table to free up the 256B region at 0x0
|
||
|
|
* for NULL-pointer protection by the MPU.
|
||
|
|
* - Modified all exception handlers to branch to assert_failed()
|
||
|
|
* instead of locking up the CPU inside an endless loop.
|
||
|
|
*
|
||
|
|
* Created from the CMSIS template for the specified device
|
||
|
|
* Quantum Leaps, www.state-machine.com
|
||
|
|
*
|
||
|
|
* NOTE:
|
||
|
|
* The function assert_failed defined at the end of this file defines
|
||
|
|
* the error/assertion handling policy for the application and might
|
||
|
|
* need to be customized for each project. This function is defined in
|
||
|
|
* assembly to re-set the stack pointer, in case it is corrupted by the
|
||
|
|
* time assert_failed is called.
|
||
|
|
*/
|
||
|
|
|
||
|
|
/* start and end of stack defined in the linker script ---------------------*/
|
||
|
|
/*extern int __stack_start__;*/
|
||
|
|
extern int __stack_end__;
|
||
|
|
|
||
|
|
/* Weak prototypes for error handlers --------------------------------------*/
|
||
|
|
/**
|
||
|
|
* \note
|
||
|
|
* The function assert_failed defined at the end of this file defines
|
||
|
|
* the error/assertion handling policy for the application and might
|
||
|
|
* need to be customized for each project. This function is defined in
|
||
|
|
* assembly to avoid accessing the stack, which might be corrupted by
|
||
|
|
* the time assert_failed is called.
|
||
|
|
*/
|
||
|
|
__attribute__ ((naked, noreturn))
|
||
|
|
void assert_failed(char const *module, int loc);
|
||
|
|
|
||
|
|
/* Function prototypes -----------------------------------------------------*/
|
||
|
|
void Default_Handler(void); /* Default empty handler */
|
||
|
|
void Reset_Handler(void); /* Reset Handler */
|
||
|
|
void SystemInit(void); /* CMSIS system initialization */
|
||
|
|
|
||
|
|
/*----------------------------------------------------------------------------
|
||
|
|
* weak aliases for each Exception handler to the Default_Handler.
|
||
|
|
* Any function with the same name will override these definitions.
|
||
|
|
*/
|
||
|
|
/* Cortex-M Processor fault exceptions... */
|
||
|
|
void NMI_Handler (void) __attribute__ ((weak));
|
||
|
|
void HardFault_Handler (void) __attribute__ ((weak));
|
||
|
|
void MemManage_Handler (void) __attribute__ ((weak));
|
||
|
|
void BusFault_Handler (void) __attribute__ ((weak));
|
||
|
|
void UsageFault_Handler (void) __attribute__ ((weak));
|
||
|
|
|
||
|
|
/* Cortex-M Processor non-fault exceptions... */
|
||
|
|
void SVC_Handler (void) __attribute__ ((weak, alias("Default_Handler")));
|
||
|
|
void DebugMon_Handler (void) __attribute__ ((weak, alias("Default_Handler")));
|
||
|
|
void PendSV_Handler (void) __attribute__ ((weak, alias("Default_Handler")));
|
||
|
|
void SysTick_Handler (void) __attribute__ ((weak, alias("Default_Handler")));
|
||
|
|
|
||
|
|
/* external interrupts... */
|
||
|
|
void WWDG_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
|
||
|
|
void Reserved1_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
|
||
|
|
void RTC_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
|
||
|
|
void FLASH_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
|
||
|
|
void RCC_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
|
||
|
|
void EXTI0_1_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
|
||
|
|
void EXTI2_3_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
|
||
|
|
void EXTI4_15_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
|
||
|
|
void Reserved8_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
|
||
|
|
void DMA1_Channel1_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler")));
|
||
|
|
void DMA1_Channel2_3_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler")));
|
||
|
|
void DMAMUX1_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
|
||
|
|
void ADC1_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
|
||
|
|
void TIM1_BRK_UP_TRG_COM_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler")));
|
||
|
|
void TIM1_CC_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
|
||
|
|
void Reserved15_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
|
||
|
|
void TIM3_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
|
||
|
|
void Reserved17_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
|
||
|
|
void Reserved18_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
|
||
|
|
void TIM14_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
|
||
|
|
void Reserved20_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
|
||
|
|
void TIM16_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
|
||
|
|
void TIM17_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
|
||
|
|
void I2C1_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
|
||
|
|
void Reserved24_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
|
||
|
|
void SPI1_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
|
||
|
|
void Reserved26_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
|
||
|
|
void USART1_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
|
||
|
|
void USART2_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
|
||
|
|
void Reserved29_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
|
||
|
|
void Reserved30_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
|
||
|
|
void Reserved31_IRQHandler (void) __attribute__ ((weak, alias("Default_Handler")));
|
||
|
|
|
||
|
|
/*..........................................................................*/
|
||
|
|
__attribute__ ((section(".isr_vector")))
|
||
|
|
int const g_pfnVectors[] = {
|
||
|
|
(int)&__stack_end__, /* Top of Stack */
|
||
|
|
(int)&Reset_Handler, /* Reset Handler */
|
||
|
|
(int)&NMI_Handler, /* NMI Handler */
|
||
|
|
(int)&HardFault_Handler, /* Hard Fault Handler */
|
||
|
|
(int)&Default_Handler, /* Reserved */
|
||
|
|
(int)&Default_Handler, /* Reserved */
|
||
|
|
(int)&Default_Handler, /* Reserved */
|
||
|
|
(int)&Default_Handler, /* Reserved */
|
||
|
|
(int)&Default_Handler, /* Reserved */
|
||
|
|
(int)&Default_Handler, /* Reserved */
|
||
|
|
(int)&Default_Handler, /* Reserved */
|
||
|
|
(int)&SVC_Handler, /* SVCall handler */
|
||
|
|
(int)&DebugMon_Handler, /* Debug monitor handler */
|
||
|
|
(int)&Default_Handler, /* Reserved */
|
||
|
|
(int)&PendSV_Handler, /* The PendSV handler */
|
||
|
|
(int)&SysTick_Handler, /* The SysTick handler */
|
||
|
|
|
||
|
|
/*IRQ handlers... */
|
||
|
|
(int)&WWDG_IRQHandler, /* [ 0] Window Watchdog */
|
||
|
|
(int)&Reserved1_IRQHandler, /* [ 1] Reserved */
|
||
|
|
(int)&RTC_IRQHandler, /* [ 2] RTC through EXTI Line */
|
||
|
|
(int)&FLASH_IRQHandler, /* [ 3] FLASH */
|
||
|
|
(int)&RCC_IRQHandler, /* [ 4] RCC */
|
||
|
|
(int)&EXTI0_1_IRQHandler, /* [ 5] EXTI Line 0 and 1 */
|
||
|
|
(int)&EXTI2_3_IRQHandler, /* [ 6] EXTI Line 2 and 3 */
|
||
|
|
(int)&EXTI4_15_IRQHandler, /* [ 7] EXTI Line 4 to 15 */
|
||
|
|
(int)&Reserved8_IRQHandler, /* [ 8] Reserved */
|
||
|
|
(int)&DMA1_Channel1_IRQHandler,/* [ 9] DMA1 Channel 1 */
|
||
|
|
(int)&DMA1_Channel2_3_IRQHandler,/* [10] DMA1 Channel 2 and Channel 3 */
|
||
|
|
(int)&DMAMUX1_IRQHandler, /* [11] DMAMUX */
|
||
|
|
(int)&ADC1_IRQHandler, /* [12] ADC1 */
|
||
|
|
(int)&TIM1_BRK_UP_TRG_COM_IRQHandler,/* [13] TIM1 Break,Update,Trigger & Comm */
|
||
|
|
(int)&TIM1_CC_IRQHandler, /* [14] TIM1 Capture Compare */
|
||
|
|
(int)&Reserved15_IRQHandler, /* [15] Reserved */
|
||
|
|
(int)&TIM3_IRQHandler, /* [16] TIM3 */
|
||
|
|
(int)&Reserved17_IRQHandler, /* [17] Reserved */
|
||
|
|
(int)&Reserved18_IRQHandler, /* [18] Reserved */
|
||
|
|
(int)&TIM14_IRQHandler, /* [19] TIM14 */
|
||
|
|
(int)&Reserved20_IRQHandler, /* [20] Reserved */
|
||
|
|
(int)&TIM16_IRQHandler, /* [21] TIM16 */
|
||
|
|
(int)&TIM17_IRQHandler, /* [22] TIM17 */
|
||
|
|
(int)&I2C1_IRQHandler, /* [23] I2C1 */
|
||
|
|
(int)&Reserved24_IRQHandler, /* [24] Reserved */
|
||
|
|
(int)&SPI1_IRQHandler, /* [25] SPI1 */
|
||
|
|
(int)&Reserved26_IRQHandler, /* [26] Reserved */
|
||
|
|
(int)&USART1_IRQHandler, /* [27] USART1 */
|
||
|
|
(int)&USART2_IRQHandler, /* [28] USART2 */
|
||
|
|
(int)&Reserved29_IRQHandler, /* [29] Reserved */
|
||
|
|
(int)&Reserved30_IRQHandler, /* [30] Reserved */
|
||
|
|
(int)&Reserved31_IRQHandler, /* [31] Reserved */
|
||
|
|
};
|
||
|
|
|
||
|
|
/* reset handler -----------------------------------------------------------*/
|
||
|
|
__attribute__((naked)) void Reset_Handler(void);
|
||
|
|
void Reset_Handler(void) {
|
||
|
|
extern int main(void);
|
||
|
|
extern int __libc_init_array(void);
|
||
|
|
extern unsigned __data_start; /* start of .data in the linker script */
|
||
|
|
extern unsigned __data_end__; /* end of .data in the linker script */
|
||
|
|
extern unsigned const __data_load; /* initialization values for .data */
|
||
|
|
extern unsigned __bss_start__; /* start of .bss in the linker script */
|
||
|
|
extern unsigned __bss_end__; /* end of .bss in the linker script */
|
||
|
|
extern void software_init_hook(void) __attribute__((weak));
|
||
|
|
|
||
|
|
SystemInit(); /* CMSIS system initialization */
|
||
|
|
|
||
|
|
/* copy the data segment initializers from flash to RAM... */
|
||
|
|
unsigned const *src = &__data_load;
|
||
|
|
unsigned *dst;
|
||
|
|
for (dst = &__data_start; dst < &__data_end__; ++dst, ++src) {
|
||
|
|
*dst = *src;
|
||
|
|
}
|
||
|
|
|
||
|
|
/* zero fill the .bss segment in RAM... */
|
||
|
|
for (dst = &__bss_start__; dst < &__bss_end__; ++dst) {
|
||
|
|
*dst = 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
/* init hook provided? */
|
||
|
|
if (&software_init_hook != (void (*)(void))(0)) {
|
||
|
|
/* give control to the RTOS */
|
||
|
|
software_init_hook(); /* this will also call __libc_init_array */
|
||
|
|
}
|
||
|
|
else {
|
||
|
|
/* call all static constructors in C++ (harmless in C programs) */
|
||
|
|
__libc_init_array();
|
||
|
|
(void)main(); /* application's entry point; should never return! */
|
||
|
|
}
|
||
|
|
|
||
|
|
/* the previous code should not return, but assert just in case... */
|
||
|
|
__asm volatile (" CPSID i");
|
||
|
|
assert_failed("Reset_Handler", 1U);
|
||
|
|
}
|
||
|
|
|
||
|
|
/* fault exception handlers ------------------------------------------------*/
|
||
|
|
__attribute__((naked)) void NMI_Handler(void);
|
||
|
|
void NMI_Handler(void) {
|
||
|
|
/* disable interrupts and reset SP in case of stack overflow */
|
||
|
|
__asm volatile (" CPSID i\n MOV sp,%0" : : "r" (&__stack_end__));
|
||
|
|
assert_failed("NMI", 1U);
|
||
|
|
}
|
||
|
|
/*..........................................................................*/
|
||
|
|
__attribute__((naked)) void HardFault_Handler(void);
|
||
|
|
void HardFault_Handler(void) {
|
||
|
|
/* disable interrupts and reset SP in case of stack overflow */
|
||
|
|
__asm volatile (" CPSID i\n MOV sp,%0" : : "r" (&__stack_end__));
|
||
|
|
assert_failed("HardFault", 1U);
|
||
|
|
}
|
||
|
|
/*..........................................................................*/
|
||
|
|
__attribute__((naked)) void Default_Handler(void);
|
||
|
|
void Default_Handler(void) {
|
||
|
|
/* disable interrupts and reset SP in case of stack overflow */
|
||
|
|
__asm volatile (" CPSID i\n MOV sp,%0" : : "r" (&__stack_end__));
|
||
|
|
assert_failed("Default", 1U);
|
||
|
|
}
|