24 #include "stm32/stm32f4xx_misc.h"
35 #include "freertos/FreeRTOS.h"
56 extern uint8_t __ccm_ram_bss_start;
57 extern uint8_t __ccm_ram_bss_end;
59 extern uint8_t __ccm_ram_dst_start;
60 extern uint8_t __ccm_ram_dst_end;
61 extern uint8_t __ccm_ram_src_start;
63 memset(&__ccm_ram_bss_start, 0x0, &__ccm_ram_bss_end - &__ccm_ram_bss_start);
64 memcpy(&__ccm_ram_dst_start,&__ccm_ram_src_start, &__ccm_ram_dst_end - & __ccm_ram_dst_start);
76 extern uint8_t _vectors_flash_start;
77 extern uint8_t _vectors_flash_end;
78 extern uint8_t _vectors_ram_start;
81 memcpy(&_vectors_ram_start, &_vectors_flash_start, &_vectors_flash_end - &_vectors_flash_start);
84 NVIC_SetVectorTable(SRAM_BASE, 0x00000000);
101 #ifdef HAVE_INITFINI_ARRAY
103 extern void __libc_init_array(
void);
104 extern void __libc_fini_array(
void);
105 atexit(__libc_fini_array);
116 extern uint8_t _sbss;
117 extern uint8_t _ebss;
124 memset(&_sbss, 0x0, &_ebss - &_sbss);
133 extern uint8_t _sidata;
134 extern uint8_t _sdata;
135 extern uint8_t _edata;
142 memcpy(&_sdata, &_sidata, &_edata - &_sdata);
150 time_t t = time(NULL);
160 settimeofday(&tv, NULL);
174 RCC->AHB1ENR = RCC_AHB1Periph_CCMDATARAMEN;
177 #if USE_GCC_STACK_PROTECTOR
178 uint32_t __stack_chk_guard;
185 __attribute__ ((noreturn))
194 extern int main(
int argc,
char *argv[]);
195 char main_str[] = {
"main"};
202 #if USE_GCC_STACK_PROTECTOR
203 __stack_chk_guard = 0xdeadBeef;
224 SystemCoreClockUpdate();
256 #if USE_FREERTOS && configUSE_TRACE_FACILITY
258 char time_string[26];
266 vTraceInitTraceData();
272 label = xTraceOpenLabel(
"Reset");
276 asctime_r(&tm, time_string);
277 vTracePrintF(label,
"Reset GMT time : %s", time_string);
280 if (rcc_csr == 0x0e000000)
282 vTracePrintF(label,
"RCC->CSR =0x%08x (First reset after power on)", rcc_csr);
284 else if (rcc_csr == 0x04000000)
286 vTracePrintF(label,
"RCC->CSR =0x%08x (Reset by reset pin)", rcc_csr);
290 vTracePrintF(label,
"RCC->CSR =0x%08x (%s%s%s%s%s%s%s)",
292 rcc_csr & RCC_CSR_LPWRRSTF ?
"LPWRRSTF " :
" ",
293 rcc_csr & RCC_CSR_WWDGRSTF ?
"WWDGRSTF " :
" ",
294 rcc_csr & RCC_CSR_WDGRSTF ?
"WDGRSTF " :
" ",
295 rcc_csr & RCC_CSR_SFTRSTF ?
"SFTRSTF " :
" ",
296 rcc_csr & RCC_CSR_PORRSTF ?
"PORRSTF " :
" ",
297 rcc_csr & RCC_CSR_PADRSTF ?
"PADRSTF " :
" ",
298 rcc_csr & RCC_CSR_BORRSTF ?
"BORRSTF " :
" "
310 portENABLE_INTERRUPTS();
331 void (*HardFault)(void);
332 void (*MemManage)(void);
333 void (*BusFault)(void);
334 void (*UsageFault)(void);
335 uint32_t _reserved_1[4];
337 void (*DebugMon)(void);
338 uint32_t _reserved_2[1];
339 void (*PendSV)(void);
340 void (*SysTick_)(void);
343 void (*WWDG_IRQ)(void);
344 void (*PVD_IRQ)(void);
345 void (*TAMP_STAMP_IRQ)(void);
346 void (*RTC_WKUP_IRQ)(void);
347 void (*FLASH_IRQ)(void);
348 void (*RCC_IRQ)(void);
349 void (*EXTI0_IRQ)(void);
350 void (*EXTI1_IRQ)(void);
351 void (*EXTI2_IRQ)(void);
352 void (*EXTI3_IRQ)(void);
353 void (*EXTI4_IRQ)(void);
354 void (*DMA1_Stream0_IRQ)(void);
355 void (*DMA1_Stream1_IRQ)(void);
356 void (*DMA1_Stream2_IRQ)(void);
357 void (*DMA1_Stream3_IRQ)(void);
358 void (*DMA1_Stream4_IRQ)(void);
359 void (*DMA1_Stream5_IRQ)(void);
360 void (*DMA1_Stream6_IRQ)(void);
361 void (*ADC_IRQ)(void);
362 void (*CAN1_TX_IRQ)(void);
363 void (*CAN1_RX0_IRQ)(void);
364 void (*CAN1_RX1_IRQ)(void);
365 void (*CAN1_SCE_IRQ)(void);
366 void (*EXTI9_5_IRQ)(void);
367 void (*TIM1_BRK_TIM9_IRQ)(void);
368 void (*TIM1_UP_TIM10_IRQ)(void);
369 void (*TIM1_TRG_COM_TIM11_IRQ)(void);
370 void (*TIM1_CC_IRQ)(void);
371 void (*TIM2_IRQ)(void);
372 void (*TIM3_IRQ)(void);
373 void (*TIM4_IRQ)(void);
374 void (*I2C1_EV_IRQ)(void);
375 void (*I2C1_ER_IRQ)(void);
376 void (*I2C2_EV_IRQ)(void);
377 void (*I2C2_ER_IRQ)(void);
378 void (*SPI1_IRQ)(void);
379 void (*SPI2_IRQ)(void);
380 void (*USART1_IRQ)(void);
381 void (*USART2_IRQ)(void);
382 void (*USART3_IRQ)(void);
383 void (*EXTI15_10_IRQ)(void);
384 void (*RTC_Alarm_IRQ)(void);
385 void (*OTG_FS_WKUP_IRQ)(void);
386 void (*TIM8_BRK_TIM12_IRQ)(void);
387 void (*TIM8_UP_TIM13_IRQ)(void);
388 void (*TIM8_TRG_COM_TIM14_IRQ)(void);
389 void (*TIM8_CC_IRQ)(void);
390 void (*DMA1_Stream7_IRQ)(void);
391 void (*FSMC_IRQ)(void);
392 void (*SDIO_IRQ)(void);
393 void (*TIM5_IRQ)(void);
394 void (*SPI3_IRQ)(void);
395 void (*UART4_IRQ)(void);
396 void (*UART5_IRQ)(void);
397 void (*TIM6_DAC_IRQ)(void);
398 void (*TIM7_IRQ)(void);
399 void (*DMA2_Stream0_IRQ)(void);
400 void (*DMA2_Stream1_IRQ)(void);
401 void (*DMA2_Stream2_IRQ)(void);
402 void (*DMA2_Stream3_IRQ)(void);
403 void (*DMA2_Stream4_IRQ)(void);
404 void (*ETH_IRQ)(void);
405 void (*ETH_WKUP_IRQ)(void);
406 void (*CAN2_TX_IRQ)(void);
407 void (*CAN2_RX0_IRQ)(void);
408 void (*CAN2_RX1_IRQ)(void);
409 void (*CAN2_SCE_IRQ)(void);
410 void (*OTG_FS_IRQ)(void);
411 void (*DMA2_Stream5_IRQ)(void);
412 void (*DMA2_Stream6_IRQ)(void);
413 void (*DMA2_Stream7_IRQ)(void);
414 void (*USART6_IRQ)(void);
415 void (*I2C3_EV_IRQ)(void);
416 void (*I2C3_ER_IRQ)(void);
417 void (*OTG_HS_EP1_OUT_IRQ)(void);
418 void (*OTG_HS_EP1_IN_IRQ)(void);
419 void (*OTG_HS_WKUP_IRQ)(void);
420 void (*OTG_HS_IRQ)(void);
421 void (*DCMI_IRQ)(void);
422 void (*CRYP_IRQ)(void);
423 void (*HASH_RNG_IRQ)(void);
424 void (*FPU_IRQ)(void);
430 struct hardfault_regs_t
489 (void)regs_when_hardfault;
498 __attribute__ ((weak, naked)) void HardFault_Handler(
void)
506 " ldr r1, [r0, #24] \n"
507 " ldr r2, HardFaultHelper_addr \n"
510 "HardFaultHelper_addr: .word HardFaultHelper \n"
616 .HardFault = HardFault_Handler,
617 .MemManage = MemManage_Handler,
618 .BusFault = BusFault_Handler,
619 .UsageFault = UsageFault_Handler,
622 .DebugMon = DebugMon_Handler,
624 .PendSV = PendSV_Handler,
625 .SysTick_ = SysTick_Handler,
628 .WWDG_IRQ = WWDG_IRQ_Handler,
629 .PVD_IRQ = PVD_IRQ_Handler,
630 .TAMP_STAMP_IRQ = TAMP_STAMP_IRQ_Handler,
631 .RTC_WKUP_IRQ = RTC_WKUP_IRQ_Handler,
632 .FLASH_IRQ = FLASH_IRQ_Handler,
633 .RCC_IRQ = RCC_IRQ_Handler,
634 .EXTI0_IRQ = EXTI0_IRQ_Handler,
635 .EXTI1_IRQ = EXTI1_IRQ_Handler,
636 .EXTI2_IRQ = EXTI2_IRQ_Handler,
637 .EXTI3_IRQ = EXTI3_IRQ_Handler,
638 .EXTI4_IRQ = EXTI4_IRQ_Handler,
639 .DMA1_Stream0_IRQ = DMA1_Stream0_IRQ_Handler,
640 .DMA1_Stream1_IRQ = DMA1_Stream1_IRQ_Handler,
641 .DMA1_Stream2_IRQ = DMA1_Stream2_IRQ_Handler,
642 .DMA1_Stream3_IRQ = DMA1_Stream3_IRQ_Handler,
643 .DMA1_Stream4_IRQ = DMA1_Stream4_IRQ_Handler,
644 .DMA1_Stream5_IRQ = DMA1_Stream5_IRQ_Handler,
645 .DMA1_Stream6_IRQ = DMA1_Stream6_IRQ_Handler,
646 .ADC_IRQ = ADC_IRQ_Handler,
647 .CAN1_TX_IRQ = CAN1_TX_IRQ_Handler,
648 .CAN1_RX0_IRQ = CAN1_RX0_IRQ_Handler,
649 .CAN1_RX1_IRQ = CAN1_RX1_IRQ_Handler,
650 .CAN1_SCE_IRQ = CAN1_SCE_IRQ_Handler,
651 .EXTI9_5_IRQ = EXTI9_5_IRQ_Handler,
652 .TIM1_BRK_TIM9_IRQ = TIM1_BRK_TIM9_IRQ_Handler,
653 .TIM1_UP_TIM10_IRQ = TIM1_UP_TIM10_IRQ_Handler,
654 .TIM1_TRG_COM_TIM11_IRQ = TIM1_TRG_COM_TIM11_IRQ_Handler,
655 .TIM1_CC_IRQ = TIM1_CC_IRQ_Handler,
656 .TIM2_IRQ = TIM2_IRQ_Handler,
657 .TIM3_IRQ = TIM3_IRQ_Handler,
658 .TIM4_IRQ = TIM4_IRQ_Handler,
659 .I2C1_EV_IRQ = I2C1_EV_IRQ_Handler,
660 .I2C1_ER_IRQ = I2C1_ER_IRQ_Handler,
661 .I2C2_EV_IRQ = I2C2_EV_IRQ_Handler,
662 .I2C2_ER_IRQ = I2C2_ER_IRQ_Handler,
663 .SPI1_IRQ = SPI1_IRQ_Handler,
664 .SPI2_IRQ = SPI2_IRQ_Handler,
665 .USART1_IRQ = USART1_IRQ_Handler,
666 .USART2_IRQ = USART2_IRQ_Handler,
667 .USART3_IRQ = USART3_IRQ_Handler,
668 .EXTI15_10_IRQ = EXTI15_10_IRQ_Handler,
669 .RTC_Alarm_IRQ = RTC_Alarm_IRQ_Handler,
670 .OTG_FS_WKUP_IRQ = OTG_FS_WKUP_IRQ_Handler,
671 .TIM8_BRK_TIM12_IRQ = TIM8_BRK_TIM12_IRQ_Handler,
672 .TIM8_UP_TIM13_IRQ = TIM8_UP_TIM13_IRQ_Handler,
673 .TIM8_TRG_COM_TIM14_IRQ = TIM8_TRG_COM_TIM14_IRQ_Handler,
674 .TIM8_CC_IRQ = TIM8_CC_IRQ_Handler,
675 .DMA1_Stream7_IRQ = DMA1_Stream7_IRQ_Handler,
676 .FSMC_IRQ = FSMC_IRQ_Handler,
677 .SDIO_IRQ = SDIO_IRQ_Handler,
678 .TIM5_IRQ = TIM5_IRQ_Handler,
679 .SPI3_IRQ = SPI3_IRQ_Handler,
680 .UART4_IRQ = UART4_IRQ_Handler,
681 .UART5_IRQ = UART5_IRQ_Handler,
682 .TIM6_DAC_IRQ = TIM6_DAC_IRQ_Handler,
683 .TIM7_IRQ = TIM7_IRQ_Handler,
684 .DMA2_Stream0_IRQ = DMA2_Stream0_IRQ_Handler,
685 .DMA2_Stream1_IRQ = DMA2_Stream1_IRQ_Handler,
686 .DMA2_Stream2_IRQ = DMA2_Stream2_IRQ_Handler,
687 .DMA2_Stream3_IRQ = DMA2_Stream3_IRQ_Handler,
688 .DMA2_Stream4_IRQ = DMA2_Stream4_IRQ_Handler,
689 .ETH_IRQ = ETH_IRQ_Handler,
690 .ETH_WKUP_IRQ = ETH_WKUP_IRQ_Handler,
691 .CAN2_TX_IRQ = CAN2_TX_IRQ_Handler,
692 .CAN2_RX0_IRQ = CAN2_RX0_IRQ_Handler,
693 .CAN2_RX1_IRQ = CAN2_RX1_IRQ_Handler,
694 .CAN2_SCE_IRQ = CAN2_SCE_IRQ_Handler,
695 .OTG_FS_IRQ = OTG_FS_IRQ_Handler,
696 .DMA2_Stream5_IRQ = DMA2_Stream5_IRQ_Handler,
697 .DMA2_Stream6_IRQ = DMA2_Stream6_IRQ_Handler,
698 .DMA2_Stream7_IRQ = DMA2_Stream7_IRQ_Handler,
699 .USART6_IRQ = USART6_IRQ_Handler,
700 .I2C3_EV_IRQ = I2C3_EV_IRQ_Handler,
701 .I2C3_ER_IRQ = I2C3_ER_IRQ_Handler,
702 .OTG_HS_EP1_OUT_IRQ = OTG_HS_EP1_OUT_IRQ_Handler,
703 .OTG_HS_EP1_IN_IRQ = OTG_HS_EP1_IN_IRQ_Handler,
704 .OTG_HS_WKUP_IRQ = OTG_HS_WKUP_IRQ_Handler,
705 .OTG_HS_IRQ = OTG_HS_IRQ_Handler,
706 .DCMI_IRQ = DCMI_IRQ_Handler,
707 .CRYP_IRQ = CRYP_IRQ_Handler,
708 .HASH_RNG_IRQ = HASH_RNG_IRQ_Handler,
709 .FPU_IRQ = FPU_IRQ_Handler,
This file contains all the functions prototypes for the RCC firmware library.
#define NVIC_PriorityGroup_4
BSP - Board Support Package.
void bsp_reset_reason_clear(void)
Reset reason clear.
static void workaround_dfu_loader(void)
Workaround DFU problem.
static void init_ccm_ram(void)
CCM RAM initialization.
#define breakpoint()
Breakpoint (from code)
void * memcpy(void *dest, const void *src, size_t n)
void * memset(void *dest, int n, size_t n)
libheivs configuration file
void bsp_fatal(status_e status)
fatal error
Function called at bad time.
static void interrupts_init(void)
Interrupts initializations.
static void libc_init_array(void)
Initialize newlib c++ runtime.
const struct vector_table_t gVectors
The vector table, placed in the .isr_vector section.
Default interrupt handler fired.
void HardFaultHelper(volatile struct hardfault_regs_t *regs_when_hardfault)
void Reset_Handler(void)
Program start (at reset)
int main(int argc, char *argv[])
Main function.
static void init_data(void)
Initialize (copy from flash) the .data section.
static void init_bss(void)
zeroes the .bss section
uint32_t bsp_reset_reason_get(void)
Reset reason get.
static void fix_rtc(void)
void bsp_reset_reason_init(void)
Reset reason initialization.
#define debugger_is_connected()
Detect is debugger is connected.
#define ARRAY_SIZE(x)
Number of elements in the array.
status_e bsp_init(void)
Initialize the whole board.
CMSIS Cortex-M4 Device System Source File for STM32F4xx devices.
uint32_t _stack_start
Stack base, set by the linker script.