1*10465441SEvalZero;============================================================================================== 2*10465441SEvalZero; star_rvds.s for Keil MDK 4.10 3*10465441SEvalZero; 4*10465441SEvalZero; SEP4020 start up code 5*10465441SEvalZero; 6*10465441SEvalZero; Change Logs: 7*10465441SEvalZero; Date Author Notes 8*10465441SEvalZero; 2010-03-17 zchong 9*10465441SEvalZero;============================================================================================= 10*10465441SEvalZero 11*10465441SEvalZeroPMU_PLTR EQU 0x10001000 ; PLL���ȶ�����ʱ�� 12*10465441SEvalZeroPMU_PMCR EQU 0x10001004 ; ϵͳ��ʱ��PLL�Ŀ��ƼĴ��� 13*10465441SEvalZeroPMU_PUCR EQU 0x10001008 ; USBʱ��PLL�Ŀ��ƼĴ��� 14*10465441SEvalZeroPMU_PCSR EQU 0x1000100C ; �ڲ�ģ��ʱ��Դ�����Ŀ��ƼĴ��� 15*10465441SEvalZeroPMU_PDSLOW EQU 0x10001010 ; SLOW״̬��ʱ�ӵķ�Ƶ���� 16*10465441SEvalZeroPMU_PMDR EQU 0x10001014 ; оƬ����ģʽ�Ĵ��� 17*10465441SEvalZeroPMU_RCTR EQU 0x10001018 ; Reset���ƼĴ��� 18*10465441SEvalZeroPMU_CLRWAKUP EQU 0x1000101C ; WakeUp����Ĵ��� 19*10465441SEvalZero 20*10465441SEvalZeroRTC_CTR EQU 0x1000200C ; RTC���ƼĴ��� 21*10465441SEvalZero 22*10465441SEvalZeroINTC_IER EQU 0x10000000 ; IRQ�ж�����Ĵ��� 23*10465441SEvalZeroINTC_IMR EQU 0x10000008 ; IRQ�ж����μĴ��� 24*10465441SEvalZeroINTC_IFSR EQU 0x10000030 ; IRQ�ж�����״̬�Ĵ��� 25*10465441SEvalZeroINTC_FIER EQU 0x100000C0 ; FIQ�ж�����Ĵ��� 26*10465441SEvalZeroINTC_FIMR EQU 0x100000C4 ; FIQ�ж����μĴ��� 27*10465441SEvalZero 28*10465441SEvalZeroEMI_CSACONF EQU 0x11000000 ; CSA�������üĴ��� 29*10465441SEvalZeroEMI_CSECONF EQU 0x11000010 ; CSE�������üĴ��� 30*10465441SEvalZeroEMI_CSFCONF EQU 0x11000014 ; CSF�������üĴ��� 31*10465441SEvalZeroEMI_SDCONF1 EQU 0x11000018 ; SDRAMʱ�����üĴ���1 32*10465441SEvalZeroEMI_SDCONF2 EQU 0x1100001C ; SDRAMʱ�����üĴ���2, SDRAM��ʼ���õ���������Ϣ 33*10465441SEvalZeroEMI_REMAPCONF EQU 0x11000020 ; Ƭѡ�ռ估��ַӳ��REMAP���üĴ��� 34*10465441SEvalZero 35*10465441SEvalZeroMode_USR EQU 0x10 36*10465441SEvalZeroMode_FIQ EQU 0x11 37*10465441SEvalZeroMode_IRQ EQU 0x12 38*10465441SEvalZeroMode_SVC EQU 0x13 39*10465441SEvalZeroMode_ABT EQU 0x17 40*10465441SEvalZeroMode_UND EQU 0x1B 41*10465441SEvalZeroMode_SYS EQU 0x1F 42*10465441SEvalZero 43*10465441SEvalZeroI_Bit EQU 0x80 ; when I bit is set, IRQ is disabled 44*10465441SEvalZeroF_Bit EQU 0x40 ; when F bit is set, FIQ is disabled 45*10465441SEvalZeroNOINT EQU 0xc0 46*10465441SEvalZeroMASK_MODE EQU 0x0000003F 47*10465441SEvalZeroMODE_SVC32 EQU 0x00000013 48*10465441SEvalZero 49*10465441SEvalZero; Internal Memory Base Addresses 50*10465441SEvalZeroFLASH_BASE EQU 0x20000000 51*10465441SEvalZeroRAM_BASE EQU 0x04000000 52*10465441SEvalZeroSDRAM_BASE EQU 0x30000000 53*10465441SEvalZero 54*10465441SEvalZero; Stack 55*10465441SEvalZeroUnused_Stack_Size EQU 0x00000100 56*10465441SEvalZeroSvc_Stack_Size EQU 0x00001000 57*10465441SEvalZeroAbt_Stack_Size EQU 0x00000000 58*10465441SEvalZeroFiq_Stack_Size EQU 0x00000000 59*10465441SEvalZeroIrq_Stack_Size EQU 0x00001000 60*10465441SEvalZeroUsr_Stack_Size EQU 0x00000000 61*10465441SEvalZero 62*10465441SEvalZero;SVC STACK 63*10465441SEvalZero AREA STACK, NOINIT, READWRITE, ALIGN=3 64*10465441SEvalZeroSvc_Stack SPACE Svc_Stack_Size 65*10465441SEvalZero__initial_sp 66*10465441SEvalZeroSvc_Stack_Top 67*10465441SEvalZero 68*10465441SEvalZero;IRQ STACK 69*10465441SEvalZero AREA STACK, NOINIT, READWRITE, ALIGN=3 70*10465441SEvalZeroIrq_Stack SPACE Irq_Stack_Size 71*10465441SEvalZeroIrq_Stack_Top 72*10465441SEvalZero 73*10465441SEvalZero;UNUSED STACK 74*10465441SEvalZero AREA STACK, NOINIT, READWRITE, ALIGN=3 75*10465441SEvalZeroUnused_Stack SPACE Unused_Stack_Size 76*10465441SEvalZeroUnused_Stack_Top 77*10465441SEvalZero 78*10465441SEvalZero 79*10465441SEvalZero; Heap 80*10465441SEvalZeroHeap_Size EQU 0x0000100 81*10465441SEvalZero 82*10465441SEvalZero AREA HEAP, NOINIT, READWRITE, ALIGN=3 83*10465441SEvalZero EXPORT Heap_Mem 84*10465441SEvalZero__heap_base 85*10465441SEvalZeroHeap_Mem SPACE Heap_Size 86*10465441SEvalZero__heap_limit 87*10465441SEvalZero 88*10465441SEvalZero PRESERVE8 89*10465441SEvalZero 90*10465441SEvalZero; Area Definition and Entry Point 91*10465441SEvalZero; Startup Code must be linked first at Address at which it expects to run. 92*10465441SEvalZero 93*10465441SEvalZero AREA RESET, CODE, READONLY 94*10465441SEvalZero ARM 95*10465441SEvalZero 96*10465441SEvalZero; Exception Vectors 97*10465441SEvalZero; Mapped to Address 0. 98*10465441SEvalZero; Absolute addressing mode must be used. 99*10465441SEvalZero; Dummy Handlers are implemented as infinite loops which can be modified. 100*10465441SEvalZero EXPORT Entry_Point 101*10465441SEvalZeroEntry_Point 102*10465441SEvalZeroVectors LDR PC,Reset_Addr 103*10465441SEvalZero LDR PC,Undef_Addr 104*10465441SEvalZero LDR PC,SWI_Addr 105*10465441SEvalZero LDR PC,PAbt_Addr 106*10465441SEvalZero LDR PC,DAbt_Addr 107*10465441SEvalZero NOP ; Reserved Vector 108*10465441SEvalZero LDR PC,IRQ_Addr 109*10465441SEvalZero LDR PC,FIQ_Addr 110*10465441SEvalZero 111*10465441SEvalZeroReset_Addr DCD Reset_Handler 112*10465441SEvalZeroUndef_Addr DCD Undef_Handler 113*10465441SEvalZeroSWI_Addr DCD SWI_Handler 114*10465441SEvalZeroPAbt_Addr DCD PAbt_Handler 115*10465441SEvalZeroDAbt_Addr DCD DAbt_Handler 116*10465441SEvalZero DCD 0 ; Reserved Address 117*10465441SEvalZeroIRQ_Addr DCD IRQ_Handler 118*10465441SEvalZeroFIQ_Addr DCD FIQ_Handler 119*10465441SEvalZero 120*10465441SEvalZeroUndef_Handler B Undef_Handler 121*10465441SEvalZeroSWI_Handler B SWI_Handler 122*10465441SEvalZeroPAbt_Handler B Abort_Handler 123*10465441SEvalZeroDAbt_Handler B Abort_Handler 124*10465441SEvalZeroFIQ_Handler B FIQ_Handler 125*10465441SEvalZero 126*10465441SEvalZeroAbort_Handler PROC 127*10465441SEvalZero ARM 128*10465441SEvalZero EXPORT Abort_Handler 129*10465441SEvalZeroDeadLoop BHI DeadLoop ; Abort happened in irq mode, halt system. 130*10465441SEvalZero ENDP 131*10465441SEvalZero 132*10465441SEvalZero 133*10465441SEvalZero; Reset Handler 134*10465441SEvalZero ;IMPORT __user_initial_stackheap 135*10465441SEvalZero EXPORT Reset_Handler 136*10465441SEvalZeroReset_Handler 137*10465441SEvalZero 138*10465441SEvalZero;**************************************************************** 139*10465441SEvalZero;* Shutdown watchdog 140*10465441SEvalZero;**************************************************************** 141*10465441SEvalZero LDR R0,=RTC_CTR 142*10465441SEvalZero LDR R1,=0x0 143*10465441SEvalZero STR R1,[R0] 144*10465441SEvalZero 145*10465441SEvalZero;**************************************************************** 146*10465441SEvalZero;* shutdown interrupts 147*10465441SEvalZero;**************************************************************** 148*10465441SEvalZero MRS R0, CPSR 149*10465441SEvalZero BIC R0, R0, #MASK_MODE 150*10465441SEvalZero ORR R0, R0, #MODE_SVC32 151*10465441SEvalZero ORR R0, R0, #I_Bit 152*10465441SEvalZero ORR R0, R0, #F_Bit 153*10465441SEvalZero MSR CPSR_c, r0 154*10465441SEvalZero 155*10465441SEvalZero LDR R0,=INTC_IER 156*10465441SEvalZero LDR R1,=0x0 157*10465441SEvalZero STR R1,[R0] 158*10465441SEvalZero LDR R0,=INTC_IMR 159*10465441SEvalZero LDR R1,=0xFFFFFFFF 160*10465441SEvalZero STR R1,[R0] 161*10465441SEvalZero 162*10465441SEvalZero LDR R0,=INTC_FIER 163*10465441SEvalZero LDR R1,=0x0 164*10465441SEvalZero STR R1,[R0] 165*10465441SEvalZero LDR R0,=INTC_FIMR 166*10465441SEvalZero LDR R1,=0x0F 167*10465441SEvalZero STR R1,[R0] 168*10465441SEvalZero 169*10465441SEvalZero;**************************************************************** 170*10465441SEvalZero;* Initialize Stack Pointer 171*10465441SEvalZero;**************************************************************** 172*10465441SEvalZero 173*10465441SEvalZero LDR SP, =Svc_Stack_Top ;init SP_svc 174*10465441SEvalZero 175*10465441SEvalZero MOV R4, #0xD2 ;chmod to irq and init SP_irq 176*10465441SEvalZero MSR cpsr_c, R4 177*10465441SEvalZero LDR SP, =Irq_Stack_Top 178*10465441SEvalZero 179*10465441SEvalZero MOV R4, #0XD1 ;chomod to fiq and init SP_fiq 180*10465441SEvalZero MSR cpsr_c, R4 181*10465441SEvalZero LDR SP, =Unused_Stack_Top 182*10465441SEvalZero 183*10465441SEvalZero MOV R4, #0XD7 ;chomod to abt and init SP_ABT 184*10465441SEvalZero MSR cpsr_c, R4 185*10465441SEvalZero LDR SP, =Unused_Stack_Top 186*10465441SEvalZero 187*10465441SEvalZero MOV R4, #0XDB ;chomod to undf and init SP_UNDF 188*10465441SEvalZero MSR cpsr_c, R4 189*10465441SEvalZero LDR SP, =Unused_Stack_Top 190*10465441SEvalZero 191*10465441SEvalZero ;chomod to abt and init SP_sys 192*10465441SEvalZero MOV R4, #0xDF ;all interrupts disabled 193*10465441SEvalZero MSR cpsr_c, R4 ;SYSTEM mode, @32-bit code mode 194*10465441SEvalZero LDR SP, =Unused_Stack_Top 195*10465441SEvalZero 196*10465441SEvalZero MOV R4, #0XD3 ;chmod to svc modle, CPSR IRQ bit is disable 197*10465441SEvalZero MSR cpsr_c, R4 198*10465441SEvalZero 199*10465441SEvalZero 200*10465441SEvalZero 201*10465441SEvalZero;**************************************************************** 202*10465441SEvalZero;* Initialize PMU & System Clock 203*10465441SEvalZero;**************************************************************** 204*10465441SEvalZero 205*10465441SEvalZero LDR R4, =PMU_PCSR ; ������ģ��ʱ�� 206*10465441SEvalZero LDR R5, =0x0001ffff 207*10465441SEvalZero STR R5, [ R4 ] 208*10465441SEvalZero 209*10465441SEvalZero LDR R4, =PMU_PLTR ; ����PLL�ȶ�����ʱ��Ϊ����ֵ50us*100M. 210*10465441SEvalZero LDR R5, =0x00fa00fa 211*10465441SEvalZero STR R5, [ R4 ] 212*10465441SEvalZero 213*10465441SEvalZero LDR R4, =PMU_PMDR ; ��SLOWģʽ����NORMALģʽ 214*10465441SEvalZero LDR R5, =0x00000001 215*10465441SEvalZero STR R5, [ R4 ] 216*10465441SEvalZero 217*10465441SEvalZero LDR R4, =PMU_PMCR ; ����ϵͳʱ��Ϊ80MHz 218*10465441SEvalZero LDR R5, =0x00004009 ; 400b -- 88M 219*10465441SEvalZero STR R5, [ R4 ] 220*10465441SEvalZero 221*10465441SEvalZero ;PMU_PMCR�Ĵ�����15λ��Ҫ�дӵ͵��ߵķ�ת�����ܴ���PLL��ʱ������ 222*10465441SEvalZero LDR R4, =PMU_PMCR 223*10465441SEvalZero LDR R5, =0x0000c009 224*10465441SEvalZero STR R5, [ R4 ] 225*10465441SEvalZero 226*10465441SEvalZero;**************************************************************** 227*10465441SEvalZero;* ��ʼ��EMI 228*10465441SEvalZero;**************************************************************** 229*10465441SEvalZero 230*10465441SEvalZero IF :DEF:INIT_EMI 231*10465441SEvalZero 232*10465441SEvalZero LDR R4, =EMI_CSACONF ; CSAƬѡʱ��������� 233*10465441SEvalZero LDR R5, =0x08a6a6a1 234*10465441SEvalZero STR R5, [ R4 ] 235*10465441SEvalZero 236*10465441SEvalZero LDR R4, =EMI_CSECONF ; CSEƬѡʱ���������,������� 237*10465441SEvalZero LDR R5, =0x8cfffff1 238*10465441SEvalZero STR R5, [ R4 ] 239*10465441SEvalZero 240*10465441SEvalZero LDR R4, =EMI_SDCONF1 ; SDRAM��������1 241*10465441SEvalZero LDR R5, =0x1E104177 242*10465441SEvalZero STR R5, [ R4 ] 243*10465441SEvalZero 244*10465441SEvalZero LDR R4, =EMI_SDCONF2 ; SDRAM��������2 245*10465441SEvalZero LDR R5, =0x80001860 246*10465441SEvalZero STR R5, [ R4 ] 247*10465441SEvalZero 248*10465441SEvalZero ENDIF 249*10465441SEvalZero 250*10465441SEvalZero; Copy Exception Vectors to Internal RAM 251*10465441SEvalZero 252*10465441SEvalZero IF :DEF:RAM_INTVEC 253*10465441SEvalZero 254*10465441SEvalZero ADR R8, Vectors ; Source 255*10465441SEvalZero LDR R9, =RAM_BASE ; Destination 256*10465441SEvalZero LDMIA R8!, {R0-R7} ; Load Vectors 257*10465441SEvalZero STMIA R9!, {R0-R7} ; Store Vectors 258*10465441SEvalZero LDMIA R8!, {R0-R7} ; Load Handler Addresses 259*10465441SEvalZero STMIA R9!, {R0-R7} ; Store Handler Addresses 260*10465441SEvalZero 261*10465441SEvalZero ENDIF 262*10465441SEvalZero 263*10465441SEvalZero; Remap on-chip RAM to address 0 264*10465441SEvalZero 265*10465441SEvalZero IF :DEF:REMAP 266*10465441SEvalZero 267*10465441SEvalZero LDR R0, =EMI_REMAPCONF 268*10465441SEvalZero IF :DEF:RAM_INTVEC 269*10465441SEvalZero MOV R1, #0x80000000 270*10465441SEvalZero ELSE 271*10465441SEvalZero MOV R1, #0x0000000b 272*10465441SEvalZero ENDIF 273*10465441SEvalZero STR R1, [R0, #0] ; Remap 274*10465441SEvalZero 275*10465441SEvalZero ENDIF 276*10465441SEvalZero 277*10465441SEvalZero;*************************************************************** 278*10465441SEvalZero;* Open irq interrupt 279*10465441SEvalZero;*************************************************************** 280*10465441SEvalZero 281*10465441SEvalZero MRS R4, cpsr 282*10465441SEvalZero BIC R4, R4, #0x80 ; set bit7 to zero 283*10465441SEvalZero MSR cpsr_c, R4 284*10465441SEvalZero 285*10465441SEvalZero; Enter the C code 286*10465441SEvalZero IMPORT __main 287*10465441SEvalZero LDR R0,=__main 288*10465441SEvalZero BX R0 289*10465441SEvalZero 290*10465441SEvalZero 291*10465441SEvalZero IMPORT rt_interrupt_enter 292*10465441SEvalZero IMPORT rt_interrupt_leave 293*10465441SEvalZero IMPORT rt_thread_switch_interrupt_flag 294*10465441SEvalZero IMPORT rt_interrupt_from_thread 295*10465441SEvalZero IMPORT rt_interrupt_to_thread 296*10465441SEvalZero IMPORT rt_hw_trap_irq 297*10465441SEvalZero 298*10465441SEvalZeroIRQ_Handler PROC 299*10465441SEvalZero EXPORT IRQ_Handler 300*10465441SEvalZero STMFD sp!, {r0-r12,lr} 301*10465441SEvalZero BL rt_interrupt_enter 302*10465441SEvalZero BL rt_hw_trap_irq 303*10465441SEvalZero BL rt_interrupt_leave 304*10465441SEvalZero 305*10465441SEvalZero ; if rt_thread_switch_interrupt_flag set, jump to 306*10465441SEvalZero ; rt_hw_context_switch_interrupt_do and don't return 307*10465441SEvalZero LDR r0, =rt_thread_switch_interrupt_flag 308*10465441SEvalZero LDR r1, [r0] 309*10465441SEvalZero CMP r1, #1 310*10465441SEvalZero BEQ rt_hw_context_switch_interrupt_do 311*10465441SEvalZero 312*10465441SEvalZero LDMFD sp!, {r0-r12,lr} 313*10465441SEvalZero SUBS pc, lr, #4 314*10465441SEvalZero ENDP 315*10465441SEvalZero 316*10465441SEvalZero; /* 317*10465441SEvalZero; * void rt_hw_context_switch_interrupt_do(rt_base_t flag) 318*10465441SEvalZero; */ 319*10465441SEvalZerort_hw_context_switch_interrupt_do PROC 320*10465441SEvalZero EXPORT rt_hw_context_switch_interrupt_do 321*10465441SEvalZero MOV r1, #0 ; clear flag 322*10465441SEvalZero STR r1, [r0] 323*10465441SEvalZero 324*10465441SEvalZero LDMFD sp!, {r0-r12,lr}; reload saved registers 325*10465441SEvalZero STMFD sp!, {r0-r3} ; save r0-r3 326*10465441SEvalZero MOV r1, sp 327*10465441SEvalZero ADD sp, sp, #16 ; restore sp 328*10465441SEvalZero SUB r2, lr, #4 ; save old task's pc to r2 329*10465441SEvalZero 330*10465441SEvalZero MRS r3, spsr ; get cpsr of interrupt thread 331*10465441SEvalZero 332*10465441SEvalZero ; switch to SVC mode and no interrupt 333*10465441SEvalZero MSR cpsr_c, #I_Bit :OR F_Bit :OR Mode_SVC 334*10465441SEvalZero 335*10465441SEvalZero STMFD sp!, {r2} ; push old task's pc 336*10465441SEvalZero STMFD sp!, {r4-r12,lr}; push old task's lr,r12-r4 337*10465441SEvalZero MOV r4, r1 ; Special optimised code below 338*10465441SEvalZero MOV r5, r3 339*10465441SEvalZero LDMFD r4!, {r0-r3} 340*10465441SEvalZero STMFD sp!, {r0-r3} ; push old task's r3-r0 341*10465441SEvalZero STMFD sp!, {r5} ; push old task's cpsr 342*10465441SEvalZero MRS r4, spsr 343*10465441SEvalZero STMFD sp!, {r4} ; push old task's spsr 344*10465441SEvalZero 345*10465441SEvalZero LDR r4, =rt_interrupt_from_thread 346*10465441SEvalZero LDR r5, [r4] 347*10465441SEvalZero STR sp, [r5] ; store sp in preempted tasks's TCB 348*10465441SEvalZero 349*10465441SEvalZero LDR r6, =rt_interrupt_to_thread 350*10465441SEvalZero LDR r6, [r6] 351*10465441SEvalZero LDR sp, [r6] ; get new task's stack pointer 352*10465441SEvalZero 353*10465441SEvalZero LDMFD sp!, {r4} ; pop new task's spsr 354*10465441SEvalZero MSR spsr_cxsf, r4 355*10465441SEvalZero LDMFD sp!, {r4} ; pop new task's psr 356*10465441SEvalZero MSR cpsr_cxsf, r4 357*10465441SEvalZero 358*10465441SEvalZero LDMFD sp!, {r0-r12,lr,pc} ; pop new task's r0-r12,lr & pc 359*10465441SEvalZero ENDP 360*10465441SEvalZero 361*10465441SEvalZero 362*10465441SEvalZero 363*10465441SEvalZero ALIGN 364*10465441SEvalZero IF :DEF:__MICROLIB 365*10465441SEvalZero 366*10465441SEvalZero EXPORT __heap_base 367*10465441SEvalZero EXPORT __heap_limit 368*10465441SEvalZero EXPORT __initial_sp 369*10465441SEvalZero 370*10465441SEvalZero ELSE ;__MICROLIB 371*10465441SEvalZero; User Initial Stack & Heap 372*10465441SEvalZero AREA |.text|, CODE, READONLY 373*10465441SEvalZero 374*10465441SEvalZero IMPORT __use_two_region_memory 375*10465441SEvalZero EXPORT __user_initial_stackheap 376*10465441SEvalZero__user_initial_stackheap 377*10465441SEvalZero 378*10465441SEvalZero LDR R0, = Heap_Mem 379*10465441SEvalZero LDR R1, = (Svc_Stack + Svc_Stack_Size) 380*10465441SEvalZero LDR R2, = (Heap_Mem + Heap_Size) 381*10465441SEvalZero LDR R3, = Svc_Stack 382*10465441SEvalZero BX LR 383*10465441SEvalZero ALIGN 384*10465441SEvalZero ENDIF 385*10465441SEvalZero END 386