startup_ch32v30x.S 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385
  1. /********************************** (C) COPYRIGHT *******************************
  2. * File Name : startup_ch32v30x.s
  3. * Author : WCH
  4. * Version : V1.0.0
  5. * Date : 2021/06/06
  6. * Description : CH32V30x vector table for eclipse toolchain.
  7. *******************************************************************************/
  8. .section .init,"ax",@progbits
  9. .global _start
  10. .align 1
  11. _start:
  12. j handle_reset
  13. .word 0x00000013
  14. .word 0x00000013
  15. .word 0x00000013
  16. .word 0x00000013
  17. .word 0x00000013
  18. .word 0x00000013
  19. .word 0x00000013
  20. .word 0x00000013
  21. .word 0x00000013
  22. .word 0x00000013
  23. .word 0x00000013
  24. .word 0x00000013
  25. .word 0x00100073
  26. .section .vector,"ax",@progbits
  27. .align 1
  28. _vector_base:
  29. .option norvc;
  30. .word _start
  31. .word 0
  32. .word NMI_Handler /* NMI */
  33. .word HardFault_Handler /* Hard Fault */
  34. .word 0
  35. .word Ecall_M_Mode_Handler /* Ecall M Mode */
  36. .word 0
  37. .word 0
  38. .word Ecall_U_Mode_Handler /* Ecall U Mode */
  39. .word Break_Point_Handler /* Break Point */
  40. .word 0
  41. .word 0
  42. .word SysTick_Handler /* SysTick */
  43. .word 0
  44. .word SW_handler /* SW */
  45. .word 0
  46. /* External Interrupts */
  47. .word WWDG_IRQHandler /* Window Watchdog */
  48. .word PVD_IRQHandler /* PVD through EXTI Line detect */
  49. .word TAMPER_IRQHandler /* TAMPER */
  50. .word RTC_IRQHandler /* RTC */
  51. .word FLASH_IRQHandler /* Flash */
  52. .word RCC_IRQHandler /* RCC */
  53. .word EXTI0_IRQHandler /* EXTI Line 0 */
  54. .word EXTI1_IRQHandler /* EXTI Line 1 */
  55. .word EXTI2_IRQHandler /* EXTI Line 2 */
  56. .word EXTI3_IRQHandler /* EXTI Line 3 */
  57. .word EXTI4_IRQHandler /* EXTI Line 4 */
  58. .word DMA1_Channel1_IRQHandler /* DMA1 Channel 1 */
  59. .word DMA1_Channel2_IRQHandler /* DMA1 Channel 2 */
  60. .word DMA1_Channel3_IRQHandler /* DMA1 Channel 3 */
  61. .word DMA1_Channel4_IRQHandler /* DMA1 Channel 4 */
  62. .word DMA1_Channel5_IRQHandler /* DMA1 Channel 5 */
  63. .word DMA1_Channel6_IRQHandler /* DMA1 Channel 6 */
  64. .word DMA1_Channel7_IRQHandler /* DMA1 Channel 7 */
  65. .word ADC1_2_IRQHandler /* ADC1_2 */
  66. .word USB_HP_CAN1_TX_IRQHandler /* USB HP and CAN1 TX */
  67. .word USB_LP_CAN1_RX0_IRQHandler /* USB LP and CAN1RX0 */
  68. .word CAN1_RX1_IRQHandler /* CAN1 RX1 */
  69. .word CAN1_SCE_IRQHandler /* CAN1 SCE */
  70. .word EXTI9_5_IRQHandler /* EXTI Line 9..5 */
  71. .word TIM1_BRK_IRQHandler /* TIM1 Break */
  72. .word TIM1_UP_IRQHandler /* TIM1 Update */
  73. .word TIM1_TRG_COM_IRQHandler /* TIM1 Trigger and Commutation */
  74. .word TIM1_CC_IRQHandler /* TIM1 Capture Compare */
  75. .word TIM2_IRQHandler /* TIM2 */
  76. .word TIM3_IRQHandler /* TIM3 */
  77. .word TIM4_IRQHandler /* TIM4 */
  78. .word I2C1_EV_IRQHandler /* I2C1 Event */
  79. .word I2C1_ER_IRQHandler /* I2C1 Error */
  80. .word I2C2_EV_IRQHandler /* I2C2 Event */
  81. .word I2C2_ER_IRQHandler /* I2C2 Error */
  82. .word SPI1_IRQHandler /* SPI1 */
  83. .word SPI2_IRQHandler /* SPI2 */
  84. .word USART1_IRQHandler /* USART1 */
  85. .word USART2_IRQHandler /* USART2 */
  86. .word USART3_IRQHandler /* USART3 */
  87. .word EXTI15_10_IRQHandler /* EXTI Line 15..10 */
  88. .word RTCAlarm_IRQHandler /* RTC Alarm through EXTI Line */
  89. .word USBWakeUp_IRQHandler /* USB Wakeup from suspend */
  90. .word TIM8_BRK_IRQHandler /* TIM8 Break */
  91. .word TIM8_UP_IRQHandler /* TIM8 Update */
  92. .word TIM8_TRG_COM_IRQHandler /* TIM8 Trigger and Commutation */
  93. .word TIM8_CC_IRQHandler /* TIM8 Capture Compare */
  94. .word RNG_IRQHandler /* RNG */
  95. .word FSMC_IRQHandler /* FSMC */
  96. .word SDIO_IRQHandler /* SDIO */
  97. .word TIM5_IRQHandler /* TIM5 */
  98. .word SPI3_IRQHandler /* SPI3 */
  99. .word UART4_IRQHandler /* UART4 */
  100. .word UART5_IRQHandler /* UART5 */
  101. .word TIM6_IRQHandler /* TIM6 */
  102. .word TIM7_IRQHandler /* TIM7 */
  103. .word DMA2_Channel1_IRQHandler /* DMA2 Channel 1 */
  104. .word DMA2_Channel2_IRQHandler /* DMA2 Channel 2 */
  105. .word DMA2_Channel3_IRQHandler /* DMA2 Channel 3 */
  106. .word DMA2_Channel4_IRQHandler /* DMA2 Channel 4 */
  107. .word DMA2_Channel5_IRQHandler /* DMA2 Channel 5 */
  108. .word ETH_IRQHandler /* ETH */
  109. .word ETH_WKUP_IRQHandler /* ETH WakeUp */
  110. .word CAN2_TX_IRQHandler /* CAN2 TX */
  111. .word CAN2_RX0_IRQHandler /* CAN2 RX0 */
  112. .word CAN2_RX1_IRQHandler /* CAN2 RX1 */
  113. .word CAN2_SCE_IRQHandler /* CAN2 SCE */
  114. .word OTG_FS_IRQHandler /* OTGFS */
  115. .word USBHSWakeup_IRQHandler /* USBHS Wakeup */
  116. .word USBHS_IRQHandler /* USBHS */
  117. .word DVP_IRQHandler /* DVP */
  118. .word UART6_IRQHandler /* UART6 */
  119. .word UART7_IRQHandler /* UART7 */
  120. .word UART8_IRQHandler /* UART8 */
  121. .word TIM9_BRK_IRQHandler /* TIM9 Break */
  122. .word TIM9_UP_IRQHandler /* TIM9 Update */
  123. .word TIM9_TRG_COM_IRQHandler /* TIM9 Trigger and Commutation */
  124. .word TIM9_CC_IRQHandler /* TIM9 Capture Compare */
  125. .word TIM10_BRK_IRQHandler /* TIM10 Break */
  126. .word TIM10_UP_IRQHandler /* TIM10 Update */
  127. .word TIM10_TRG_COM_IRQHandler /* TIM10 Trigger and Commutation */
  128. .word TIM10_CC_IRQHandler /* TIM10 Capture Compare */
  129. .word DMA2_Channel6_IRQHandler /* DMA2 Channel 6 */
  130. .word DMA2_Channel7_IRQHandler /* DMA2 Channel 7 */
  131. .word DMA2_Channel8_IRQHandler /* DMA2 Channel 8 */
  132. .word DMA2_Channel9_IRQHandler /* DMA2 Channel 9 */
  133. .word DMA2_Channel10_IRQHandler /* DMA2 Channel 10 */
  134. .word DMA2_Channel11_IRQHandler /* DMA2 Channel 11 */
  135. .option rvc;
  136. .section .text.vector_handler, "ax", @progbits
  137. .weak NMI_Handler /* NMI */
  138. .weak HardFault_Handler /* Hard Fault */
  139. .weak Ecall_M_Mode_Handler /* Ecall M Mode */
  140. .weak Ecall_U_Mode_Handler /* Ecall U Mode */
  141. .weak Break_Point_Handler /* Break Point */
  142. .weak SysTick_Handler /* SysTick */
  143. .weak SW_handler /* SW */
  144. .weak WWDG_IRQHandler /* Window Watchdog */
  145. .weak PVD_IRQHandler /* PVD through EXTI Line detect */
  146. .weak TAMPER_IRQHandler /* TAMPER */
  147. .weak RTC_IRQHandler /* RTC */
  148. .weak FLASH_IRQHandler /* Flash */
  149. .weak RCC_IRQHandler /* RCC */
  150. .weak EXTI0_IRQHandler /* EXTI Line 0 */
  151. .weak EXTI1_IRQHandler /* EXTI Line 1 */
  152. .weak EXTI2_IRQHandler /* EXTI Line 2 */
  153. .weak EXTI3_IRQHandler /* EXTI Line 3 */
  154. .weak EXTI4_IRQHandler /* EXTI Line 4 */
  155. .weak DMA1_Channel1_IRQHandler /* DMA1 Channel 1 */
  156. .weak DMA1_Channel2_IRQHandler /* DMA1 Channel 2 */
  157. .weak DMA1_Channel3_IRQHandler /* DMA1 Channel 3 */
  158. .weak DMA1_Channel4_IRQHandler /* DMA1 Channel 4 */
  159. .weak DMA1_Channel5_IRQHandler /* DMA1 Channel 5 */
  160. .weak DMA1_Channel6_IRQHandler /* DMA1 Channel 6 */
  161. .weak DMA1_Channel7_IRQHandler /* DMA1 Channel 7 */
  162. .weak ADC1_2_IRQHandler /* ADC1_2 */
  163. .weak USB_HP_CAN1_TX_IRQHandler /* USB HP and CAN1 TX */
  164. .weak USB_LP_CAN1_RX0_IRQHandler /* USB LP and CAN1RX0 */
  165. .weak CAN1_RX1_IRQHandler /* CAN1 RX1 */
  166. .weak CAN1_SCE_IRQHandler /* CAN1 SCE */
  167. .weak EXTI9_5_IRQHandler /* EXTI Line 9..5 */
  168. .weak TIM1_BRK_IRQHandler /* TIM1 Break */
  169. .weak TIM1_UP_IRQHandler /* TIM1 Update */
  170. .weak TIM1_TRG_COM_IRQHandler /* TIM1 Trigger and Commutation */
  171. .weak TIM1_CC_IRQHandler /* TIM1 Capture Compare */
  172. .weak TIM2_IRQHandler /* TIM2 */
  173. .weak TIM3_IRQHandler /* TIM3 */
  174. .weak TIM4_IRQHandler /* TIM4 */
  175. .weak I2C1_EV_IRQHandler /* I2C1 Event */
  176. .weak I2C1_ER_IRQHandler /* I2C1 Error */
  177. .weak I2C2_EV_IRQHandler /* I2C2 Event */
  178. .weak I2C2_ER_IRQHandler /* I2C2 Error */
  179. .weak SPI1_IRQHandler /* SPI1 */
  180. .weak SPI2_IRQHandler /* SPI2 */
  181. .weak USART1_IRQHandler /* USART1 */
  182. .weak USART2_IRQHandler /* USART2 */
  183. .weak USART3_IRQHandler /* USART3 */
  184. .weak EXTI15_10_IRQHandler /* EXTI Line 15..10 */
  185. .weak RTCAlarm_IRQHandler /* RTC Alarm through EXTI Line */
  186. .weak USBWakeUp_IRQHandler /* USB Wakeup from suspend */
  187. .weak TIM8_BRK_IRQHandler /* TIM8 Break */
  188. .weak TIM8_UP_IRQHandler /* TIM8 Update */
  189. .weak TIM8_TRG_COM_IRQHandler /* TIM8 Trigger and Commutation */
  190. .weak TIM8_CC_IRQHandler /* TIM8 Capture Compare */
  191. .weak RNG_IRQHandler /* RNG */
  192. .weak FSMC_IRQHandler /* FSMC */
  193. .weak SDIO_IRQHandler /* SDIO */
  194. .weak TIM5_IRQHandler /* TIM5 */
  195. .weak SPI3_IRQHandler /* SPI3 */
  196. .weak UART4_IRQHandler /* UART4 */
  197. .weak UART5_IRQHandler /* UART5 */
  198. .weak TIM6_IRQHandler /* TIM6 */
  199. .weak TIM7_IRQHandler /* TIM7 */
  200. .weak DMA2_Channel1_IRQHandler /* DMA2 Channel 1 */
  201. .weak DMA2_Channel2_IRQHandler /* DMA2 Channel 2 */
  202. .weak DMA2_Channel3_IRQHandler /* DMA2 Channel 3 */
  203. .weak DMA2_Channel4_IRQHandler /* DMA2 Channel 4 */
  204. .weak DMA2_Channel5_IRQHandler /* DMA2 Channel 5 */
  205. .weak ETH_IRQHandler /* ETH */
  206. .weak ETH_WKUP_IRQHandler /* ETH WakeUp */
  207. .weak CAN2_TX_IRQHandler /* CAN2 TX */
  208. .weak CAN2_RX0_IRQHandler /* CAN2 RX0 */
  209. .weak CAN2_RX1_IRQHandler /* CAN2 RX1 */
  210. .weak CAN2_SCE_IRQHandler /* CAN2 SCE */
  211. .weak OTG_FS_IRQHandler /* OTGFS */
  212. .weak USBHSWakeup_IRQHandler /* USBHS Wakeup */
  213. .weak USBHS_IRQHandler /* USBHS */
  214. .weak DVP_IRQHandler /* DVP */
  215. .weak UART6_IRQHandler /* UART6 */
  216. .weak UART7_IRQHandler /* UART7 */
  217. .weak UART8_IRQHandler /* UART8 */
  218. .weak TIM9_BRK_IRQHandler /* TIM9 Break */
  219. .weak TIM9_UP_IRQHandler /* TIM9 Update */
  220. .weak TIM9_TRG_COM_IRQHandler /* TIM9 Trigger and Commutation */
  221. .weak TIM9_CC_IRQHandler /* TIM9 Capture Compare */
  222. .weak TIM10_BRK_IRQHandler /* TIM10 Break */
  223. .weak TIM10_UP_IRQHandler /* TIM10 Update */
  224. .weak TIM10_TRG_COM_IRQHandler /* TIM10 Trigger and Commutation */
  225. .weak TIM10_CC_IRQHandler /* TIM10 Capture Compare */
  226. .weak DMA2_Channel6_IRQHandler /* DMA2 Channel 6 */
  227. .weak DMA2_Channel7_IRQHandler /* DMA2 Channel 7 */
  228. .weak DMA2_Channel8_IRQHandler /* DMA2 Channel 8 */
  229. .weak DMA2_Channel9_IRQHandler /* DMA2 Channel 9 */
  230. .weak DMA2_Channel10_IRQHandler /* DMA2 Channel 10 */
  231. .weak DMA2_Channel11_IRQHandler /* DMA2 Channel 11 */
  232. NMI_Handler: 1: j 1b
  233. HardFault_Handler: 1: j 1b
  234. Ecall_M_Mode_Handler: 1: j 1b
  235. Ecall_U_Mode_Handler: 1: j 1b
  236. Break_Point_Handler: 1: j 1b
  237. SysTick_Handler: 1: j 1b
  238. SW_handler: 1: j 1b
  239. WWDG_IRQHandler: 1: j 1b
  240. PVD_IRQHandler: 1: j 1b
  241. TAMPER_IRQHandler: 1: j 1b
  242. RTC_IRQHandler: 1: j 1b
  243. FLASH_IRQHandler: 1: j 1b
  244. RCC_IRQHandler: 1: j 1b
  245. EXTI0_IRQHandler: 1: j 1b
  246. EXTI1_IRQHandler: 1: j 1b
  247. EXTI2_IRQHandler: 1: j 1b
  248. EXTI3_IRQHandler: 1: j 1b
  249. EXTI4_IRQHandler: 1: j 1b
  250. DMA1_Channel1_IRQHandler: 1: j 1b
  251. DMA1_Channel2_IRQHandler: 1: j 1b
  252. DMA1_Channel3_IRQHandler: 1: j 1b
  253. DMA1_Channel4_IRQHandler: 1: j 1b
  254. DMA1_Channel5_IRQHandler: 1: j 1b
  255. DMA1_Channel6_IRQHandler: 1: j 1b
  256. DMA1_Channel7_IRQHandler: 1: j 1b
  257. ADC1_2_IRQHandler: 1: j 1b
  258. USB_HP_CAN1_TX_IRQHandler: 1: j 1b
  259. USB_LP_CAN1_RX0_IRQHandler: 1: j 1b
  260. CAN1_RX1_IRQHandler: 1: j 1b
  261. CAN1_SCE_IRQHandler: 1: j 1b
  262. EXTI9_5_IRQHandler: 1: j 1b
  263. TIM1_BRK_IRQHandler: 1: j 1b
  264. TIM1_UP_IRQHandler: 1: j 1b
  265. TIM1_TRG_COM_IRQHandler: 1: j 1b
  266. TIM1_CC_IRQHandler: 1: j 1b
  267. TIM2_IRQHandler: 1: j 1b
  268. TIM3_IRQHandler: 1: j 1b
  269. TIM4_IRQHandler: 1: j 1b
  270. I2C1_EV_IRQHandler: 1: j 1b
  271. I2C1_ER_IRQHandler: 1: j 1b
  272. I2C2_EV_IRQHandler: 1: j 1b
  273. I2C2_ER_IRQHandler: 1: j 1b
  274. SPI1_IRQHandler: 1: j 1b
  275. SPI2_IRQHandler: 1: j 1b
  276. USART1_IRQHandler: 1: j 1b
  277. USART2_IRQHandler: 1: j 1b
  278. USART3_IRQHandler: 1: j 1b
  279. EXTI15_10_IRQHandler: 1: j 1b
  280. RTCAlarm_IRQHandler: 1: j 1b
  281. USBWakeUp_IRQHandler: 1: j 1b
  282. TIM8_BRK_IRQHandler: 1: j 1b
  283. TIM8_UP_IRQHandler: 1: j 1b
  284. TIM8_TRG_COM_IRQHandler: 1: j 1b
  285. TIM8_CC_IRQHandler: 1: j 1b
  286. RNG_IRQHandler: 1: j 1b
  287. FSMC_IRQHandler: 1: j 1b
  288. SDIO_IRQHandler: 1: j 1b
  289. TIM5_IRQHandler: 1: j 1b
  290. SPI3_IRQHandler: 1: j 1b
  291. UART4_IRQHandler: 1: j 1b
  292. UART5_IRQHandler: 1: j 1b
  293. TIM6_IRQHandler: 1: j 1b
  294. TIM7_IRQHandler: 1: j 1b
  295. DMA2_Channel1_IRQHandler: 1: j 1b
  296. DMA2_Channel2_IRQHandler: 1: j 1b
  297. DMA2_Channel3_IRQHandler: 1: j 1b
  298. DMA2_Channel4_IRQHandler: 1: j 1b
  299. DMA2_Channel5_IRQHandler: 1: j 1b
  300. ETH_IRQHandler: 1: j 1b
  301. ETH_WKUP_IRQHandler: 1: j 1b
  302. CAN2_TX_IRQHandler: 1: j 1b
  303. CAN2_RX0_IRQHandler: 1: j 1b
  304. CAN2_RX1_IRQHandler: 1: j 1b
  305. CAN2_SCE_IRQHandler: 1: j 1b
  306. OTG_FS_IRQHandler: 1: j 1b
  307. USBHSWakeup_IRQHandler: 1: j 1b
  308. USBHS_IRQHandler: 1: j 1b
  309. DVP_IRQHandler: 1: j 1b
  310. UART6_IRQHandler: 1: j 1b
  311. UART7_IRQHandler: 1: j 1b
  312. UART8_IRQHandler: 1: j 1b
  313. TIM9_BRK_IRQHandler: 1: j 1b
  314. TIM9_UP_IRQHandler: 1: j 1b
  315. TIM9_TRG_COM_IRQHandler: 1: j 1b
  316. TIM9_CC_IRQHandler: 1: j 1b
  317. TIM10_BRK_IRQHandler: 1: j 1b
  318. TIM10_UP_IRQHandler: 1: j 1b
  319. TIM10_TRG_COM_IRQHandler: 1: j 1b
  320. TIM10_CC_IRQHandler: 1: j 1b
  321. DMA2_Channel6_IRQHandler: 1: j 1b
  322. DMA2_Channel7_IRQHandler: 1: j 1b
  323. DMA2_Channel8_IRQHandler: 1: j 1b
  324. DMA2_Channel9_IRQHandler: 1: j 1b
  325. DMA2_Channel10_IRQHandler: 1: j 1b
  326. DMA2_Channel11_IRQHandler: 1: j 1b
  327. .section .text.handle_reset,"ax",@progbits
  328. .weak handle_reset
  329. .align 1
  330. handle_reset:
  331. .option push
  332. .option norelax
  333. csrw mepc, t0
  334. la gp, __global_pointer$
  335. .option pop
  336. 1:
  337. la sp, _eusrstack
  338. 2:
  339. /* Load data section from flash to RAM */
  340. la a0, _data_lma
  341. la a1, _data_vma
  342. la a2, _edata
  343. bgeu a1, a2, 2f
  344. 1:
  345. lw t0, (a0)
  346. sw t0, (a1)
  347. addi a0, a0, 4
  348. addi a1, a1, 4
  349. bltu a1, a2, 1b
  350. 2:
  351. /* Clear bss section */
  352. la a0, _sbss
  353. la a1, _ebss
  354. bgeu a0, a1, 2f
  355. 1:
  356. sw zero, (a0)
  357. addi a0, a0, 4
  358. bltu a0, a1, 1b
  359. 2:
  360. li t0, 0x1f
  361. csrw 0xbc0, t0
  362. /* Enable hardware stack */
  363. li t0,0x1
  364. csrw 0x804, t0
  365. /* Enable floating point and interrupt */
  366. li t0, 0x7800
  367. csrs mstatus, t0
  368. la t0, _vector_base
  369. ori t0, t0, 3
  370. csrw mtvec, t0
  371. jal SystemInit
  372. la t0, entry
  373. csrw mepc, t0
  374. mret