版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验 ARM 汇编程序的编写以及启动代码的分析一、实验目的:练习ARM 汇编程序的编写,对提供的程序的启动代码进行分析,了解S3C2410初始化过程, 初始化代码主要是包含在start.s 中。二、实验原理:启动程序要完成的任务包括:硬件初始化,系统存储系统的配置,复制二级中断向量表。启动程序过程 系统硬件初始化系统上电或复位后,程序从位于地址0x0的Reset Exception Vector 处开始执行,因此需要在这里放置Bootloader 的第一条指令:b ResetHandler,跳转到标号为ResetHandler 处进行第一阶段的硬件初始化,执行完,系统进行堆栈和存储器的初始化。
2、使用了外设,则需要设置相关的寄存器,确定其刷新频率、总线宽度等信息。 代码段复制到RAM 中运行需要把系统的代码复制到RAM 中运行。映像文件内部共有三种输出段:RO 段、RW 段和ZI 段。ARMLink 同时还产生了这三种输出段的起始和终止定位信息:Image$RO$Base、Image$RO$Limit、Image$RW$Base、Image$RW$Limit、Image$ZI$Base和Image$ZI$Limit。可以在程序中使用这些定位信息。将ROM 中的代码和数据搬移到RAM 中。 建立二级中断向量表在ARM 系统中,中断向量表位于0X0开始的地址处,意味着无论运行什么样的上层软
3、件,一旦发生中断,程序就得到Flash 存储器中的中断向量表里去,降低系统的运行效率。因此在RAM 中建立自己的二级中断向量表,当中断发生后,程序直接从RAM 中取中断向量进入中断子程序。尤其是在中断频繁发生的系统里,这种方法可以大大提高系统的运行效率。三、实验内容:1运行一个简单的串口程序,单步执行初始化代码, 观察寄存器变化。2分析系统上电后的初始化工作包括哪些内容。3分析中断的处理过程,包括中断向量表的建立、中断源的识别及中断IRQ 服务程序是如何进入的。4分析应用程序的结构。四、实验代码:在系统上电后,初始化部分的工作注意包含以下部分:1、 关看门狗定时器2、 屏蔽所有中断3、 设置C
4、PU 时钟频率。4、 设置存储器控制寄存器,对外部存储器的参数进行设置。5、 初始化各模式下的堆栈6、 建立IRQ 中断的总的入口地址7、 初始化应用程序的执行环境8、 跳入Main 函数,进入C 程序;=; NAME: 2410INIT.S; DESC: C start up codes; Configure memory, ISR ,stacks; Initialize C-variables; HISTORY:;=GET option.s ;GET 相当INCLUDE 将一个源文件包含到当前源文件,这里表示包含option.s ,并在当前位置进行汇编GET memcfg.sGET 241
5、0addr.sBIT_SELFREFRESH EQU (1<<22 ; 定义了一些符号常量;ARM 异常模式的定义;SDRAM/DRAM 刷新控制器 bit22 REFMD位 0:CBR/AUTO REFRESH 1:SHIF REFRESH ; 下面是对arm 处理器模式寄存器对应值的常数定义,arm 处理器中有一个CPSR 程序状 ; 态寄存器,CPSR 后五位决定目前的处理器模式。;Pre-defined constantsUSERMODEEQU 0x10 ; 用户模式 FIQMODEEQU 0x11 ;FIQ 快速中断模式 IRQMODEEQU 0x12 ; 中断模式 SV
6、CMODE EQU 0x13 ; 管理模式ABORTMODE EQU0x17 ; 中止模式 UNDEFMODE EQU0x1b ; 未定义指令模式 MODEMASK EQU0x1f ; 系统模式 NOINTEQU 0xc0 ; 禁止IRQ 和FIQ 中断;ARM 各异常模式堆栈,定义各模式堆栈地址;_STACK_BASEADDRESS在option.s 中,;The location of stacks_STACK_BASEADDRESS EQU (SDRAM_END-0x8000;0x33ff8000 UserStackEQU (_STACK_BASEADDRESS-0x3800 ;0x33
7、ff4800 ; 用户模式堆栈SVCStack EQU (_STACK_BASEADDRESS-0x2800;0x33ff5800 0x3ff47ff ; 管理模式堆栈 4kUndefStack EQU (_STACK_BASEADDRESS-0x2400 ;0x33ff5c00 0x3ff57ff ; 未定义指令模式堆栈 1kAbortStack EQU (_STACK_BASEADDRESS-0x2000 ;0x33ff6000 0x3ff5bff ; 中止模式堆栈 1kIRQStack EQU (_STACK_BASEADDRESS-0x1000;0x33ff7000 0x3ff5fff
8、 ; 中断模式堆栈 4kFIQStack EQU (_STACK_BASEADDRESS-0x0;0x33ff8000 0x33ff6fff ; 快速中断模式堆栈 4k ;arm 处理器有两种工作状态;1.arm:32位 这种工作状态下执行字对齐的arm 指令;2.Thumb:16位 这种工作状; 态执行半字对齐的Thumb 指令; 因为处理器分为16位 32位两种工作状态 程序的编译器也是分16位和32两种编译方式 ; 所以下面的程序用于根据处理器工作状态确定编译器编译方式;code16伪指令指示汇编编译器,后面的指令为16位的thumb 指令;code32伪指令指示汇编编译器,后面的指令为
9、32位的arm 指令; 这段是为了统一目前的处理器工作状态和软件编译方式(16位编译环境使用tasm.exe 编译) ;Check if tasm.exe(armasm -16 .ADS 1.0 is used. 检查是否是用tasm.exe 进行16位编译 GBLL THUMBCODE ; 声明一个全局变量 并初始化为FALSE CONFIG = 16 ;if config=16这里表示用16位编译方式THUMBCODE SETL TRUE ;SETL 给全局变量赋值,设置THUMBCODE 为 trueCODE32 ;CODE32表明一下操作都在ARM 状态,转入32位编译模式| ; |=
10、ELSE | 等同 ELSETHUMBCODE SETL FALSE ; 设置THUMBCODE 为 false ,THUMBCODE=FALSE;endif 等同 ENDIF ; 宏定义MOV_PC_LRMACRO ;MACRO 定义宏,宏定义开始 MOV_PC_LR ; 宏将被下面定义部分展开,宏名 MOV_PC_LR THUMBCODE ;if THUMBCODE=truebx lr ;THUMBCODE 模式上返回ARM 状态|;else mov pc,lr ;ARM 状态下返回 ;end ifMEND ; 宏结束MACRO ; 宏定义开始 MOVEQ_PC_LR; 宏名为MOVEQ_
11、PC_LR,与上面部分相同 THUMBCODE ;if THUMBCODE=truebxeq lr ;EQ 相等 则跳转回ARM 状态|;else moveq pc,lr; 同上位置相同部分,不同的是如果相等才跳回ARM 状态 ;end ifMEND; 宏结束 ; 宏定义进入异常流程;HANDLER 宏的名称;$HandleLabel宏的参数 ; 这个宏的作用是把各个中断程序的地址装入当前的PC ,2410有两种装断模式:一种是没有; 中断向量表,一种是使用中断向量表的; 使用中断向量表只能是IRQ 方式,当使用中断向量表的时候,中断发生时由2410的中断控 ; 制器自动跳转到; 相应的位置。
12、; 注意下面这段宏定义程序; 下面包含的HandlerXXX HANDLER HandleXXX 将都被下面这段程序展开; 本初始化程序定义了一个数据区(在文件最后),34个字空间,存放相应中断服务程序的首 ; 地址。每个字,即4字节; 空间都有一个标号,以Handle*命名。; 在向量中断模式下使用“加载程序”来执行中断服务程序。; 向量中断模式和非向量中断模式的区别是: 向量中断模式是当cpu 读取位于0x18处的IR ;Q 中断指令的时候,系统自动读取对应于该中断源确定地址上的指令取代0x18处的指令, ; 通过跳转指令系统就直接跳转到对应地址; 函数中 节省了中断处理时间提高了中断处理
13、速度标 例如 ADC 中断的向量地址为0xC0, ; 在0xC0处放如下代码:;ldr PC,=HandlerADC 当ADC 中断产生的时候系统会自动跳转到HandlerADC 函数中; 非向量中断模式处理方式是一种传统的中断处理方法,当系统产生中断的时候,系统将int ;errupt pending 寄存器中对应标志位置位; 然后跳转到位于0x18处的统一中断; 函数中; 该函数通过读取interrupt pending 寄存器中对应标志位来判断中断源,并根据优先级关系 ; 再跳到; 对应中断源的处理代码中; 大致作用是把宏的第一个参数$HandlerLabel转变为一个标号,然后让程序跳
14、转到第二个参 ; 数$HandleLabel(为一个地址 对应的值的地址去。; 所以,通过上面的分析可以看出,$HandlerLabel HANDLER $HandleLabel是让PC 跳转到$H ;andleLabel 中存放的地址执行。MACRO ; 宏定义$HandlerLabel HANDLER $HandleLabel ; 宏名字叫HANDLER,$HandleLabel是 ; 行参,定义了一个标号$HandlerLabel,展开时可替换成相应的符号$HandlerLabelsub sp,sp,#4 ;sp-sp-4, 空出的空间用于存放跳转地址stmfd sp!,r0 ;sp=s
15、p-4,并将r0入栈ldr r0,=$HandleLabel ; 获取存放跳转地址的标号HandleLabel 到r0ldr r0,r0 ; 将HandleLabel 中存放的跳转地址送给r0 str r0,sp,#4 ; 将r0存放到sp+4的地方,ldmfd sp!,r0,pc ; 弹出栈顶2个字,分别保存到r0和pc 中,系统将跳; 转到对应中断处理函数,由上r0和pc 都没变,但程序已跳转MEND ; 宏定义结束; 连接器生成的输出段相关的符号; 引入连接器生成的映象文件的各个部分地址。;OR 只读区域、RW 读写区域、ZI 初始化为0的区域。IMPORT |Image$RO$Limi
16、t| ; End of ROM code (=start of ROM data ,RO 结束 ; 地址+1IMPORT |Image$RW$Base| ; Base of RAM to initialise,RW 起始IMPORT |Image$ZI$Base| ; Base and limit of area,RW 段结束+1IMPORT |Image$ZI$Limit| ; to zero initialise,ZI 段起始地址; 引入外部函数Main ,进入C 程序。IMPORT Main ; The main entry of mon program;IMPORT LEDTEST;
17、定义ARM 汇编程序段,段名为SelfBoot ,程序段为只读的代码段。AREA SelfBoot,CODE,READONLY ;Selfboot 初始化程序; 板子上电和复位后程序开始从位于0x0处开始执行,硬件刚刚上电复位后程序从这里开始 ; 执行跳转到标为ResetHandler 处执行;DCD 用于分配一段字内存单片,并用后面的伪指令初始化,分配字节由expr 个数决定 ; 程序入口地址ENTRYResetEntry;1The code, which converts to Big-endian, should be in little endian code. ;2The follo
18、wing little endian code will be compiled in Big-Endian mode. The code byte order should be changed as the memory bus width.;3The pseudo instruction,DCD can't be used here because the linker generates error.ASSERT :DEF:ENDIAN_CHANGE ;ASSERT 断言错误伪指令,这里表示是否定义过ENDIAN_CHANGE ENDIAN_CHANGE ; 如果定义了ENDI
19、AN_CHANGEASSERT :DEF:ENTRY_BUS_WIDTH ; 这里表示是否定义过ENTRY_BUS_WIDTH ENTRY_BUS_WIDTH=32 ;if ENTRY_BUS_WIDTH=32 b ChangeBigEndian ;DCD 0xea000007,跳转到ChangeBigEndian , ; 执行DCD 0xea000007 改变大小端数据模式 ;end if ENTRY_BUS_WIDTH=16 ;if ENTRY_BUS_WIDTH=16 andeq r14,r7,r0,lsl #20 ; DCD 0x0007ea00,标志状态寄存器CPSR 的Z ;=1时
20、,r14=r7+r0逻辑左移20位,执行DCD 0x0007ea00改变大小端模式 ;end if ENTRY_BUS_WIDTH=8 ;if ENTRY_BUS_WIDTH=8 streq r0,r0,-r10,ror #1 ; DCD 0x070000e,当标志状态寄存器CPSR 的Z ;=1时,执行DCD 0x070000ea 改变大小端模式;end if| ;ELSE 即如果没定义 ENDIAN_CHANGE bResetHandler ; 复位处理模式b HandlerUndef ;handler for Undefined mode 处理为定义模式b HandlerSWI ;han
21、dler for SWI interrupt 处理软中断模式b HandlerPabort ;handler for PAbort 处理终止程序访问终止模式b HandlerDabort ;handler for DAbort 处理数据访问终止模式 b . ;reserved保留,"." 代表指令的地址 ,即表示进行死循环b HandlerIRQ ;handler for IRQ interrupt 处理中断模式b HandlerFIQ ;handler for FIQ interrupt 处理快速中断模式;0x20"" 存储区位置计数器的当前值 b E
22、nterPWDN; 进入掉电模式,见下面的标号ChangeBigEndian ; 上面提到的ChangeBigEndian, 改变大小端数据模式;0x24 ENTRY_BUS_WIDTH=32 ;if ENTRY_BUS_WIDTH=32DCD 0xee110f10 ;0xee110f10 => mrc p15,0,r0,c1,c0,0DCD 0xe3800080 ;0xe3800080 => orr r0,r0,#0x80; /Big-endianDCD 0xee010f10 ;0xee010f10 => mcr p15,0,r0,c1,c0,0 ENTRY_BUS_WID
23、TH=16 ;if ENTRY_BUS_WIDTH=16DCD 0x0f10ee11DCD 0x0080e380DCD 0x0f10ee01 ENTRY_BUS_WIDTH=8 ;if ENTRY_BUS_WIDTH=8DCD 0x100f11eeDCD 0x800080e3 DCD 0x100f01eeDCD 0xffffffff;swinv 0xffffff is similar with NOP and run well in both endian mode.DCD 0xffffffffDCD 0xffffffffDCD 0xffffffffDCD 0xffffffffb ResetH
24、andler; 复位处理程式;Function for entering power down mode; 1. SDRAM should be in self-refresh mode.; 2. All interrupt should be maksked for SDRAM/DRAM self-refresh.; 3. LCD controller should be disabled for SDRAM/DRAM self-refresh.; 4. The I-cache may have to be turned on.; 5. The location of the followi
25、ng code may have not to be changed. ; 进入掉电模式功能; 1. SDRAM 必须在自刷新模式.; 2. 所有中断必须屏蔽 for SDRAM/DRAM self-refresh.; 3. LCD 关闭for SDRAM/DRAM self-refresh.; 4. The I-cache 可能需要开启.; 5. The location of the following code may have not to be changed.;void EnterPWDN(int CLKCON; ; 进入掉电模式EnterPWDNmov r2,r0;r2=rCLK
26、CON CLKCON3掉电模式控制位 0:关闭 1:进入掉电模式 tst r0,#0x8 ; POWER_OFF mode?判断POWER_OFF 是否为0 。r0和 #0X8相与,更新CPSR 位bne ENTER_POWER_OFF ;NE 不相等(则表示power_off不为O 标志位Z=0ENTER_STOP ; 不进入掉电模式ldr r0,=REFRESH ;0x48000024 ;DRAM/SDRAM refresh DRAM/SDRAM 刷新控制器,刷新DRAM/SDRAMldr r3,r0 ;r3=rREFRESHmov r1, r3 ;r1=r3 orr r1, r1, #B
27、IT_SELFREFRESH ;BIT_SELFREFRESH EQU (1<<22 bit22 TREFMD位 0:CBR/AUTO REFRESH 1:SHIF REFRESHstr r1, r0 ;R1->R0 Enable SDRAM self-refresh; B 是向后搜索局部标号, %F是向前搜索局部标号。mov r1,#16 ; 延时 wait until self-refresh is issued. may not be needed.subs r1,r1,#1 ;0为局部标号(延时) bne %B0ldr r0,=CLKCON;enter STOP mo
28、de. CLKCON ;Clock generator controlstr r2,r0mov r1,#32 0subs r1,r1,#1 ;1 延时 wait until the STOP mode is in effect. bne %B0 ;2 Or wait here until the CPU&Peripherals will be turned-off ; Entering POWER_OFF mode, only the reset by wake-up is available.ldr r0,=REFRESH ;exit from SDRAM self refresh
29、mode.str r3,r0MOV_PC_LR ; 调用宏MOV_PC_LRENTER_POWER_OFF; 进入掉电模式 ;NOTE.;1 rGSTATUS3 should have the return address after wake-up from POWER_OFF mode.ldr r0,=REFRESHldr r1,r0 ;r1=rREFRESHorr r1, r1, #BIT_SELFREFRESHstr r1, r0 ;Enable SDRAM self-refreshmov r1,#16 ;Wait until self-refresh is issued,which
30、may not be needed. 0subs r1,r1,#1 ; 延时bne %B0ldr r1,=MISCCR ; ;Miscellaneous control,混杂控制模式ldr r0,r1 orr r0,r0,#(7<<17 ;Make sure that SCLK0:SCLK->0, SCLK1:SCLK->0, SCKE=L during ;boot-upstr r0,r1ldr r0,=CLKCON str r2,r0b .;CPU will die here. "." 当前指令的地址 CPU 死在这WAKEUP_POWER_OFF
31、 ; 掉电唤醒;Release SCLKn after wake-up from the POWER_OFF mode.ldr r1,=MISCCR ;Miscellaneous control,混杂模式ldr r0,r1bic r0,r0,#(7<<17 ;SCLK0:0->SCLK, SCLK1:0->SCLK, SCKE:L->Hstr r0,r1;Set memory control registersldr r0,=SMRDATAldr r1,=BWSCON;BWSCON Address 起始位置 依次为BANKCON0 BANKCON1 BANKCON
32、2 .add r2, r0, #52 ;End address of SMRDATAldr r3, r0, #4 ; 读取R0地址的数据到R3 R0=R0+4 读取SMRDATA 数组(BWSCON BANKCON0 .的值str r3, r1, #4 ; 读取R3的数据到 R1地址内存中 R1=R1+4 赋给BWSON BANKCON0 .寄存器cmp r2, r0bne %B0 ; 判断是否赋完值mov r1,#256 0subs r1,r1,#1 ;1 wait until the SelfRefresh is released.bne %B0; 延时ldr r1,=GSTATUS3 ;
33、GSTATUS3 has the start address just after POWER_OFF wake-upldr r0,r1 ;Saved data0(32-bit before entering POWER_OFF mode,在进 ; 入掉电模式之前(POWER=OFFMODE),保存data0mov pc,r0LTORG ; 文字池, 声明一个数据缓冲池的开始 ; 下面是具体的中断处理函数跳转的宏,通过上面的$HandlerLabel的宏定义展开后跳转到对 ; 应的中断处理; 函数(对于向量中断)HandlerFIQ HANDLER HandleFIQ ; 调用宏HANDLER
34、HandlerIRQ HANDLER HandleIRQ ;HandlerIRQ 行号 HANDLER 宏名 ;HandleIRQ 导入的形参HandlerUndef HANDLER HandleUndefHandlerSWI HANDLER HandleSWIHandlerDabort HANDLER HandleDabortHandlerPabort HANDLER HandlePabort; 下面这段程序是用来处理非向量中断,具体判断I_ISPR中各位是否置1 ,置1表示目前此 ; 中断等待响应(每次只能有一位置1),; 从最高优先级中断位开始判断,检测到等待服务中断就将pc 置为中断服
35、务函数首地址IsrIRQ ;IRQ 模式中断(片内外设中断 引脚中断)sub sp,sp,#4 ; reserved for PC,中断分发例程入口地址预留栈空间, 预留 ;pc 返回指针的存储位置stmfd sp!,r8-r9 ; 将R8R9 放入堆栈;INTOFFSET 寄存器各位表明发生了应该调用那个中断子程序。; 不过这个寄存器只能用在IRQ 中断模式。ldr r9,=INTOFFSET ; 中断请求源偏移寄存器ldr r9,r9 ;r9中存放INTOFFSET 的内容ldr r8,=HandleEINT0 ; 取EINT0的地址,即IRQ 中断首址 add r8,r8,r9,lsl
36、#2 ;r8=r8+ r9<<2 r9<<2(乘4 ,4字节对齐ldr r8,r8 ; 取r8地址的数据放入R8,加载中断服务函数地址到r8 str r8,sp,#8 ; 将R8中的数据放入sp+8的地址中,保存到sp ,作为新的 ;PCldmfd sp!,r8-r9,pc ; 将堆栈内空恢复到 R8 R9 PC,跳转到新的PC 运行;=; ENTRY;= ; 板子上电和复位后 程序开始从位于0x0执行,b ResetHandler 程序从跳转到这 ; 里执行; 板子上电复位后 执行几个步骤。; 初始化程序入口指令ResetHandler ; 复位处理程式ldr r0,
37、=WTCON ; watch dog disable 关闭看门狗ldr r1,=0x0 str r1,r0 ;r1->r0 禁止看门狗;1 ldr r0, =0x300; ldr r1, r0;b %B1ldr r0,=INTMSKldr r1,=0xffffffff ;all interrupt disable,关中断,全部置1str r1,r0 ;r1->r0 禁止所有中断ldr r0,=INTSUBMSKldr r1,=0x7ff ;all sub interrupt disable, 关所有子中断str r1,r0 ; 测试外部LED 等 FALSE ;if; rGPFDA
38、T = (rGPFDAT & (0xf<<4 | (data & 0xf<<4; Led_Displayldr r0,=GPFCON ;F 口控制寄存器ldr r1,=0x5500str r1,r0ldr r0,=GPFDAT ;F 口数据寄存器ldr r1,=0x10str r1,r0; 计算公式;Fpllo=(m*Fin/(p*2s;m=MDIV+8,p=PDIV+2,s=SDIV;Fpllo 必须大于20Mhz 小于66Mhz;Fpllo*2s必须小于170Mhz;To reduce PLL lock time, adjust the LOCKTI
39、ME register.ldr r0,=LOCKTIMEldr r1,=0xffffff str r1,r0 PLL_ON_START;Configure MPLLldr r0,=MPLLCONldr r1,=(M_MDIV<<12+(M_PDIV<<4+M_SDIV ;Fin=12MHz,Fout=50MHzstr r1,r0;Check if the boot is caused by the wake-up from POWER_OFF mode.ldr r1,=GSTATUS2 ; GSTATUS2 复位状态寄存器ldr r0,r1 tst r0,#0x2 ;
40、判断R0 的第二位是否为0;In case of the wake-up from POWER_OFF mode, go to POWER_OFF_WAKEUP ;handler.nop;bne WAKEUP_POWER_OFFEXPORT StartPointAfterPowerOffWakeUp ; 声明全局函数 StartPointAfterPowerOffWakeUp; 设置存储器控制寄存器。; 是设置SDRAM,flash ROM 存储器连接和工作时序的程序, 片选定义的程序;SMRDATA map 在下面的程序中定义;Set memory control registersldr
41、r0,=SMRDATA ldr r1,=BWSCON ;BWSCON Address ;BWSCON Address 起始位置依次为BANKCON0 ;BANKCON1 BANKCON2 .add r2, r0, #52 ;End address of SMRDATA 一共13个寄存器ldr r3, r0, #4 ; 读取R0地址的数据到R3,R0=R0+4 读取SMRDATA 数组 (BWSCON BANKCON0 .的值str r3, r1, #4 ; 读取R3的数据到 R1地址内存中 R1=R1+4 赋给BWSON BANKCON0 .寄存器cmp r2, r0bne %B0; 禁止Ic
42、ache 和Dcache ,禁止MMU ;IMPORT MMU_DisableICache;bl MMU_DisableICache ;IMPORT MMU_DisableDCache;bl MMU_DisableDCache ;IMPORT MMU_InvalidateICache;bl MMU_InvalidateICache ;IMPORT MMU_DisableMMU;bl MMU_DisableMMU ; 初始化堆栈;Initialize stacksbl InitStacks ; Setup IRQ handlerldr r0,=HandleIRQ ;This routine is
43、 neededldr r1,=IsrIRQ ;if there isn't 'subs pc,lr,#4' at 0x18, 0x1c str r1,r0 adr r0, ResetEntry ;adr 也是取值,但这时程序在哪运行就取那时的地址ldr r2, BaseOfROMcmp r0, r2ldreq r0, TopOfROMbeq InitRam ldr r3, TopOfROM; 将RO 区域的代码copy 到RW 域中并且将ZI 区域初始化为0。行到这步结束bootloader 初步引导结束ldmia r0!, r4-r7stmia r2!, r4-r7c
44、mp r2, r3bcc %B0sub r2, r2, r3sub r0, r0, r2InitRam ; 将RW 内容从FLASH 拷贝到SDRAMldr r2, BaseOfBSSldr r3, BaseOfZero 0cmp r2, r3 ;copy 初始化代码ldrcc r 1, r0, #4 ; 没有设置C 标志位的时候执行,即无符号数小于strcc r1, r2, #4 bcc %B0;ZI 段全部清零mov r0, #0 ; 初始化ZI 区域为0ldr r3, EndOfBSS 1cmp r2, r3strcc r0, r2, #4bcc %B1 :LNOT:THUMBCODE;
45、 将THUMBCODE 做逻辑非操作 bl Main ; Don't use main( because . 转入C 程序 ;bl LEDTESTb . ; 死循环 THUMBCODE ;for start-up code for Thumb modeorr lr,pc,#1bx lrCODE16bl Main ; Don't use main( because . 转入C 程序b .CODE32; 堆栈初始化; 这是上面提到的对存储寄存器初始化的数据map;function initializing stacksInitStacks;Don't use DRAM,su
46、ch as stmfd,ldmfd.;SVCstack is initialized before;Under toolkit ver 2.5, 'msr cpsr,r1' can be used instead of 'msr cpsr_cxsf,r1'mrs r0,cpsr ;r0<-cpsrbic r0,r0,#MODEMASK ;MODEMASK=0x1f 清除CPSR 中的PSR 位(5bitorr r1,r0,#UNDEFMODE|NOINT ;NOINT=0XC0 禁止IRQ 和FIQ 中断msr cpsr_cxsf,r1 ;UndefMod
47、e cpsr_cxsf<-r1ldr sp,=UndefStackorr r1,r0,#ABORTMODE|NOINTmsr cpsr_cxsf,r1 ;AbortModeldr sp,=AbortStackorr r1,r0,#IRQMODE|NOINTmsr cpsr_cxsf,r1 ;IRQMode ldr sp,=IRQStackorr r1,r0,#FIQMODE|NOINTmsr cpsr_cxsf,r1 ;FIQModeldr sp,=FIQStackbic r0,r0,#MODEMASK|NOINTorr r1,r0,#SVCMODEmsr cpsr_cxsf,r1 ;S
48、VCModeldr sp,=SVCStack;USER mode has not be initialized. 用户模式不初始化堆栈mov pc,lr;The LR register won't be valid if the current mode is not SVC mode.LTORG ; 声明一个数据缓冲池的开始。声明一个缓冲池常放在无条件; 跳转指令后,或子程序返回后,; 这样处理器就不会将文字池中的数据当指令来处理SMRDATA DATA ; 定义存储器控制器; Memory configuration should be optimized for best per
49、formance; The following parameter is not optimized.; Memory access cycle parameter strategy; 1 The memory settings is safe parameters even at HCLK=75Mhz.; 2 SDRAM refresh period is for HCLK=75Mhz.DCD(0+(B1_BWSCON<<4+(B2_BWSCON<<8+(B3_BWSCON<<12+(B4_BWSCON<<16+(B5_BWSCON<&l
50、t;20+(B6_BWSCON<<24+(B7_BWSCON<<28 ; BWSCON=0x2211D110定义BWSCON DCD(B0_Tacs<<13+(B0_Tcos<<11+(B0_Tacc<<8+(B0_Tcoh<<6+(B0_Tah<<4+(B0_Tacp<<2+(B0_PMC ;GCS0 BANK0CON=0x0700定义BANKCON0,下同DCD(B1_Tacs<<13+(B1_Tcos<<11+(B1_Tacc<<8+(B1_Tcoh<
51、<6+(B1_Tah<<4+(B1_Tacp<<2+(B1_PMC ;GCS1 BANKCON1=0x7FFCDCD(B2_Tacs<<13+(B2_Tcos<<11+(B2_Tacc<<8+(B2_Tcoh<<6+(B2_Tah<<4+(B2_Tacp<<2+(B2_PMC ;GCS2 BANKCON2=0x0700DCD(B3_Tacs<<13+(B3_Tcos<<11+(B3_Tacc<<8+(B3_Tcoh<<6+(B3_Tah<&
52、lt;4+(B3_Tacp<<2+(B3_PMC ;GCS3 BANKCON3=0x0700DCD(B4_Tacs<<13+(B4_Tcos<<11+(B4_Tacc<<8+(B4_Tcoh<<6+(B4_Tah<<4+(B4_Tacp<<2+(B4_PMC ;GCS4 BANKCON4=0x0700DCD(B5_Tacs<<13+(B5_Tcos<<11+(B5_Tacc<<8+(B5_Tcoh<<6+(B5_Tah<<4+(B5_Tacp<&
53、lt;2+(B5_PMC ;GCS5 BANKCON5=0x0700DCD (B6_MT<<15+(B6_Trcd<<2+(B6_SCAN ;GCS6 BANKCON6=0x18005DCD (B7_MT<<15+(B7_Trcd<<2+(B7_SCAN ;GCS7 BANKCON7=0x18005DCD (REFEN<<23+(TREFMD<<22+(Trp<<20+(Trc<<18+(Tchr<<16+REFCNT ;REFR ESH ;REFRESH=0x008E0459 DRAM
54、/SDRAM refresh 设置刷新周期DCD 0x32 ;SCLK power saving mode, BANKSIZE 128M/128MDCD 0x30 ;MRSR6 CL=3clk ;Mode register set for SDRAMDCD 0x30 ;MRSR7 ;Mode register set for SDRAM ;DCD 0x20 ;MRSR6 CL=2clk ;DCD 0x20 ;MRSR7ALIGN ; 通过添加补丁字节使当前位置满足一定的对齐方式,声明字对齐; 这里将中断异常向量建立在sdram 中; 可读写的数据段AREA RamData, DATA, READWRITE ; 异常中断向量(矢量) _ISR_STARTADDRESS=MAP:定义一个结构化的内存表(storage map)的首地址,地址为0x33ff8000HandleReset # 4 ; #-Field:定义一个结构化内存表中的数据域,该域为4个; 字节HandleUndef # 4HandleSWI HandlePabort HandleD
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 土地租赁协议2023
- 部编版六年级语文上册第八单元知识梳理填空
- (2024)1-4酸钠盐生产建设项目可行性研究报告(一)
- 2023年天津市益中学校高考语文模拟试卷
- 2023年家政服务项目融资计划书
- 零食行业蓝皮书
- 电力电缆模拟习题+参考答案
- 养老院老人生活设施维修人员管理制度
- 养老院老人访客管理制度
- 2024年旅游产品销售与推广合同3篇
- 道路工程施工方案及技术措施
- 陕西省汉中市洋县2022-2023学年六年级上学期期末水平测试语文试卷
- 课外古诗词诵读《采桑子(轻舟短棹西湖好)》教学设计 统编版语文八年级上册
- 国家开放大学《中国现代文学专题》形考任务1-4参考答案
- 2023年抖音运营陪跑协议书
- 工程伦理案例分析-毒跑道事件
- 小儿鼻炎调理课程课件
- 股东损害公司债权人利益责任纠纷起诉状(成功范文)
- 家庭财务管理系统
- 逆向思维的含义与作用课件教学
- 冠寓运营管理手册
评论
0/150
提交评论