startup_iar.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  1. //*****************************************************************************
  2. //
  3. //! @file startup_iar.c
  4. //!
  5. //! @brief Definitions for interrupt handlers, the vector table, and the stack.
  6. //
  7. //*****************************************************************************
  8. //*****************************************************************************
  9. //
  10. // Copyright (c) 2017, Ambiq Micro
  11. // All rights reserved.
  12. //
  13. // Redistribution and use in source and binary forms, with or without
  14. // modification, are permitted provided that the following conditions are met:
  15. //
  16. // 1. Redistributions of source code must retain the above copyright notice,
  17. // this list of conditions and the following disclaimer.
  18. //
  19. // 2. Redistributions in binary form must reproduce the above copyright
  20. // notice, this list of conditions and the following disclaimer in the
  21. // documentation and/or other materials provided with the distribution.
  22. //
  23. // 3. Neither the name of the copyright holder nor the names of its
  24. // contributors may be used to endorse or promote products derived from this
  25. // software without specific prior written permission.
  26. //
  27. // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  28. // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  29. // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  30. // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  31. // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  32. // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  33. // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  34. // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  35. // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  36. // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  37. // POSSIBILITY OF SUCH DAMAGE.
  38. //
  39. // This is part of revision 1.2.9 of the AmbiqSuite Development Package.
  40. //
  41. //*****************************************************************************
  42. #include <stdint.h>
  43. //*****************************************************************************
  44. //
  45. // Enable the IAR extensions for this source file.
  46. //
  47. //*****************************************************************************
  48. #pragma language = extended
  49. //*****************************************************************************
  50. //
  51. // Weak function links.
  52. //
  53. //*****************************************************************************
  54. #pragma weak am_mpufault_isr = am_fault_isr
  55. #pragma weak am_busfault_isr = am_fault_isr
  56. #pragma weak am_usagefault_isr = am_fault_isr
  57. #pragma weak am_svcall_isr = am_default_isr
  58. #pragma weak am_debugmon_isr = am_default_isr
  59. #pragma weak am_pendsv_isr = am_default_isr
  60. #pragma weak am_systick_isr = am_default_isr
  61. #pragma weak am_brownout_isr = am_default_isr
  62. #pragma weak am_watchdog_isr = am_default_isr
  63. #pragma weak am_clkgen_isr = am_default_isr
  64. #pragma weak am_vcomp_isr = am_default_isr
  65. #pragma weak am_ioslave_ios_isr = am_default_isr
  66. #pragma weak am_ioslave_acc_isr = am_default_isr
  67. #pragma weak am_iomaster0_isr = am_default_isr
  68. #pragma weak am_iomaster1_isr = am_default_isr
  69. #pragma weak am_iomaster2_isr = am_default_isr
  70. #pragma weak am_iomaster3_isr = am_default_isr
  71. #pragma weak am_iomaster4_isr = am_default_isr
  72. #pragma weak am_iomaster5_isr = am_default_isr
  73. #pragma weak am_gpio_isr = am_default_isr
  74. #pragma weak am_ctimer_isr = am_default_isr
  75. #pragma weak am_uart_isr = am_default_isr
  76. #pragma weak am_uart1_isr = am_default_isr
  77. #pragma weak am_adc_isr = am_default_isr
  78. #pragma weak am_pdm_isr = am_default_isr
  79. #pragma weak am_stimer_isr = am_default_isr
  80. #pragma weak am_stimer_cmpr0_isr = am_default_isr
  81. #pragma weak am_stimer_cmpr1_isr = am_default_isr
  82. #pragma weak am_stimer_cmpr2_isr = am_default_isr
  83. #pragma weak am_stimer_cmpr3_isr = am_default_isr
  84. #pragma weak am_stimer_cmpr4_isr = am_default_isr
  85. #pragma weak am_stimer_cmpr5_isr = am_default_isr
  86. #pragma weak am_stimer_cmpr6_isr = am_default_isr
  87. #pragma weak am_stimer_cmpr7_isr = am_default_isr
  88. #pragma weak am_flash_isr = am_default_isr
  89. #pragma weak am_software0_isr = am_default_isr
  90. #pragma weak am_software1_isr = am_default_isr
  91. #pragma weak am_software2_isr = am_default_isr
  92. #pragma weak am_software3_isr = am_default_isr
  93. //*****************************************************************************
  94. //
  95. // Forward declaration of the default fault handlers.
  96. //
  97. //*****************************************************************************
  98. extern __stackless void am_reset_isr(void);
  99. extern __weak void am_nmi_isr(void);
  100. extern __weak void am_fault_isr(void);
  101. extern void am_mpufault_isr(void);
  102. extern void am_busfault_isr(void);
  103. extern void am_usagefault_isr(void);
  104. extern void am_svcall_isr(void);
  105. extern void am_debugmon_isr(void);
  106. extern void am_pendsv_isr(void);
  107. extern void am_systick_isr(void);
  108. extern void am_brownout_isr(void);
  109. extern void am_watchdog_isr(void);
  110. extern void am_clkgen_isr(void);
  111. extern void am_vcomp_isr(void);
  112. extern void am_ioslave_ios_isr(void);
  113. extern void am_ioslave_acc_isr(void);
  114. extern void am_iomaster0_isr(void);
  115. extern void am_iomaster1_isr(void);
  116. extern void am_iomaster2_isr(void);
  117. extern void am_iomaster3_isr(void);
  118. extern void am_iomaster4_isr(void);
  119. extern void am_iomaster5_isr(void);
  120. extern void am_gpio_isr(void);
  121. extern void am_ctimer_isr(void);
  122. extern void am_uart_isr(void);
  123. extern void am_uart1_isr(void);
  124. extern void am_adc_isr(void);
  125. extern void am_pdm_isr(void);
  126. extern void am_stimer_isr(void);
  127. extern void am_stimer_cmpr0_isr(void);
  128. extern void am_stimer_cmpr1_isr(void);
  129. extern void am_stimer_cmpr2_isr(void);
  130. extern void am_stimer_cmpr3_isr(void);
  131. extern void am_stimer_cmpr4_isr(void);
  132. extern void am_stimer_cmpr5_isr(void);
  133. extern void am_stimer_cmpr6_isr(void);
  134. extern void am_stimer_cmpr7_isr(void);
  135. extern void am_flash_isr(void);
  136. extern void am_software0_isr(void);
  137. extern void am_software1_isr(void);
  138. extern void am_software2_isr(void);
  139. extern void am_software3_isr(void);
  140. extern void am_default_isr(void);
  141. //*****************************************************************************
  142. //
  143. // The entry point for the application startup code.
  144. //
  145. //*****************************************************************************
  146. extern void __iar_program_start(void);
  147. //*****************************************************************************
  148. //
  149. // Reserve space for the system stack.
  150. //
  151. //*****************************************************************************
  152. static uint32_t pui32Stack[1024] @ ".noinit";
  153. //*****************************************************************************
  154. //
  155. // A union that describes the entries of the vector table. The union is needed
  156. // since the first entry is the stack pointer and the remainder are function
  157. // pointers.
  158. //
  159. //*****************************************************************************
  160. typedef union
  161. {
  162. void (*pfnHandler)(void);
  163. uint32_t ui32Ptr;
  164. }
  165. uVectorEntry;
  166. //*****************************************************************************
  167. //
  168. // The vector table. Note that the proper constructs must be placed on this to
  169. // ensure that it ends up at physical address 0x0000.0000.
  170. //
  171. // Note: Aliasing and weakly exporting am_mpufault_isr, am_busfault_isr, and
  172. // am_usagefault_isr does not work if am_fault_isr is defined externally.
  173. // Therefore, we'll explicitly use am_fault_isr in the table for those vectors.
  174. //
  175. //*****************************************************************************
  176. __root const uVectorEntry __vector_table[] @ ".intvec" =
  177. {
  178. { .ui32Ptr = (uint32_t)pui32Stack + sizeof(pui32Stack) },
  179. // The initial stack pointer
  180. am_reset_isr, // The reset handler
  181. am_nmi_isr, // The NMI handler
  182. am_fault_isr, // The hard fault handler
  183. am_fault_isr, // The MPU fault handler
  184. am_fault_isr, // The bus fault handler
  185. am_fault_isr, // The usage fault handler
  186. 0, // Reserved
  187. 0, // Reserved
  188. 0, // Reserved
  189. 0, // Reserved
  190. am_svcall_isr, // SVCall handle
  191. am_debugmon_isr, // Debug monitor handler
  192. 0, // Reserved
  193. am_pendsv_isr, // The PendSV handler
  194. am_systick_isr, // The SysTick handler
  195. //
  196. // Peripheral Interrupts
  197. //
  198. am_brownout_isr, // 0: Brownout
  199. am_watchdog_isr, // 1: Watchdog
  200. am_clkgen_isr, // 2: CLKGEN
  201. am_vcomp_isr, // 3: Voltage Comparator
  202. am_ioslave_ios_isr, // 4: I/O Slave general
  203. am_ioslave_acc_isr, // 5: I/O Slave access
  204. am_iomaster0_isr, // 6: I/O Master 0
  205. am_iomaster1_isr, // 7: I/O Master 1
  206. am_iomaster2_isr, // 8: I/O Master 2
  207. am_iomaster3_isr, // 9: I/O Master 3
  208. am_iomaster4_isr, // 10: I/O Master 4
  209. am_iomaster5_isr, // 11: I/O Master 5
  210. am_gpio_isr, // 12: GPIO
  211. am_ctimer_isr, // 13: CTIMER
  212. am_uart_isr, // 14: UART0
  213. am_uart1_isr, // 15: UART1
  214. am_adc_isr, // 16: ADC
  215. am_pdm_isr, // 17: PDM
  216. am_stimer_isr, // 18: STIMER
  217. am_stimer_cmpr0_isr, // 19: STIMER COMPARE0
  218. am_stimer_cmpr1_isr, // 20: STIMER COMPARE1
  219. am_stimer_cmpr2_isr, // 21: STIMER COMPARE2
  220. am_stimer_cmpr3_isr, // 22: STIMER COMPARE3
  221. am_stimer_cmpr4_isr, // 23: STIMER COMPARE4
  222. am_stimer_cmpr5_isr, // 24: STIMER COMPARE5
  223. am_stimer_cmpr6_isr, // 25: STIMER COMPARE6
  224. am_stimer_cmpr7_isr, // 26: STIMER COMPARE7
  225. am_flash_isr, // 27: FLASH
  226. am_software0_isr, // 28: SOFTWARE0
  227. am_software1_isr, // 29: SOFTWARE1
  228. am_software2_isr, // 30: SOFTWARE2
  229. am_software3_isr // 31: SOFTWARE3
  230. };
  231. //*****************************************************************************
  232. //
  233. // This is the code that gets called when the processor first starts execution
  234. // following a reset event. Only the absolutely necessary set is performed,
  235. // after which the application supplied entry() routine is called.
  236. //
  237. //*****************************************************************************
  238. void
  239. am_reset_isr(void)
  240. {
  241. //
  242. // Call the application's entry point.
  243. //
  244. __iar_program_start();
  245. }
  246. //*****************************************************************************
  247. //
  248. // This is the code that gets called when the processor receives a NMI. This
  249. // simply enters an infinite loop, preserving the system state for examination
  250. // by a debugger.
  251. //
  252. //*****************************************************************************
  253. __weak void
  254. am_nmi_isr(void)
  255. {
  256. //
  257. // Enter an infinite loop.
  258. //
  259. while(1)
  260. {
  261. }
  262. }
  263. //*****************************************************************************
  264. //
  265. // This is the code that gets called when the processor receives a fault
  266. // interrupt. This simply enters an infinite loop, preserving the system state
  267. // for examination by a debugger.
  268. //
  269. //*****************************************************************************
  270. __weak void
  271. am_fault_isr(void)
  272. {
  273. //
  274. // Enter an infinite loop.
  275. //
  276. while(1)
  277. {
  278. }
  279. }
  280. //*****************************************************************************
  281. //
  282. // This is the code that gets called when the processor receives an unexpected
  283. // interrupt. This simply enters an infinite loop, preserving the system state
  284. // for examination by a debugger.
  285. //
  286. //*****************************************************************************
  287. static void
  288. am_default_isr(void)
  289. {
  290. //
  291. // Go into an infinite loop.
  292. //
  293. while(1)
  294. {
  295. }
  296. }