startup_m480.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. // SPDX-License-Identifier: BSD-3-Clause
  2. // Copyright (c) 2022, Alex Taradov <alex@taradov.com>. All rights reserved.
  3. /*- Includes ----------------------------------------------------------------*/
  4. #include "M480.h"
  5. /*- Definitions -------------------------------------------------------------*/
  6. #define DUMMY __attribute__ ((weak, alias ("irq_handler_dummy")))
  7. /*- Prototypes --------------------------------------------------------------*/
  8. void irq_handler_reset(void);
  9. DUMMY void irq_handler_nmi(void);
  10. DUMMY void irq_handler_hard_fault(void);
  11. DUMMY void irq_handler_mm_fault(void);
  12. DUMMY void irq_handler_bus_fault(void);
  13. DUMMY void irq_handler_usage_fault(void);
  14. DUMMY void irq_handler_sv_call(void);
  15. DUMMY void irq_handler_debug_mon(void);
  16. DUMMY void irq_handler_pend_sv(void);
  17. DUMMY void irq_handler_sys_tick(void);
  18. DUMMY void irq_handler_bod(void);
  19. DUMMY void irq_handler_irc(void);
  20. DUMMY void irq_handler_pwrwu(void);
  21. DUMMY void irq_handler_rampe(void);
  22. DUMMY void irq_handler_ckfail(void);
  23. DUMMY void irq_handler_rtc(void);
  24. DUMMY void irq_handler_tamper(void);
  25. DUMMY void irq_handler_wdt(void);
  26. DUMMY void irq_handler_wwdt(void);
  27. DUMMY void irq_handler_eint0(void);
  28. DUMMY void irq_handler_eint1(void);
  29. DUMMY void irq_handler_eint2(void);
  30. DUMMY void irq_handler_eint3(void);
  31. DUMMY void irq_handler_eint4(void);
  32. DUMMY void irq_handler_eint5(void);
  33. DUMMY void irq_handler_gpa(void);
  34. DUMMY void irq_handler_gpb(void);
  35. DUMMY void irq_handler_gpc(void);
  36. DUMMY void irq_handler_gpd(void);
  37. DUMMY void irq_handler_gpe(void);
  38. DUMMY void irq_handler_gpf(void);
  39. DUMMY void irq_handler_qspi0(void);
  40. DUMMY void irq_handler_spi0(void);
  41. DUMMY void irq_handler_brake0(void);
  42. DUMMY void irq_handler_epwm0p0(void);
  43. DUMMY void irq_handler_epwm0p1(void);
  44. DUMMY void irq_handler_epwm0p2(void);
  45. DUMMY void irq_handler_brake1(void);
  46. DUMMY void irq_handler_epwm1p0(void);
  47. DUMMY void irq_handler_epwm1p1(void);
  48. DUMMY void irq_handler_epwm1p2(void);
  49. DUMMY void irq_handler_tmr0(void);
  50. DUMMY void irq_handler_tmr1(void);
  51. DUMMY void irq_handler_tmr2(void);
  52. DUMMY void irq_handler_tmr3(void);
  53. DUMMY void irq_handler_uart0(void);
  54. DUMMY void irq_handler_uart1(void);
  55. DUMMY void irq_handler_i2c0(void);
  56. DUMMY void irq_handler_i2c1(void);
  57. DUMMY void irq_handler_pdma(void);
  58. DUMMY void irq_handler_dac(void);
  59. DUMMY void irq_handler_eadc00(void);
  60. DUMMY void irq_handler_eadc01(void);
  61. DUMMY void irq_handler_acmp01(void);
  62. DUMMY void irq_handler_eadc02(void);
  63. DUMMY void irq_handler_eadc03(void);
  64. DUMMY void irq_handler_uart2(void);
  65. DUMMY void irq_handler_uart3(void);
  66. DUMMY void irq_handler_qspi1(void);
  67. DUMMY void irq_handler_spi1(void);
  68. DUMMY void irq_handler_spi2(void);
  69. DUMMY void irq_handler_usbd(void);
  70. DUMMY void irq_handler_ohci(void);
  71. DUMMY void irq_handler_usbotg(void);
  72. DUMMY void irq_handler_can0(void);
  73. DUMMY void irq_handler_can1(void);
  74. DUMMY void irq_handler_sc0(void);
  75. DUMMY void irq_handler_sc1(void);
  76. DUMMY void irq_handler_sc2(void);
  77. DUMMY void irq_handler_spi3(void);
  78. DUMMY void irq_handler_sdh0(void);
  79. DUMMY void irq_handler_usbd20(void);
  80. DUMMY void irq_handler_emac_tx(void);
  81. DUMMY void irq_handler_emac_rx(void);
  82. DUMMY void irq_handler_i2s0(void);
  83. DUMMY void irq_handler_opa0(void);
  84. DUMMY void irq_handler_crypto(void);
  85. DUMMY void irq_handler_gpg(void);
  86. DUMMY void irq_handler_eint6(void);
  87. DUMMY void irq_handler_uart4(void);
  88. DUMMY void irq_handler_uart5(void);
  89. DUMMY void irq_handler_usci0(void);
  90. DUMMY void irq_handler_usci1(void);
  91. DUMMY void irq_handler_bpwm0(void);
  92. DUMMY void irq_handler_bpwm1(void);
  93. DUMMY void irq_handler_spim(void);
  94. DUMMY void irq_handler_ccap(void);
  95. DUMMY void irq_handler_i2c2(void);
  96. DUMMY void irq_handler_qei0(void);
  97. DUMMY void irq_handler_qei1(void);
  98. DUMMY void irq_handler_ecap0(void);
  99. DUMMY void irq_handler_ecap1(void);
  100. DUMMY void irq_handler_gph(void);
  101. DUMMY void irq_handler_eint7(void);
  102. DUMMY void irq_handler_sdh1(void);
  103. DUMMY void irq_handler_ehci(void);
  104. DUMMY void irq_handler_usbotg20(void);
  105. DUMMY void irq_handler_trng(void);
  106. DUMMY void irq_handler_uart6(void);
  107. DUMMY void irq_handler_uart7(void);
  108. DUMMY void irq_handler_eadc10(void);
  109. DUMMY void irq_handler_eadc11(void);
  110. DUMMY void irq_handler_eadc12(void);
  111. DUMMY void irq_handler_eadc13(void);
  112. DUMMY void irq_handler_can2(void);
  113. int main(void);
  114. extern void _stack_top(void);
  115. extern unsigned int _etext;
  116. extern unsigned int _data;
  117. extern unsigned int _edata;
  118. extern unsigned int _bss;
  119. extern unsigned int _ebss;
  120. /*- Variables ---------------------------------------------------------------*/
  121. //-----------------------------------------------------------------------------
  122. __attribute__ ((used, section(".rom_vectors")))
  123. void (* const rom_vectors[])(void) =
  124. {
  125. &_stack_top,
  126. irq_handler_reset,
  127. };
  128. //-----------------------------------------------------------------------------
  129. __attribute__ ((used, section(".vectors")))
  130. void (* const vectors[])(void) =
  131. {
  132. &_stack_top, // 0 - Initial Stack Pointer Value
  133. // Cortex-M4 handlers
  134. irq_handler_reset, // 1 - Reset
  135. irq_handler_nmi, // 2 - NMI
  136. irq_handler_hard_fault, // 3 - Hard Fault
  137. irq_handler_mm_fault, // 4 - MM Fault
  138. irq_handler_bus_fault, // 5 - Bus Fault
  139. irq_handler_usage_fault, // 6 - Usage Fault
  140. 0, // 7 - Reserved
  141. 0, // 8 - Reserved
  142. 0, // 9 - Reserved
  143. 0, // 10 - Reserved
  144. irq_handler_sv_call, // 11 - SVCall
  145. irq_handler_debug_mon, // 12 - Debug
  146. 0, // 13 - Reserved
  147. irq_handler_pend_sv, // 14 - PendSV
  148. irq_handler_sys_tick, // 15 - SysTick
  149. // Peripheral handlers
  150. irq_handler_bod, // 0 - brown out detection
  151. irq_handler_irc, // 1 - internal rc
  152. irq_handler_pwrwu, // 2 - power down wake up
  153. irq_handler_rampe, // 3 - ram parity error
  154. irq_handler_ckfail, // 4 - clock detection fail
  155. 0, // 5 - reserved
  156. irq_handler_rtc, // 6 - real time clock
  157. irq_handler_tamper, // 7 - tamper detection
  158. irq_handler_wdt, // 8 - watchdog timer
  159. irq_handler_wwdt, // 9 - window watchdog timer
  160. irq_handler_eint0, // 10 - external input 0
  161. irq_handler_eint1, // 11 - external input 1
  162. irq_handler_eint2, // 12 - external input 2
  163. irq_handler_eint3, // 13 - external input 3
  164. irq_handler_eint4, // 14 - external input 4
  165. irq_handler_eint5, // 15 - external input 5
  166. irq_handler_gpa, // 16 - gpio port a
  167. irq_handler_gpb, // 17 - gpio port b
  168. irq_handler_gpc, // 18 - gpio port c
  169. irq_handler_gpd, // 19 - gpio port d
  170. irq_handler_gpe, // 20 - gpio port e
  171. irq_handler_gpf, // 21 - gpio port f
  172. irq_handler_qspi0, // 22 - qspi0
  173. irq_handler_spi0, // 23 - spi0
  174. irq_handler_brake0, // 24
  175. irq_handler_epwm0p0, // 25
  176. irq_handler_epwm0p1, // 26
  177. irq_handler_epwm0p2, // 27
  178. irq_handler_brake1, // 28
  179. irq_handler_epwm1p0, // 29
  180. irq_handler_epwm1p1, // 30
  181. irq_handler_epwm1p2, // 31
  182. irq_handler_tmr0, // 32 - timer 0
  183. irq_handler_tmr1, // 33 - timer 1
  184. irq_handler_tmr2, // 34 - timer 2
  185. irq_handler_tmr3, // 35 - timer 3
  186. irq_handler_uart0, // 36 - uart0
  187. irq_handler_uart1, // 37 - uart1
  188. irq_handler_i2c0, // 38 - i2c0
  189. irq_handler_i2c1, // 39 - i2c1
  190. irq_handler_pdma, // 40 - peripheral dma
  191. irq_handler_dac, // 41 - dac
  192. irq_handler_eadc00, // 42 - eadc0 interrupt source 0
  193. irq_handler_eadc01, // 43 - eadc0 interrupt source 1
  194. irq_handler_acmp01, // 44 - acmp0 and acmp1
  195. 0, // 45 - reserved
  196. irq_handler_eadc02, // 46 - eadc0 interrupt source 2
  197. irq_handler_eadc03, // 47 - eadc0 interrupt source 3
  198. irq_handler_uart2, // 48 - uart2
  199. irq_handler_uart3, // 49 - uart3
  200. irq_handler_qspi1, // 50 - qspi1
  201. irq_handler_spi1, // 51 - spi1
  202. irq_handler_spi2, // 52 - spi2
  203. irq_handler_usbd, // 53 - usb device
  204. irq_handler_ohci, // 54 - ohci
  205. irq_handler_usbotg, // 55 - usb otg
  206. irq_handler_can0, // 56 - can0
  207. irq_handler_can1, // 57 - can1
  208. irq_handler_sc0, // 58
  209. irq_handler_sc1, // 59
  210. irq_handler_sc2, // 60
  211. 0, // 61 - reserved
  212. irq_handler_spi3, // 62 - spi3
  213. 0, // 63 - reserved
  214. irq_handler_sdh0, // 64 - sdh0
  215. irq_handler_usbd20, // 65 - usbd20
  216. irq_handler_emac_tx, // 66 - emac_tx
  217. irq_handler_emac_rx, // 67 - emax_rx
  218. irq_handler_i2s0, // 68 - i2s0
  219. 0, // 69 - reserved
  220. irq_handler_opa0, // 70 - opa0
  221. irq_handler_crypto, // 71 - crypto
  222. irq_handler_gpg, // 72
  223. irq_handler_eint6, // 73
  224. irq_handler_uart4, // 74 - uart4
  225. irq_handler_uart5, // 75 - uart5
  226. irq_handler_usci0, // 76 - usci0
  227. irq_handler_usci1, // 77 - usci1
  228. irq_handler_bpwm0, // 78 - bpwm0
  229. irq_handler_bpwm1, // 79 - bpwm1
  230. irq_handler_spim, // 80 - spim
  231. irq_handler_ccap, // 81 - ccap
  232. irq_handler_i2c2, // 82 - i2c2
  233. 0, // 83 - reserved
  234. irq_handler_qei0, // 84 - qei0
  235. irq_handler_qei1, // 85 - qei1
  236. irq_handler_ecap0, // 86 - ecap0
  237. irq_handler_ecap1, // 87 - ecap1
  238. irq_handler_gph, // 88
  239. irq_handler_eint7, // 89
  240. irq_handler_sdh1, // 90 - sdh1
  241. 0, // 91 - reserved
  242. irq_handler_ehci, // 92 - ehci
  243. irq_handler_usbotg20, // 93
  244. 0, // 94 - reserved
  245. 0, // 95 - reserved
  246. 0, // 96 - reserved
  247. 0, // 97 - reserved
  248. 0, // 98 - reserved
  249. 0, // 99 - reserved
  250. 0, // 100 - reserved
  251. irq_handler_trng, // 101 - trng
  252. irq_handler_uart6, // 102 - uart6
  253. irq_handler_uart7, // 103 - uart7
  254. irq_handler_eadc10, // 104 - eadc1 interrupt source 0
  255. irq_handler_eadc11, // 105 - eadc1 interrupt source 1
  256. irq_handler_eadc12, // 106 - eadc1 interrupt source 2
  257. irq_handler_eadc13, // 107 - eadc1 interrupt source 3
  258. irq_handler_can2, // 108 - can2
  259. };
  260. /*- Implementations ---------------------------------------------------------*/
  261. //-----------------------------------------------------------------------------
  262. __attribute__ ((used, section(".reset_handler"), optimize("-fno-tree-loop-distribute-patterns")))
  263. void irq_handler_reset(void)
  264. {
  265. unsigned int *src, *dst;
  266. src = &_etext;
  267. dst = &_data;
  268. while (dst < &_edata)
  269. *dst++ = *src++;
  270. dst = &_bss;
  271. while (dst < &_ebss)
  272. *dst++ = 0;
  273. // Enable FPU
  274. SCB->CPACR |= (0xf << 20);
  275. __DSB();
  276. __ISB();
  277. SCB->VTOR = (uint32_t)vectors;
  278. main();
  279. while (1);
  280. }
  281. //-----------------------------------------------------------------------------
  282. void irq_handler_dummy(void)
  283. {
  284. while (1);
  285. }