<br />;定义堆栈的大小<br />USR_STACK_LEGTH EQU 256<br />SVC_STACK_LEGTH EQU 0<br />FIQ_STACK_LEGTH EQU 0<br />IRQ_STACK_LEGTH EQU 256<br />ABT_STACK_LEGTH EQU 0<br />UND_STACK_LEGTH EQU 0<br /><br />NoInt EQU 0x80<br /><br />USR32Mode EQU 0x10<br />SVC32Mode EQU 0x13<br />SYS32Mode EQU 0x1f<br />IRQ32Mode EQU 0x12<br />FIQ32Mode EQU 0x11<br /><br />PINSEL2 EQU 0xE002C014<br /><br />BCFG0 EQU 0xFFE00000<br />BCFG1 EQU 0xFFE00004<br />BCFG2 EQU 0xFFE00008<br />BCFG3 EQU 0xFFE0000C<br /><br /><br />;引入的外部标号在这声明<br /> IMPORT FIQ_Exception ;快速中断异常处理程序<br /> IMPORT __main ;C语言主程序入口 <br /> IMPORT TargetResetInit ;目标板基本初始化<br /> IMPORT StackUsr<br /> IMPORT bottom_of_heap<br /><br />;给外部使用的标号在这声明<br /> EXPORT Reset<br /> EXPORT __rt_div0<br /> EXPORT __user_initial_stackheap<br /><br /> CODE32<br /><br /> AREA vectors,CODE,READONLY<br /> ENTRY<br />;中断向量表<br />Reset<br /> LDR PC, ResetAddr<br /> LDR PC, UndefinedAddr<br /> LDR PC, SWI_Addr<br /> LDR PC, PrefetchAddr<br /> LDR PC, DataAbortAddr<br /> DCD 0xb9205f80<br /> LDR PC, [PC, #-0xff0]<br /> LDR PC, FIQ_Addr<br /><br />ResetAddr DCD ResetInit<br />UndefinedAddr DCD Undefined<br />SWI_Addr DCD SoftwareInterrupt<br />PrefetchAddr DCD PrefetchAbort<br />DataAbortAddr DCD DataAbort<br />Nouse DCD 0<br />IRQ_Addr DCD 0<br />FIQ_Addr DCD FIQ_Handler<br /><br />;未定义指令<br />Undefined<br /> B Undefined<br /><br />;软中断<br />SoftwareInterrupt<br /> B SoftwareInterrupt<br /><br />;取指令中止<br />PrefetchAbort<br /> B PrefetchAbort<br /><br />;取数据中止<br />DataAbort<br /> B DataAbort<br /><br />;快速中断<br />FIQ_Handler<br /> STMFD SP!, {R0-R3, LR}<br /> BL FIQ_Exception<br /> LDMFD SP!, {R0-R3, LR}<br /> SUBS PC, LR, #4<br /><br />;/*********************************************************************************************************<br />;** 函数名称: InitStack<br />;** 功能描述: 初始化堆栈<br />;** 输 入: 无<br />;** 输 出 : 无<br />;** 全局变量: 无<br />;** 调用模块: 无<br />;** <br />;** 作 者: 陈明计<br />;** 日 期: 2004年2月2日<br />;**-------------------------------------------------------------------------------------------------------<br />;** 修 改: <br />;** 日 期: <br />;**-------------------------------------------------------------------------------------------------------<br />;********************************************************************************************************/<br />InitStack <br /> MOV R0, LR<br /><br />;设置管理模式堆栈<br /> MSR CPSR_c, #0xd3<br /> LDR SP, StackSvc<br />;设置中断模式堆栈<br /> MSR CPSR_c, #0xd2<br /> LDR SP, StackIrq<br />;设置快速中断模式堆栈<br /> MSR CPSR_c, #0xd1<br /> LDR SP, StackFiq<br />;设置中止模式堆栈<br /> MSR CPSR_c, #0xd7<br /> LDR SP, StackAbt<br />;设置未定义模式堆栈<br /> MSR CPSR_c, #0xdb<br /> LDR SP, StackUnd<br />;设置系统模式堆栈<br /> MSR CPSR_c, #0xdf<br /> LDR SP, =StackUsr<br /><br /> MOV PC, R0<br /><br />;/*********************************************************************************************************<br />;** 函数名称: ResetInit<br />;** 功能描述: 复位入口<br />;** <br />;** 输 入: 无<br />;**<br />;** 输 出: 无<br />;** <br />;** 全局变量: 无<br />;** 调用模块: 无<br />;**<br />;** 作 者: 陈明计<br />;** 日 期: 2004年2月2日<br />;**-------------------------------------------------------------------------------------------------------<br />;** 修改人: 陈明计<br />;** 日 期: 2004年3月3日<br />;**------------------------------------------------------------------------------------------------------<br />;********************************************************************************************************/<br />ResetInit<br />;初始化外部总线控制器,根据目标板决定配置<br /><br /> LDR R0, =PINSEL2<br /> IF :DEF: EN_CRP<br /> LDR R1, =0x0f814910<br /> ELSE<br /> LDR R1, =0x0f814914<br /> ENDIF<br /> STR R1, [R0]<br /><br /> LDR R0, =BCFG0<br /> LDR R1, =0x1000ffef<br /> STR R1, [R0]<br /><br /> LDR R0, =BCFG1<br /> LDR R1, =0x1000ffef<br /> STR R1, [R0]<br /><br />; LDR R0, =BCFG2<br />; LDR R1, =0x2000ffef<br />; STR R1, [R0]<br /><br />; LDR R0, =BCFG3<br />; LDR R1, =0x2000ffef<br />; STR R1, [R0]<br /> <br /> BL InitStack ;初始化堆栈<br /> BL TargetResetInit ;目标板基本初始化<br /> ;跳转到c语言入口<br /> B __main<br /><br /><br />;/*********************************************************************************************************<br />;** 函数名称: __user_initial_stackheap <br />;** 功能描述: 库函数初始化堆和栈,不能删除<br />;** <br />;** 输 入: 参考库函数手册<br />;**<br />;** 输 出: 参考库函数手册<br />;** <br />;** 全局变量: 无<br />;** 调用模块: 无<br />;**<br />;** 作 者: 陈明计<br />;** 日 期: 2004年2月2日<br />;**-------------------------------------------------------------------------------------------------------<br />;** 修改人:<br />;** 日 期:<br />;**------------------------------------------------------------------------------------------------------<br />;********************************************************************************************************/<br />__user_initial_stackheap <br /> LDR r0,=bottom_of_heap<br /> MOV pc,lr<br /><br /><br />;/*********************************************************************************************************<br />;** 函数名称: __rt_div0<br />;** 功能描述: 整数除法除数为0错误处理函数,替代原始的__rt_div0减少目标代码大小<br />;** <br />;** 输 入: 参考库函数手册<br />;**<br />;** 输 出: 无<br />;** <br />;** 全局变量: 无<br />;** 调用模块: 无<br />;**<br />;** 作 者: 陈明计<br />;** 日 期: 2004年2月2日<br />;**-------------------------------------------------------------------------------------------------------<br />;** 修改人:<br />;** 日 期:<br />;**------------------------------------------------------------------------------------------------------<br />;********************************************************************************************************/<br />__rt_div0<br /><br /> B __rt_div0<br /><br />StackSvc DCD SvcStackSpace + (SVC_STACK_LEGTH - 1)* 4<br />StackIrq DCD IrqStackSpace + (IRQ_STACK_LEGTH - 1)* 4<br />StackFiq DCD FiqStackSpace + (FIQ_STACK_LEGTH - 1)* 4<br />StackAbt DCD AbtStackSpace + (ABT_STACK_LEGTH - 1)* 4<br />StackUnd DCD UndtStackSpace + (UND_STACK_LEGTH - 1)* 4<br /><br />;/*********************************************************************************************************<br />;** 函数名称: CrpData<br />;** 功能描述: 支持芯片加密功能<br />;** <br />;** 输 入: 无<br />;**<br />;** 输 出: 无<br />;** <br />;** 全局变量: 无<br />;** 调用模块: 无<br />;**<br />;** 作 者: 陈明计<br />;** 日 期: 2004年3月27日<br />;**-------------------------------------------------------------------------------------------------------<br />;** 修改人:<br />;** 日 期:<br />;**------------------------------------------------------------------------------------------------------<br />;********************************************************************************************************/<br /> IF :DEF: EN_CRP<br /> IF . >= 0x1fc<br /> INFO 1,"
The data at 0x000001fc must be 0x87654321.
Please delete some source before this line."<br /> ENDIF<br />CrpData<br /> WHILE . < 0x1fc<br /> NOP<br /> WEND<br />CrpData1<br /> DCD 0x87654321 ;/* 当此数为0x87654321时,用户程序被保护 */<br /> ENDIF<br />;/* 分配堆栈空间 */<br /> AREA MyStacks, DATA, NOINIT, ALIGN=2<br />SvcStackSpace SPACE SVC_STACK_LEGTH * 4 ;管理模式堆栈空间<br />IrqStackSpace SPACE IRQ_STACK_LEGTH * 4 ;中断模式堆栈空间<br />FiqStackSpace SPACE FIQ_STACK_LEGTH * 4 ;快速中断模式堆栈空间<br />AbtStackSpace SPACE ABT_STACK_LEGTH * 4 ;中止义模式堆栈空间<br />UndtStackSpace SPACE UND_STACK_LEGTH * 4 ;未定义模式堆栈<br /> END<br />;/*********************************************************************************************************<br />;** End Of File<br />;********************************************************************************************************/<br />
|