44binit.s注释

本文档详细介绍了44B0处理器的初始化代码,包括设置内存控制器、中断处理程序、栈指针初始化等。此外,还讨论了中断向量表的布局和非向量中断的处理方式。通过对中断处理函数的宏定义,实现中断服务程序的跳转。代码段以汇编语言编写,用于设置和配置系统硬件并准备进入C语言的main函数执行。
摘要由CSDN通过智能技术生成

; *******************************************************
; * NAME : 44BINIT.S *
; * Version : 10.JAn.2003 *
; * Description: *
; * C start up codes *
; * Configure memory, Initialize ISR ,stacks *
; * Initialize C-variables *
; * Fill zeros into zero-initialized C-variables *
; *******************************************************

GET option.s ;相当于c语言中的#include "option.s"
GET memcfg.s

;Interrupt Control
;声明一些符号常量,这些符号常量和相应寄存器的地址对应
INTPND EQU 0x01e00004
;指示中断请求状态寄存器 每一位代变一种中断请求具体表示哪一种中断请参考44b0 spec
INTMOD EQU 0x01e00008
;中断模式寄存器 有两种中断模式对应位为1代表fip mode 0代表riq mode
INTMSK EQU 0x01e0000c
;确定哪个中断源被屏蔽 屏蔽的中断源将不被服务
I_ISPR EQU 0x01e00020
;中断服务挂起寄存器
I_CMST EQU 0x01e0001c ;当前主寄存器irq优先级

;Watchdog timer
WTCON EQU 0x01d30000 ;看门狗定时器控制寄存器

;Clock Controller
PLLCON EQU 0x01d80000
;pll控制寄存器
CLKCON EQU 0x01d80004
;时钟控制寄存器
LOCKTIME EQU 0x01d8000c ;锁定时间计数值寄存器

;Memory Controller
REFRESH EQU 0x01c80024
;Dram/sdram刷新控制寄存器
;下面是对arm处理器模式寄存器对应值的常数定义,arm处理器中有一个CPSR程序状态寄存器 它的后五位决定目前的处理器模式
;Pre-defined constants
USERMODE EQU 0x10
;用户模式
FIQMODE EQU 0x11
;FIQ模式
IRQMODE EQU 0x12 ;IRQ模式
SVCMODE EQU 0x13
;管理模式
ABORTMODE EQU 0x17
;中止模式
UNDEFMODE EQU 0x1b ;未定义
MODEMASK EQU 0x1f
;系统模式
NOINT EQU 0xc0 ;

;check if tasm.exe is used.
;arm处理器有两种工作状态 1.arm:32位 这种工作状态下执行字对准的arm指令 2.Thumb:16位 这种工作状态执行半字对准的Thumb指令
;因为处理器分为16位 32位两种工作状态 程序的编译器也是分16位和32两种编译方式 所以下面的程序用于根据处理器工作状态确定编译器编译方式
;code16伪指令指示汇编编译器后面的指令为16位的thumb指令
;code32伪指令指示汇编编译器后面的指令为32位的arm指令
;这段是为了统一目前的处理器工作状态和软件编译方式(16位编译环境使用tasm.exe编译)
GBLL THUMBCODE
;设置一个全局逻辑变量
[ {CONFIG} = 16
;if config==16 这里表示你的目前处于领先地16位编译方式
THUMBCODE SETL {TRUE}
;设置THUMBCODE 为 true
CODE32
;转入32位编译模式
|  
;else
THUMBCODE SETL {FALSE}
;设置THUMBCODE 为 false
]

[ THUMBCODE ;if THUMBCODE==TRUE
CODE32
;for start-up code for Thumb mode;转入32位编译方式
]
;注意下面这段程序是个宏定义 很多人对这段程序不理解 我再次强调这是一个宏定义 所以大家要注意了下面包含的HandlerXXX HANDLER HandleXXX将都被下面这段程序展开
;这段程序用于把中断服务程序的首地址装载到pc中,有人称之为“加载程序”。
;本初始化程序定义了一个数据区(在文件最后),34个字空间,存放相应中断服务程序的首地址。每个字空间都有一个标号,以Handle***命名。
;在向量中断模式下使用“加载程序”来执行中断服务程序。
;这里就必须讲一下向量中断模式和非向量中断模式的概念
;向量中断模式是当cpu读取位于0x18处的IRQ中断指令的时候,系统自动读取对应于该中断源确定地址上的指令取代0x18处的指令,通过跳转指令系统就直接跳转到对应地址
;函数中 节省了中断处理时间提高了中断处理速度标 例如 ADC中断的向量地址为0xC0,则在0xC0处放如下代码:ldr PC,=HandlerADC 当ADC中断产生的时候系统会
;自动跳转到HandlerADC函数中
;非向量中断模式处理方式是一种传统的中断处理方法,当系统产生中断的时候,系统将interrupt pending寄存器中对应标志位置位 然后跳转到位于0x18处的统一中断
;函数中 该函数通过读取interrupt pending寄存器中对应标志位 来判断中断源 并根据优先级关系再跳到对应中断源的处理代码中
MACRO
$HandlerLabel HANDLER $HandleLabel

$HandlerLabel
sub sp,sp,#4
;decrement sp(to store jump address)
stmfd sp!,{r0} ;ADS仅支持FD(满递减)型堆栈
<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值