186 lines
		
	
	
	
		
			4.5 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
		
		
			
		
	
	
			186 lines
		
	
	
	
		
			4.5 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
|  | /********************************** (C) COPYRIGHT ******************************* | |||
|  |  * File Name          : startup_CH59x.s | |||
|  |  * Author             : WCH | |||
|  |  * Version            : V1.0.0 | |||
|  |  * Date               : 2021/02/25 | |||
|  |  * Description        : | |||
|  |  ********************************************************************************* | |||
|  |  * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. | |||
|  |  * Attention: This software (modified or not) and binary are used for  | |||
|  |  * microcontroller manufactured by Nanjing Qinheng Microelectronics. | |||
|  |  *******************************************************************************/ | |||
|  | 
 | |||
|  | 	.section	.init,"ax",@progbits
 | |||
|  | 	.global	_start
 | |||
|  | 	.align	1
 | |||
|  | _start: | |||
|  | 	j	handle_reset | |||
|  | 
 | |||
|  |     .section    .vector,"ax",@progbits
 | |||
|  |     .align  1
 | |||
|  | _vector_base: | |||
|  |     .option norvc;
 | |||
|  | 
 | |||
|  |     .word   0
 | |||
|  |     .word   0
 | |||
|  |     .word   NMI_Handler                 /* NMI Handler */ | |||
|  |     .word   HardFault_Handler           /* Hard Fault Handler */ | |||
|  |     .word   0xF5F9BDA9
 | |||
|  |     .word   Ecall_M_Mode_Handler        /* 5 */ | |||
|  |     .word   0
 | |||
|  |     .word   0
 | |||
|  |     .word   Ecall_U_Mode_Handler		/* 8 */ | |||
|  |     .word   Break_Point_Handler			/* 9 */ | |||
|  |     .word   0
 | |||
|  |     .word   0
 | |||
|  |     .word   SysTick_Handler            /* SysTick Handler */ | |||
|  |     .word   0
 | |||
|  |     .word   SW_Handler                 /* SW Handler */ | |||
|  |     .word   0
 | |||
|  |     /* External Interrupts */ | |||
|  |     .word   TMR0_IRQHandler            /* 0:  TMR0 */ | |||
|  |     .word   GPIOA_IRQHandler           /* GPIOA */ | |||
|  |     .word   GPIOB_IRQHandler           /* GPIOB */ | |||
|  |     .word   SPI0_IRQHandler            /* SPI0 */ | |||
|  |     .word   BB_IRQHandler              /* BLEB */ | |||
|  |     .word   LLE_IRQHandler             /* BLEL */ | |||
|  |     .word   USB_IRQHandler             /* USB */ | |||
|  |     .word   0			  | |||
|  |     .word   TMR1_IRQHandler            /* TMR1 */ | |||
|  |     .word   TMR2_IRQHandler            /* TMR2 */ | |||
|  |     .word   UART0_IRQHandler           /* UART0 */ | |||
|  |     .word   UART1_IRQHandler           /* UART1 */ | |||
|  |     .word   RTC_IRQHandler             /* RTC */ | |||
|  |     .word   ADC_IRQHandler             /* ADC */ | |||
|  |     .word   I2C_IRQHandler 			   /* I2C */ | |||
|  |     .word   PWMX_IRQHandler            /* PWMX */ | |||
|  |     .word   TMR3_IRQHandler            /* TMR3 */ | |||
|  |     .word   UART2_IRQHandler           /* UART2 */ | |||
|  |     .word   UART3_IRQHandler           /* UART3 */ | |||
|  |     .word   WDOG_BAT_IRQHandler        /* WDOG_BAT */ | |||
|  | 
 | |||
|  |     .option rvc;
 | |||
|  | 
 | |||
|  |     .section    .vector_handler, "ax", @progbits
 | |||
|  |     .weak   NMI_Handler
 | |||
|  |     .weak   HardFault_Handler
 | |||
|  |     .weak   Ecall_M_Mode_Handler
 | |||
|  |     .weak   Ecall_U_Mode_Handler
 | |||
|  |     .weak   Break_Point_Handler
 | |||
|  |     .weak   SysTick_Handler
 | |||
|  |     .weak   SW_Handler
 | |||
|  |     .weak   TMR0_IRQHandler
 | |||
|  |     .weak   GPIOA_IRQHandler
 | |||
|  |     .weak   GPIOB_IRQHandler
 | |||
|  |     .weak   SPI0_IRQHandler
 | |||
|  |     .weak   BB_IRQHandler
 | |||
|  |     .weak   LLE_IRQHandler
 | |||
|  |     .weak   USB_IRQHandler
 | |||
|  |     .weak   TMR1_IRQHandler
 | |||
|  |     .weak   TMR2_IRQHandler
 | |||
|  |     .weak   UART0_IRQHandler
 | |||
|  |     .weak   UART1_IRQHandler
 | |||
|  |     .weak   RTC_IRQHandler
 | |||
