📄 bootloader.s
字号:
SUB LR,LR,#4 ;//保存实际的返回地址
STMFD SP!,{R0-R11,LR} ;//R0-R3通常用来传递参数和保存结果,R4-R11通常保存局部变量
MRS R1, SPSR
STMFD SP!,{R1} ;//保存IRQ出现前CPSR的值到堆栈
BL IRQ_Handler ;//响应IRQ异常,来自Inth.c文件
LDMFD SP!,{R1}
MSR SPSR_cxsf,R1 ;//恢复中断前的CPSR
LDMFD SP!,{R0-R11,PC}^ ;//从IRQ返回
;/*********************************************************************************************************
;** 函数名称: INT_Initialize
;** 功能描述: 复位入口
;**
;** 参 数: None
;**
;** 返 回 值: None
;**
;** 作 者: 罗辉联
;** 日 期: 2006年5月18日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
INT_Initialize
LDR PC, =NextInst
;等待OSC稳定
NextInst
NOP ;//系统启动阶段采用默认的晶振频率
NOP
NOP
NOP
NOP
NOP ;//应用程序运行后需要更改时钟频率,可在C代码中重新设置
NOP
NOP
NOP
;保证一开始处理器处于管理模式,且禁止FIQ,IRQ中断
MRS a1,CPSR ;//获得当前的CPSR
BIC a1,a1,#MODE_MASK ;//清除当前的工作模式位
ORR a1,a1,#SVC_MODE ;//设置管理模式位
ORR a1,a1,#NO_INT ;//保证IRQ/FIQ处于禁止状态
MSR CPSR_cxsf,a1 ;//设置新的CPSR
;获得ABT,UND,SVC模式堆栈栈低位置
LDR a1,[pc, #ABT_UND_SVC_STACK_SEGMENT-.-8]
;建立ABORT模式下的数据栈
MOV a2,#ABT_STACK_SIZE ;//获得Abort模式堆栈大小
SUB a2,a2,#4 ;//减去一个字,获得ABT_UND_SVC堆栈的开始地址
ADD a3,a1,a2 ;//设置Abort模式堆栈区间
BIC a3,a3,#3 ;//保证字对齐
MRS a1,CPSR ;//获得当前CPSR
BIC a1,a1,#MODE_MASK ;//清除当前的工作模式位
ORR a1,a1,#ABT_MODE ;//设置Abort模式位
MSR CPSR_cxsf,a1 ;//写入Abort模式位
MOV sp,a3 ;//设置Abort模式堆栈
;建立UNDEF模式下的数据栈
MOV a2,#UNF_STACK_SIZE ;//获得Undefined模式堆栈大小
ADD a3,a3,a2 ;//设置Undefined模式堆栈区间
BIC a3,a3,#3 ;//保证字对齐
MRS a1,CPSR ;
BIC a1,a1,#MODE_MASK ;//清除当前的工作模式位
ORR a1,a1,#UNF_MODE ;//设置Undefined模式位
MSR CPSR_cxsf,a1 ;
MOV sp,a3 ;//设置Undefined模式堆栈
;建立管理模式下的数据栈,并回到管理模式
MOV a2,#SVC_STACK_SIZE ;//获得SVC模式堆栈大小
ADD a3,a3,a2 ;//设置SVC模式堆栈区间
BIC a3,a3,#3 ;//保证字对齐
MRS a1,CPSR ;
BIC a1,a1,#MODE_MASK ;//清除当前的工作模式位
ORR a1,a1,#SVC_MODE ;
MSR CPSR_cxsf,a1 ;//回到管理模式,也为了后面的操作
MOV sp,a3 ;//设置SVC模式堆栈
BL ChipResetInit ;//ARM芯片复位初始化,在ChipReset.s中定义
;//注意重映射与向量拷贝放在C代码中执行
;获得IRQ,FIQ,SYS等模式堆栈栈低位置
LDR a1,[pc, #IRQ_FIQ_SYS_STACK_SEGMENT-.-8]
;建立FIQ模式下的数据栈
MOV a2,#FIQ_STACK_SIZE ;//获得FIQ模式堆栈大小
SUB a2,a2,#4 ;//减去一个字,获得IRQ_FIQ_SYS堆栈的开始地址
ADD a3,a1,a2 ;//设置FIQ模式堆栈区间
BIC a3,a3,#3 ;//保证字对齐
MRS a1,CPSR ;
BIC a1,a1,#MODE_MASK ;//清除当前的工作模式位
ORR a1,a1,#FIQ_MODE ;//设置FIQ模式位
MSR CPSR_cxsf,a1 ;
MOV sp,a3 ;//设置FIQ模式堆栈
;建立IRQ模式下的数据栈
MOV a2,#IRQ_STACK_SIZE ;//获得IRQ模式堆栈大小
ADD a3,a3,a2 ;//设置IRQ模式堆栈区间
BIC a3,a3,#3 ;//保证字对齐
MRS a1,CPSR ;
BIC a1,a1,#MODE_MASK ;//清除当前的工作模式位
ORR a1,a1,#IRQ_MODE ;//设置IRQ模式位
MSR CPSR_cxsf,a1 ;
MOV sp,a3 ;//设置IRQ模式堆栈
;建立SYS模式下的数据栈
MOV a2,#SYS_STACK_SIZE ;//获得SYS模式堆栈大小
ADD a3,a3,a2 ;//设置SYS模式堆栈区间
BIC a3,a3,#3 ;//保证字对齐
MRS a1,CPSR ;
BIC a1,a1,#MODE_MASK ;//清除当前的工作模式位
ORR a1,a1,#SYS_MODE ;//设置SYS模式位
MSR CPSR_cxsf,a1 ;
MOV sp,a3 ;//设置SYS模式堆栈,USR与SYS共用堆栈空间
MSR CPSR_cxsf, #SYS_MODE ;//允许IRQ和FIQ中断
B __main ;//进入main后程序不会返回,所以用B而不是BL指令执行__main
;//本工程的启动代码使用编译器生成的初始化函数对所有应用程
;//序的数据区进行设置,包含RW,ZI段的数据,C运行库和额外的
;//堆区也在此处初始化,一旦运行环境设置完成,初始化代码就
;//调用应用程序的"主"如口点,而__main就是编译生成代码的主入
;//口点。
;/*********************************************************************************************************
;** 函数名称: __user_initial_stackheap
;** 功能描述: 库函数初始化堆和栈,不能删除
;**
;** 参 数: 参考库函数手册
;**
;** 返 回 值: 参考库函数手册
;**
;** 作 者: 罗辉联
;** 日 期: 2006年5月18日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
__user_initial_stackheap
LDR R0,BOTTOM_OF_HEAP
MOV PC,LR
;/*********************************************************************************************************
;** 函数名称: __rt_div0
;** 功能描述: 整数除法除数为0错误处理函数
;**
;** 参 数: 参考库函数手册
;**
;** 返 回 值: None
;**
;** 作 者: 罗辉联
;** 日 期: 2006年5月18日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
__rt_div0
B __rt_div0
ABT_UND_SVC_STACK_SEGMENT DCD abt_und_svc_stack
IRQ_FIQ_SYS_STACK_SEGMENT DCD irq_fiq_sys_stack
BOTTOM_OF_HEAP DCD bottom_of_heap
;//******************************************************************************************************
; 分配堆空间
;//******************************************************************************************************
AREA lib_function_heap, DATA, NOINIT, ALIGN=2
EXPORT bottom_of_heap
bottom_of_heap SPACE 256 ;//库函数的堆空间
;//******************************************************************************************************
; 分配堆栈空间
;//******************************************************************************************************
AREA ExceptionStacks, DATA, NOINIT, ALIGN=2
EXPORT irq_fiq_sys_stack
EXPORT abt_und_svc_stack
irq_fiq_sys_stack SPACE IRQ_FIQ_SYS_STACK_SIZE
abt_und_svc_stack SPACE ABT_UND_SVC_STACK_SIZE
LTORG
END
;/*****************************************End of File********************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -