1、FIQMODE EQU 0x11IRQMODE EQU 0x12SVCMODE EQU 0x13ABORTMODE EQU 0x17UNDEFMODE EQU 0x1bMODEMASK EQU 0x1fNOINT EQU 0xc0 ;IRQ、FIQ中断禁止田凯文用来判断是用16位指令集还是32位指令集田凯文GBLL THUMBCODE CONFIG = 16 THUMBCODE SETL TRUECODE32| THUMBCODE SETL FALSE THUMBCODECODE32 ;for start-up code for Thumb modeMACRO ;宏定义开始,P128田凯文这个
2、宏的功能就是先将r0寄存器中的值存入栈中,接着又将中断函数的入口地址田凯文以r0为中转,存入数据栈中,再通过栈还原r0的值,接着将存入栈中的中断函数的入口地址田凯文取出,送给PC,以实现中断函数的跳转田凯文如果是IRQ中断并且是非向量中断,就会跳转到标号IsrIRQ处,然后再跳转到中断二级向量表田凯文如果是向量中断则通过这一步,直接跳转到中断二级向量表田凯文非向量中断跳转流程:b HandlerIRQ -HandlerIRQ HANDLER HandleIRQ-IsrIRQ- _ISR_STARTADDRESS 田凯文向量中断跳转流程:VECTOR_BRANCH -$HandlerLabel
3、HANDLER $HandleLabel - _ISR_STARTADDRESS 田凯文向量中断比非向量中断少了一个IsrIRQ田凯文$HandlerLabel HANDLER $HandleLabel ;宏名为HANDLER,参数为$HandleLabel田凯文$HandlerLabel ;这里定义了一个标号HandlerLabel ,是伪操作田凯文sub sp,sp,#4 ;减法指令,sp=sp-4,p66田凯文stmfd sp!,r0 ;这是一个压栈操作,由于它是事先递减方式,所以sp的值先减4,即将r0寄存器中的数据田凯文存入以sp-4的值为地址的内存单元,并且sp的值更新为sp-4田
4、凯文stmfd是对FD类型数据栈操作的指令,因为是FD类型的数据栈田凯文所以栈的地址是递减的,而SP后面的!号,指的是,是否更新基地址寄存器田凯文如果有!号,指令编码对应的W位置1,基地址寄存器,即sp更新,sp=sp-4田凯文这条指令的目的是为了存储r0寄存器的值,因为后面要用到田凯文现在存储,是为了后面的还原田凯文这条指令没有目标寄存器,只有基址寄存器,所以sp代表的就是地址田凯文ldr r0,=$HandleLabel ;将标号$HandleLabel的值送给r0,$HandleLabel的值就是存放IsrIRQ的地址,在b ResetHandler 中 已经定义过了田凯文ldr r0,
5、r0 ;将以r0的值为地址的内存单元中的数据取出,存入r0寄存器中,田凯文 这条ldr 指令中基址寄存器为r0,即第二个操作数的内存地址为0,p34田凯文str r0,sp,#4 ;将r0的值放入地址为sp+4的存储单元中,这就是前面sp-4的原因,田凯文它是为了给这一步预留存储空间田凯文ldmfd sp!,r0,pc ;这是一个出栈操作,由于它是事后递增方式,即将以sp的值为地址的内存单元中田凯文的值存入r0寄存器中,即还原r0寄存器中值,stmfd sp!,r0这条指令,就是为了这一刻田凯文再将以sp+4的值为地址的内存单元中的数据取出,即r0里面的值,也就是中断函数的入口地址田凯文送给P
6、C寄存器,并且sp更新为sp+8,即sp=sp+8田凯文MEND ;宏定义结束田凯文IMPORT |Image$RO$Limit| ; End of ROM code (=start of ROM data)IMPORT |Image$RW$Base| ; Base of RAM to initialiseIMPORT |Image$ZI$Base| ; Base and limit of areaIMPORT |Image$ZI$Limit| ; to zero initialiseIMPORT Main ; The main entry of mon program AREA Init,C
7、ODE,READONLY ;定义一个名为Init的代码段,属性为READONLY田凯文ENTRY ;伪操作指定程序的入口点 p136田凯文b ResetHandler ;for debugb HandlerUndef ;handlerUndefb HandlerSWI ;SWI interrupt handlerb HandlerPabort ;handlerPAbortb HandlerDabort ;handlerDAbortb . ;handlerReservedb HandlerIRQ ;非向量中断跳转到此处田凯文b HandlerFIQ*IMPORTANT NOTE*If the H
8、/W vectored interrutp mode is enabled, The above two instructions shouldbe changed like below, to work-around with H/W bug of S3C44B0X interrupt controller. b HandlerIRQ - subs pc,lr,#4VECTOR_BRANCH ;这是向量中断的入口地址田凯文ldr pc,=HandlerEINT0 ;mGA H/W interrupt vector tableldr pc,=HandlerEINT1 ; ldr pc,=Han
9、dlerEINT2 ;ldr pc,=HandlerEINT3 ;ldr pc,=HandlerEINT4567 ;ldr pc,=HandlerTICK ;mGAb .ldr pc,=HandlerZDMA0 ;mGBldr pc,=HandlerZDMA1 ;ldr pc,=HandlerBDMA0 ;ldr pc,=HandlerBDMA1 ;ldr pc,=HandlerWDT ;ldr pc,=HandlerUERR01 ;ldr pc,=HandlerTIMER0 ;mGCldr pc,=HandlerTIMER1 ;ldr pc,=HandlerTIMER2 ;ldr pc,=H
10、andlerTIMER3 ;ldr pc,=HandlerTIMER4 ;ldr pc,=HandlerTIMER5 ;ldr pc,=HandlerURXD0 ;mGDldr pc,=HandlerURXD1 ;ldr pc,=HandlerIIC ;ldr pc,=HandlerSIO ;ldr pc,=HandlerUTXD0 ;ldr pc,=HandlerUTXD1 ;ldr pc,=HandlerRTC ;mGKAldr pc,=HandlerADC ;mGKB mGKB0xe0=EnterPWDNldr pc,=EnterPWDNLTORG ;声明一个数据缓冲池的开始 P120田
11、凯文 HandlerFIQ HANDLER HandleFIQHandlerIRQ HANDLER HandleIRQHandlerUndef HANDLER HandleUndefHandlerSWI HANDLER HandleSWIHandlerDabort HANDLER HandleDabortHandlerPabort HANDLER HandlePabortHandlerADC HANDLER HandleADCHandlerRTC HANDLER HandleRTCHandlerUTXD1 HANDLER HandleUTXD1HandlerUTXD0 HANDLER Hand
12、leUTXD0HandlerSIO HANDLER HandleSIOHandlerIIC HANDLER HandleIICHandlerURXD1 HANDLER HandleURXD1HandlerURXD0 HANDLER HandleURXD0HandlerTIMER5 HANDLER HandleTIMER5HandlerTIMER4 HANDLER HandleTIMER4HandlerTIMER3 HANDLER HandleTIMER3HandlerTIMER2 HANDLER HandleTIMER2HandlerTIMER1 HANDLER HandleTIMER1Han
13、dlerTIMER0 HANDLER HandleTIMER0HandlerUERR01 HANDLER HandleUERR01HandlerWDT HANDLER HandleWDTHandlerBDMA1 HANDLER HandleBDMA1HandlerBDMA0 HANDLER HandleBDMA0HandlerZDMA1 HANDLER HandleZDMA1HandlerZDMA0 HANDLER HandleZDMA0HandlerTICK HANDLER HandleTICKHandlerEINT4567 HANDLER HandleEINT4567HandlerEINT
14、3 HANDLER HandleEINT3HandlerEINT2 HANDLER HandleEINT2HandlerEINT1 HANDLER HandleEINT1HandlerEINT0 HANDLER HandleEINT0One of the following two routines can be used for non-vectored interrupt.IsrIRQ ;using I_ISPR register.IsrIRQ的作用是,计算出发生的中断,到底是什么中断田凯文只有这样才能跳转到相应的中断服务子程序田凯文仅当中断的类型为非向量中断时,才会跳转到该标号田凯文而向
15、量中断和非向量中断的根本性区别就在于,非向量中断田凯文需要自己计算出到底是哪个中断源,发生的中断,所以非向量中断田凯文要执行这一句,而向量中断是由硬件直接计算出发生中断的类型田凯文所以就不需要执行这一步,直接跳到下一步田凯文非向量中断是通过这一步,跳转到中断二级向量表田凯文,r8-r9 ;这是一个压栈操作,由于它是事先递减方式,所以sp的值先减4,即将r9寄存器中的数据田凯文存入以sp-4的值为地址的内存单元,r8寄存器中的数据,存入以sp-8的值为地址的内存单元田凯文并且sp的值更新为sp-8田凯文号,指令编码对应的W位置1,基地址寄存器,即sp更新,sp=sp-8田凯文这条指令的目的是为了
16、存储r8,r9寄存器的值,因为后面要用到田凯文IMPORTANT CAUTIONif I_ISPC isnt used properly, I_ISPR can be 0 in this routine.ldr r9,=I_ISPR ;将I_ISPR寄存器的地址赋给r9田凯文I_ISPR是44b0中断标示寄存器,通过它可以知道,什么中断发生了田凯文这个寄存器和ARM的种类有关,如果是2440就不是I_ISPR了田凯文ldr r9,r9 ;将I_ISPR寄存器的值赋给r9田凯文mov r8,#0x0 ;将r8寄存器清零田凯文0 movs r9,r9,lsr #1 ;将r9寄存器的值左移1位,在赋
17、值给r9,即r9=(r91)田凯文movs 可以分为mov和s,其中mov为传送指令,s指的是田凯文该指令的执行结果会影响CPSR寄存器田凯文由于该指令中包含移位运算,所以移位运算中溢出的值田凯文即为CPSR寄存器中的C位的值,即溢出0,标志位C的值就为0田凯文溢出1,标志位C的值就为1田凯文bcs %F1 ;判断条件标志位C的值是否为1,如果为1则执行跳转指令田凯文bcs指令中的cs,是指令执行的条件码,田凯文意思是如果条件标志位C的值是 1,则执行跳转指令田凯文add r8,r8,#4 ;偏移量加4,执行下一个中断田凯文b %B0 ;跳转到标号0处继续执行,直到C值变为1田凯文1ldr r
18、9,=HandleADC ;将标号HandleADC的地址送给r9田凯文add r9,r9,r8 ;再将r9的值加上偏移量r8,将得到的值送给 r9田凯文这个值,就是发生中断的服务程序,入口地址存放的地址田凯文将中断服务程序的入口地址,取出送给 r9田凯文str r9,sp,#8 ;将r9即中断服务程序的入口地址,送入栈中,sp,#8=r9 田凯文,r8-r9,pc ;将r8、r9寄存器中的值还原,并且PC指针指向存放中断函数田凯文入口地址的地址田凯文* START *ResetHandlerldr r0,=WTCON ;将WTCON这个值送给r0田凯文ldr r1,=0x0 ;r1寄存器清零
19、田凯文str r1,r0 ;将r1中得值,赋给存储地址为r0的区域,看门狗禁止田凯文ldr为字数据加载指令田凯文str为字数据存储指令田凯文ldr r0,=INTMSKldr r1,=0x07ffffff 禁止所有中断田凯文* Set clock control registers *ldr r0,=LOCKTIMEldr r1,=800 ; count = t_lock * Fin (t_lock=200us, Fin=4MHz) = 800str r1,r0 PLLONSTART ;如果PLLONSTART为真田凯文ldr r0,=PLLCON ;temporary setting of PLLldr r1,=(M_DIV12)+(P_DIV top of initialised data加载时地址:映像文件开始运行之前的地址田凯文
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1