|  |     .weak   ADC_IRQHandler
 | |||
|  |     .weak   I2C_IRQHandler
 | |||
|  |     .weak   PWMX_IRQHandler
 | |||
|  |     .weak   TMR3_IRQHandler
 | |||
|  |     .weak   UART2_IRQHandler
 | |||
|  |     .weak   UART3_IRQHandler
 | |||
|  |     .weak   WDOG_BAT_IRQHandler
 | |||
|  | 
 | |||
|  | NMI_Handler: | |||
|  | HardFault_Handler: | |||
|  | Ecall_M_Mode_Handler: | |||
|  | Ecall_U_Mode_Handler: | |||
|  | Break_Point_Handler: | |||
|  | SysTick_Handler: | |||
|  | SW_Handler: | |||
|  | TMR0_IRQHandler: | |||
|  | GPIOA_IRQHandler: | |||
|  | GPIOB_IRQHandler: | |||
|  | SPI0_IRQHandler: | |||
|  | BB_IRQHandler: | |||
|  | LLE_IRQHandler: | |||
|  | USB_IRQHandler: | |||
|  | TMR1_IRQHandler: | |||
|  | TMR2_IRQHandler: | |||
|  | UART0_IRQHandler: | |||
|  | UART1_IRQHandler: | |||
|  | RTC_IRQHandler: | |||
|  | ADC_IRQHandler: | |||
|  | I2C_IRQHandler: | |||
|  | PWMX_IRQHandler: | |||
|  | TMR3_IRQHandler: | |||
|  | UART2_IRQHandler: | |||
|  | UART3_IRQHandler: | |||
|  | WDOG_BAT_IRQHandler:  | |||
|  | 1:   | |||
|  | 	j 1b | |||
|  | 
 | |||
|  | 	.section	.handle_reset,"ax",@progbits
 | |||
|  | 	.weak	handle_reset
 | |||
|  | 	.align	1
 | |||
|  | handle_reset: | |||
|  | .option push  | |||
|  | .option	norelax  | |||
|  | 	la gp, __global_pointer$ | |||
|  | .option	pop  | |||
|  | 1: | |||
|  | 	la sp, _eusrstack  | |||
|  | 
 | |||
|  | /* Load highcode code  section from flash to RAM */ | |||
|  | 2: | |||
|  |     la a0, _highcode_lma | |||
|  |     la a1, _highcode_vma_start | |||
|  |     la a2, _highcode_vma_end | |||
|  |     bgeu a1, a2, 2f | |||
|  | 1: | |||
|  |     lw t0, (a0) | |||
|  |     sw t0, (a1) | |||
|  |     addi a0, a0, 4 | |||
|  |     addi a1, a1, 4 | |||
|  |     bltu a1, a2, 1b | |||
|  | 
 | |||
|  | /* Load data section from flash to RAM */ | |||
|  | 2: | |||
|  | 	la a0, _data_lma | |||
|  | 	la a1, _data_vma | |||
|  | 	la a2, _edata | |||
|  | 	bgeu a1, a2, 2f | |||
|  | 1: | |||
|  | 	lw t0, (a0) | |||
|  | 	sw t0, (a1) | |||
|  | 	addi a0, a0, 4 | |||
|  | 	addi a1, a1, 4 | |||
|  | 	bltu a1, a2, 1b | |||
|  | 2: | |||
|  | 	/* clear bss section */ | |||
|  | 	la a0, _sbss | |||
|  | 	la a1, _ebss | |||
|  | 	bgeu a0, a1, 2f | |||
|  | 1: | |||
|  | 	sw zero, (a0) | |||
|  | 	addi a0, a0, 4 | |||
|  | 	bltu a0, a1, 1b | |||
|  | 2: | |||
|  | 	/* <20><>ˮ<EFBFBD>߿<EFBFBD><DFBF><EFBFBD>λ & <20><>̬Ԥ<CCAC><D4A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ */ | |||
|  | 	li t0, 0x1f | |||
|  | 	csrw 0xbc0, t0 | |||
|  | 	/* <20><><EFBFBD><EFBFBD>Ƕ<EFBFBD><C7B6><EFBFBD>жϡ<D0B6>Ӳ<EFBFBD><D3B2>ѹջ<D1B9><D5BB><EFBFBD><EFBFBD> */ | |||
|  | 	li t0, 0x3 | |||
|  | 	csrw 0x804, t0 | |||
|  | 	 | |||
|  |     li t0, 0x88 | |||
|  |     csrw mstatus, t0 | |||
|  | 	la t0, _vector_base | |||
|  | 
 | |||
|  | 	/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽΪ<CABD><CEAA><EFBFBD>Ե<EFBFBD>ַģʽ */ | |||
|  |     ori t0, t0, 3 | |||
|  | 	csrw mtvec, t0 | |||
|  | 
 | |||
|  | 	la t0, main | |||
|  | 	csrw mepc, t0 | |||
|  | 	 | |||
|  | 	mret |