startup.c 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. /* (c) Daniele Lacamera 2019
  2. * GPL
  3. */
  4. extern unsigned int _stored_data;
  5. extern unsigned int _start_data;
  6. extern unsigned int _end_data;
  7. extern unsigned int _start_bss;
  8. extern unsigned int _end_bss;
  9. extern unsigned int _end_stack;
  10. extern unsigned int _start_heap;
  11. static int zeroed_variable_in_bss;
  12. static int initialized_variable_in_data = 42;
  13. //#define STACK_PAINTING
  14. static volatile unsigned int avail_mem = 0;
  15. static unsigned int sp;
  16. extern void main(void);
  17. extern void isr_tim2(void);
  18. extern void isr_exti15_10(void);
  19. extern void isr_exti2(void);
  20. void isr_reset(void) {
  21. register unsigned int *src, *dst;
  22. src = (unsigned int *) &_stored_data;
  23. dst = (unsigned int *) &_start_data;
  24. while (dst < (unsigned int *)&_end_data) {
  25. *dst = *src;
  26. dst++;
  27. src++;
  28. }
  29. dst = &_start_bss;
  30. while (dst < (unsigned int *)&_end_bss) {
  31. *dst = 0U;
  32. dst++;
  33. }
  34. avail_mem = &_end_stack - &_start_heap;
  35. main();
  36. }
  37. void isr_fault(void)
  38. {
  39. /* Panic. */
  40. while(1) ;;
  41. }
  42. void isr_memfault(void)
  43. {
  44. /* Panic. */
  45. while(1) ;;
  46. }
  47. void isr_busfault(void)
  48. {
  49. /* Panic. */
  50. while(1) ;;
  51. }
  52. void isr_usagefault(void)
  53. {
  54. /* Panic. */
  55. while(1) ;;
  56. }
  57. void isr_empty(void)
  58. {
  59. while(1);
  60. }
  61. __attribute__ ((section(".isr_vector")))
  62. void (* const IV[])(void) =
  63. {
  64. (void (*)(void))(&_end_stack),
  65. isr_reset, // Reset
  66. isr_fault, // NMI
  67. isr_fault, // HardFault
  68. isr_memfault, // MemFault
  69. isr_busfault, // BusFault
  70. isr_usagefault, // UsageFault
  71. 0, 0, 0, 0, // 4x reserved
  72. isr_empty, // SVC
  73. isr_empty, // DebugMonitor
  74. 0, // reserved
  75. isr_empty, // PendSV
  76. isr_empty, // SysTick
  77. /* F7 Specific */
  78. isr_empty, // nvic_wwdg_isr(void);
  79. isr_empty, // pvd_isr(void);
  80. isr_empty, // tamp_stamp_isr(void);
  81. isr_empty, // rtc_wkup_isr(void);
  82. isr_empty, // flash_isr(void);
  83. isr_empty, // rcc_isr(void);
  84. isr_empty, // exti0_isr(void);
  85. isr_empty, // exti1_isr(void);
  86. isr_exti2, // exti2_isr(void);
  87. isr_empty, // exti3_isr(void);
  88. isr_empty, // exti4_isr(void);
  89. isr_empty, // dma1_stream0_isr(void);
  90. isr_empty, // dma1_stream1_isr(void);
  91. isr_empty, // dma1_stream2_isr(void);
  92. isr_empty, // dma1_stream3_isr(void);
  93. isr_empty, // dma1_stream4_isr(void);
  94. isr_empty, // dma1_stream5_isr(void);
  95. isr_empty, // dma1_stream6_isr(void);
  96. isr_empty, // adc_isr(void);
  97. isr_empty, // can1_tx_isr(void);
  98. isr_empty, // can1_rx0_isr(void);
  99. isr_empty, // can1_rx1_isr(void);
  100. isr_empty, // can1_sce_isr(void);
  101. isr_empty, // exti9_5_isr(void);
  102. isr_empty, // tim1_brk_tim9_isr(void);
  103. isr_empty, // tim1_up_tim10_isr(void);
  104. isr_empty, // tim1_trg_com_tim11_isr(void);
  105. isr_empty, // tim1_cc_isr(void);
  106. isr_empty, // tim2_isr(void);
  107. isr_empty, // tim3_isr(void);
  108. isr_empty, // tim4_isr(void);
  109. isr_empty, // i2c1_ev_isr(void);
  110. isr_empty, // i2c1_er_isr(void);
  111. isr_empty, // i2c2_ev_isr(void);
  112. isr_empty, // i2c2_er_isr(void);
  113. isr_empty, // spi1_isr(void);
  114. isr_empty, // spi2_isr(void);
  115. isr_empty, // usart1_isr(void);
  116. isr_empty, // usart2_isr(void);
  117. isr_empty, // usart3_isr(void);
  118. isr_exti15_10, // exti15_10_isr(void);
  119. isr_empty, // rtc_alarm_isr(void);
  120. isr_empty, // usb_fs_wkup_isr(void);
  121. isr_empty, // tim8_brk_tim12_isr(void);
  122. isr_empty, // tim8_up_tim13_isr(void);
  123. isr_empty, // tim8_trg_com_tim14_isr(void);
  124. isr_empty, // tim8_cc_isr(void);
  125. isr_empty, // dma1_stream7_isr(void);
  126. isr_empty, // fsmc_isr(void);
  127. isr_empty, // sdmmc1_isr(void);
  128. isr_empty, // tim5_isr(void);
  129. isr_empty, // spi3_isr(void);
  130. isr_empty, // uart4_isr(void);
  131. isr_empty, // uart5_isr(void);
  132. isr_empty, // tim6_dac_isr(void);
  133. isr_empty, // tim7_isr(void);
  134. isr_empty, // dma2_stream0_isr(void);
  135. isr_empty, // dma2_stream1_isr(void);
  136. isr_empty, // dma2_stream2_isr(void);
  137. isr_empty, // dma2_stream3_isr(void);
  138. isr_empty, // dma2_stream4_isr(void);
  139. isr_empty, // eth_isr(void);
  140. isr_empty, // eth_wkup_isr(void);
  141. isr_empty, // can2_tx_isr(void);
  142. isr_empty, // can2_rx0_isr(void);
  143. isr_empty, // can2_rx1_isr(void);
  144. isr_empty, // can2_sce_isr(void);
  145. isr_empty, // otg_fs_isr(void);
  146. isr_empty, // dma2_stream5_isr(void);
  147. isr_empty, // dma2_stream6_isr(void);
  148. isr_empty, // dma2_stream7_isr(void);
  149. isr_empty, // usart6_isr(void);
  150. isr_empty, // i2c3_ev_isr(void);
  151. isr_empty, // i2c3_er_isr(void);
  152. isr_empty, // otg_hs_ep1_out_isr(void);
  153. isr_empty, // otg_hs_ep1_in_isr(void);
  154. isr_empty, // otg_hs_wkup_isr(void);
  155. isr_empty, // otg_hs_isr(void);
  156. isr_empty, // dcmi_isr(void);
  157. isr_empty, // cryp_isr(void);
  158. isr_empty, // hash_rng_isr(void);
  159. isr_empty, // fpu_isr(void);
  160. isr_empty, // uart7_isr(void);
  161. isr_empty, // uart8_isr(void);
  162. isr_empty, // spi4_isr(void);
  163. isr_empty, // spi5_isr(void);
  164. isr_empty, // spi6_isr(void);
  165. isr_empty, // sai1_isr(void);
  166. isr_empty, // lcd_tft_isr(void);
  167. isr_empty, // lcd_tft_err_isr(void);
  168. isr_empty, // dma2d_isr(void);
  169. isr_empty, // sai2_isr(void);
  170. isr_empty, // quadspi_isr(void);
  171. isr_empty, // i2c4_ev_isr(void);
  172. isr_empty, // i2c4_er_isr(void);
  173. isr_empty, // spdifrx_isr(void);
  174. };