使用的周立功的启动代码,
void TargetResetInit(void) { #ifdef __DEBUG MEMMAP = 0x3; //remap #endif
#ifdef __OUT_CHIP MEMMAP = 0x3; //remap #endif
#ifdef __IN_CHIP MEMMAP = 0x1; //remap #endif
PINSEL0 = (PINSEL0 & 0xFFFF0000) | 0x05 | 0x50;
/* 设置系统各部分时钟 */ PLLCON = 1; #if (Fpclk / (Fcclk / 4)) == 1 VPBDIV = 0; #endif #if (Fpclk / (Fcclk / 4)) == 2 VPBDIV = 2; #endif #if (Fpclk / (Fcclk / 4)) == 4 VPBDIV = 1; #endif
#if (Fcco / Fcclk) == 2 PLLCFG = ((Fcclk / Fosc) - 1) | (0 << 5); #endif #if (Fcco / Fcclk) == 4 PLLCFG = ((Fcclk / Fosc) - 1) | (1 << 5); #endif #if (Fcco / Fcclk) == 8 PLLCFG = ((Fcclk / Fosc) - 1) | (2 << 5); #endif #if (Fcco / Fcclk) == 16 PLLCFG = ((Fcclk / Fosc) - 1) | (3 << 5); #endif PLLFEED = 0xaa; PLLFEED = 0x55; while((PLLSTAT & (1 << 10)) == 0); PLLCON = 3; PLLFEED = 0xaa; PLLFEED = 0x55;
/* 设置存储器加速模块 */ MAMCR = 0; #if Fcclk < 20000000 MAMTIM = 1; #else #if Fcclk < 40000000 MAMTIM = 2; #else MAMTIM = 3; #endif #endif MAMCR = 2;
/* 设置串行口 */ InitialiseUART0(115200);
/* 设置实时时钟 */ CCR = 1; PREINT = Fpclk / 32768 - 1; PREFRAC = Fpclk - (Fpclk / 32768) * 32768; YEAR = 2003; MONTH = 6; DOM = 2;
VICIntEnClr = 0xffffffff; VICVectAddr = 0; VICIntSelect = 0; T0IR = 0xffffffff; T0TCR = 0X02; }
在start.s中调用的:
;定义堆栈的大小 FIQ_STACK_LEGTH EQU 0 IRQ_STACK_LEGTH EQU 9*8 ABT_STACK_LEGTH EQU 0 UND_STACK_LEGTH EQU 0
NoInt EQU 0x80
USR32Mode EQU 0x10 SVC32Mode EQU 0x13 SYS32Mode EQU 0x1f IRQ32Mode EQU 0x12 FIQ32Mode EQU 0x11
PINSEL2 EQU 0xE002C014
BCFG0 EQU 0xFFE00000 BCFG1 EQU 0xFFE00004 BCFG2 EQU 0xFFE00008 BCFG3 EQU 0xFFE0000C
;引入的外部标号在这声明 IMPORT FIQ_Exception ;快速中断异常处理程序 IMPORT __main ;C语言主程序入口 IMPORT TargetResetInit ;目标板基本初始化 IMPORT StackUsr IMPORT bottom_of_heap IMPORT SoftwareInterrupt
;给外部使用的标号在这声明 EXPORT Reset EXPORT __rt_div0 EXPORT __user_initial_stackheap
CODE32
AREA vectors,CODE,READONLY ENTRY ;中断向量表 Reset LDR PC, ResetAddr LDR PC, UndefinedAddr LDR PC, SWI_Addr LDR PC, PrefetchAddr LDR PC, DataAbortAddr DCD 0xb9205f80 LDR PC, [PC, #-0xff0] LDR PC, FIQ_Addr
ResetAddr DCD ResetInit UndefinedAddr DCD Undefined SWI_Addr DCD SoftwareInterrupt PrefetchAddr DCD PrefetchAbort DataAbortAddr DCD DataAbort Nouse DCD 0 IRQ_Addr DCD 0 FIQ_Addr DCD FIQ_Handler
;未定义指令 Undefined B Undefined
;取指令中止 PrefetchAbort B PrefetchAbort
;取数据中止 DataAbort B DataAbort
;快速中断 FIQ_Handler STMFD SP!, {R0-R3, LR} BL FIQ_Exception LDMFD SP!, {R0-R3, LR} SUBS PC, LR, #4
InitStack MOV R0, LR
;设置中断模式堆栈 MSR CPSR_c, #0xd2 LDR SP, StackIrq ;设置快速中断模式堆栈 MSR CPSR_c, #0xd1 LDR SP, StackFiq ;设置中止模式堆栈 MSR CPSR_c, #0xd7 LDR SP, StackAbt ;设置未定义模式堆栈 MSR CPSR_c, #0xdb LDR SP, StackUnd ;设置系统模式堆栈 MSR CPSR_c, #0xdf LDR SP, =StackUsr
MOV PC, R0
ResetInit ;初始化外部总线控制器,根据目标板决定配置
LDR R0, =PINSEL2 IF :DEF: EN_CRP LDR R1, =0x0f814910 ELSE LDR R1, =0x0f814914 ENDIF STR R1, [R0]
LDR R0, =BCFG0 LDR R1, =0x1000ffef STR R1, [R0]
LDR R0, =BCFG1 LDR R1, =0x1000ffef STR R1, [R0]
; LDR R0, =BCFG2 ; LDR R1, =0x2000ffef ; STR R1, [R0]
LDR R0, =BCFG3 LDR R1, =0x10001460;0x2000ffef STR R1, [R0] BL InitStack ;初始化堆栈 BL TargetResetInit ;目标板基本初始化 ;跳转到c语言入口 B __main
__user_initial_stackheap MOV pc,lr
__rt_div0 B __rt_div0
StackIrq DCD IrqStackSpace + (IRQ_STACK_LEGTH - 1)* 4 StackFiq DCD FiqStackSpace + (FIQ_STACK_LEGTH - 1)* 4 StackAbt DCD AbtStackSpace + (ABT_STACK_LEGTH - 1)* 4 StackUnd DCD UndtStackSpace + (UND_STACK_LEGTH - 1)* 4
IF :DEF: EN_CRP IF . >= 0x1fc INFO 1,"
The data at 0x000001fc must be 0x87654321.
Please delete some source before this line." ENDIF CrpData WHILE . < 0x1fc NOP WEND CrpData1 DCD 0x87654321 ;/* 当此数为0x87654321时,用户程序被保护 */ ENDIF
;/* 分配堆栈空间 */ AREA MyStacks, DATA, NOINIT, ALIGN=2 IrqStackSpace SPACE IRQ_STACK_LEGTH * 4 ;中断模式堆栈空间 FiqStackSpace SPACE FIQ_STACK_LEGTH * 4 ;快速中断模式堆栈空间 AbtStackSpace SPACE ABT_STACK_LEGTH * 4 ;中止义模式堆栈空间 UndtStackSpace SPACE UND_STACK_LEGTH * 4 ;未定义模式堆栈 END |