startup.c 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. /*
  2. * Copyright (C) 2023 Daniele Lacamera <root@danielinux.net>
  3. *
  4. * This program is free software: you can redistribute it and/or modify
  5. * it under the terms of the GNU Lesser General Public License as published by
  6. * the Free Software Foundation, either version 3 of the License, or
  7. * (at your option) any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU Lesser General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU Lesser General Public License
  15. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  16. */
  17. extern unsigned int _stored_data;
  18. extern unsigned int _start_data;
  19. extern unsigned int _end_data;
  20. extern unsigned int _start_bss;
  21. extern unsigned int _end_bss;
  22. extern unsigned int _end_stack;
  23. extern unsigned int _start_heap;
  24. static int zeroed_variable_in_bss;
  25. static int initialized_variable_in_data = 42;
  26. //#define STACK_PAINTING
  27. static volatile unsigned int avail_mem = 0;
  28. static unsigned int sp;
  29. extern void main(void);
  30. extern void isr_tim2(void);
  31. extern void isr_usart1(void);
  32. extern void isr_exti15_10(void);
  33. extern void isr_exti9_5(void);
  34. extern void isr_systick(void);
  35. extern void isr_exti2(void);
  36. extern void isr_exti3(void);
  37. extern void isr_exti0(void);
  38. extern void isr_exti4(void);
  39. void isr_reset(void) {
  40. register unsigned int *src, *dst;
  41. src = (unsigned int *) &_stored_data;
  42. dst = (unsigned int *) &_start_data;
  43. while (dst < (unsigned int *)&_end_data) {
  44. *dst = *src;
  45. dst++;
  46. src++;
  47. }
  48. dst = &_start_bss;
  49. while (dst < (unsigned int *)&_end_bss) {
  50. *dst = 0U;
  51. dst++;
  52. }
  53. avail_mem = &_end_stack - &_start_heap;
  54. main();
  55. }
  56. void isr_nmi(void)
  57. {
  58. /* Panic. */
  59. while(1) ;;
  60. }
  61. void isr_hardfault(void)
  62. {
  63. while(1);
  64. }
  65. void isr_memfault(void)
  66. {
  67. /* Panic. */
  68. while(1) ;;
  69. }
  70. void isr_busfault(void)
  71. {
  72. /* Panic. */
  73. while(1) ;;
  74. }
  75. void isr_usagefault(void)
  76. {
  77. /* Panic. */
  78. while(1) ;;
  79. }
  80. void isr_empty(void)
  81. {
  82. }
  83. __attribute__ ((section(".isr_vector")))
  84. void (* const IV[])(void) =
  85. {
  86. (void (*)(void))(&_end_stack),
  87. isr_reset, // Reset
  88. isr_nmi, // NMI
  89. isr_hardfault, // HardFault
  90. isr_memfault, // MemFault
  91. isr_busfault, // BusFault
  92. isr_usagefault, // UsageFault
  93. 0, 0, 0, 0, // 4x reserved
  94. isr_empty, // SVC
  95. isr_empty, // DebugMonitor
  96. 0, // reserved
  97. isr_empty, // PendSV
  98. isr_systick, // SysTick
  99. /* F7 Specific */
  100. isr_empty, // nvic_wwdg_isr(void);
  101. isr_empty, // pvd_isr(void);
  102. isr_empty, // tamp_stamp_isr(void);
  103. isr_empty, // rtc_wkup_isr(void);
  104. isr_empty, // flash_isr(void);
  105. isr_empty, // rcc_isr(void);
  106. isr_empty, // exti0_isr(void);
  107. isr_empty, // exti1_isr(void);
  108. isr_empty, // exti2_isr(void);
  109. isr_empty, // exti3_isr(void);
  110. isr_empty, // exti4_isr(void);
  111. isr_empty, // dma1_stream0_isr(void);
  112. isr_empty, // dma1_stream1_isr(void);
  113. isr_empty, // dma1_stream2_isr(void);
  114. isr_empty, // dma1_stream3_isr(void);
  115. isr_empty, // dma1_stream4_isr(void);
  116. isr_empty, // dma1_stream5_isr(void);
  117. isr_empty, // dma1_stream6_isr(void);
  118. isr_empty, // adc_isr(void);
  119. isr_empty, // can1_tx_isr(void);
  120. isr_empty, // can1_rx0_isr(void);
  121. isr_empty, // can1_rx1_isr(void);
  122. isr_empty, // can1_sce_isr(void);
  123. isr_exti9_5, // exti9_5_isr(void);
  124. isr_empty, // tim1_brk_tim9_isr(void);
  125. isr_empty, // tim1_up_tim10_isr(void);
  126. isr_empty, // tim1_trg_com_tim11_isr(void);
  127. isr_empty, // tim1_cc_isr(void);
  128. isr_tim2 , // tim2_isr(void);
  129. isr_empty, // tim3_isr(void);
  130. isr_empty, // tim4_isr(void);
  131. isr_empty, // i2c1_ev_isr(void);
  132. isr_empty, // i2c1_er_isr(void);
  133. isr_empty, // i2c2_ev_isr(void);
  134. isr_empty, // i2c2_er_isr(void);
  135. isr_empty, // spi1_isr(void);
  136. isr_empty, // spi2_isr(void);
  137. isr_usart1, // usart1_isr(void);
  138. isr_empty, // usart2_isr(void);
  139. isr_empty, // usart3_isr(void);
  140. isr_exti15_10, // exti15_10_isr(void);
  141. isr_empty, // rtc_alarm_isr(void);
  142. isr_empty, // usb_fs_wkup_isr(void);
  143. isr_empty, // tim8_brk_tim12_isr(void);
  144. isr_empty, // tim8_up_tim13_isr(void);
  145. isr_empty, // tim8_trg_com_tim14_isr(void);
  146. isr_empty, // tim8_cc_isr(void);
  147. isr_empty, // dma1_stream7_isr(void);
  148. isr_empty, // fsmc_isr(void);
  149. isr_empty, // sdmmc1_isr(void);
  150. isr_empty, // tim5_isr(void);
  151. isr_empty, // spi3_isr(void);
  152. isr_empty, // uart4_isr(void);
  153. isr_empty, // uart5_isr(void);
  154. isr_empty, // tim6_dac_isr(void);
  155. isr_empty, // tim7_isr(void);
  156. isr_empty, // dma2_stream0_isr(void);
  157. isr_empty, // dma2_stream1_isr(void);
  158. isr_empty, // dma2_stream2_isr(void);
  159. isr_empty, // dma2_stream3_isr(void);
  160. isr_empty, // dma2_stream4_isr(void);
  161. isr_empty, // eth_isr(void);
  162. isr_empty, // eth_wkup_isr(void);
  163. isr_empty, // can2_tx_isr(void);
  164. isr_empty, // can2_rx0_isr(void);
  165. isr_empty, // can2_rx1_isr(void);
  166. isr_empty, // can2_sce_isr(void);
  167. isr_empty, // otg_fs_isr(void);
  168. isr_empty, // dma2_stream5_isr(void);
  169. isr_empty, // dma2_stream6_isr(void);
  170. isr_empty, // dma2_stream7_isr(void);
  171. isr_empty, // usart6_isr(void);
  172. isr_empty, // i2c3_ev_isr(void);
  173. isr_empty, // i2c3_er_isr(void);
  174. isr_empty, // otg_hs_ep1_out_isr(void);
  175. isr_empty, // otg_hs_ep1_in_isr(void);
  176. isr_empty, // otg_hs_wkup_isr(void);
  177. isr_empty, // otg_hs_isr(void);
  178. isr_empty, // dcmi_isr(void);
  179. isr_empty, // cryp_isr(void);
  180. isr_empty, // hash_rng_isr(void);
  181. isr_empty, // fpu_isr(void);
  182. isr_empty, // uart7_isr(void);
  183. isr_empty, // uart8_isr(void);
  184. isr_empty, // spi4_isr(void);
  185. isr_empty, // spi5_isr(void);
  186. isr_empty, // spi6_isr(void);
  187. isr_empty, // sai1_isr(void);
  188. isr_empty, // lcd_tft_isr(void);
  189. isr_empty, // lcd_tft_err_isr(void);
  190. isr_empty, // dma2d_isr(void);
  191. isr_empty, // sai2_isr(void);
  192. isr_empty, // quadspi_isr(void);
  193. isr_empty, // i2c4_ev_isr(void);
  194. isr_empty, // i2c4_er_isr(void);
  195. isr_empty, // spdifrx_isr(void);
  196. };