版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、;GET和INCLUDE功能相同;功能:引进一个被编译过的文件。GET option.incGET memcfg.incGET 2440addr.inc;EQU为程序中的常量、标号等定义一个等效的字符名称;定义SDRAM工作在Refresh模式,SDRAM有两种刷新方式:autorefresh和selfrefresh,前者是在其使用过程当中每隔一段时间发出刷新指令,SDRAM刷新一行,self refresh是在省电模式时使用BIT_SELFREFRESH EQU (1<<22;系统的工作模式设定,共七种工作模式USERMODE EQU 0x10FIQMODE EQU 0x11IR
2、QMODE EQU 0x12SVCMODE EQU 0x13ABORTMODE EQU 0x17UNDEFMODE EQU 0x1bMODEMASK EQU 0x1fNOINT EQU 0xc0;系统的堆栈空间设定UserStack EQU (_STACK_BASEADDRESS-0x3800 ;0x33ff4800 SVCStack EQU (_STACK_BASEADDRESS-0x2800 ;0x33ff5800 UndefStack EQU (_STACK_BASEADDRESS-0x2400 ;0x33ff5c00 AbortStack EQU (_STACK_BASEADDRESS
3、-0x2000 ;0x33ff6000 IRQStack EQU (_STACK_BASEADDRESS-0x1000 ;0x33ff7000 FIQStack EQU (_STACK_BASEADDRESS-0x0 ;0x33ff8000 ;这一段是为了统一处理器工作状态和软件编译方式(16位编译环境使用tasm.exe编译;arm有两种工作状态:32位,该状态执行字对准的arm指令;16位,该状态执行半字对准的Thumb指令;不同的工作状态,编译器编译方式也不同GBLL THUMBCODE ;定义一个全局变量 CONFIG = 16 ; CONFIG为ADS定义的内部变量THUMBCODE
4、 SETL TRUE ;SETA 指令用于设置局部或全局算术变量的值,SETL 指令用于设置局部或全局逻辑变量的值,SETS 指令用于设置局部或全局字符串变量的值CODE32 ;工作在arm状态|THUMBCODE SETL FALSE ; | 是ARM汇编控制伪指令,就是 IF ELSE ENDIF,简写成 | MACRO ;宏定义MOV_PC_LR THUMBCODEbx lr|mov pc,lrMENDMACROMOVEQ_PC_LR THUMBCODEbxeq lr|moveq pc,lrMEND;这段程序用于把中断服务程序的首地址装载到pc中,有人称之为“加载程序”。;本初始化程序定
5、义了一个数据区(在文件最后,存放相应中断服务程序的首地址。每个字空间都有一个标号,以Handle*命名。MACRO$HandlerLabel HANDLER $HandleLabel$HandlerLabelsub sp,sp,#4 ;用来存储PC地址stmfd sp!,r0 ;把将要使用的r0寄存器入栈ldr r0,=$HandleLabel;给寄存器r0赋值ldr r0,r0 ;给寄存器r0赋值,将r0的地址放入r0str r0,sp,#4 ;将对应的中断函数首地址入栈ldmfd sp!,r0,pc ;弹出工作寄存器ro和PC,也就完成了到ISR的跳转MENDIMPORT |Image$R
6、O$Limit| ; 表示RO区末地址后面的地址,即RW数据源的起始地址IMPORT |Image$RW$Base| ; RW区在RAM里的执行区起始地址,也就是编译器选项RW_Base指定的地址。IMPORT |Image$ZI$Base| ; ZI区在RAM里面的起始地址IMPORT |Image$ZI$Limit| ; ZI区在RAM里面的结束地址后面的一个地址IMPORT MainAREA Init,CODE,READONLY ;声明一个代码段ENTRY;下面的代码是小端和大端的转换;条件编译,在编译成机器码前就设定好ASSERT :DEF:ENDIAN_CHANGE ;判断ENDIA
7、N_CHANGE是否定义 ENDIAN_CHANGEASSERT :DEF:ENTRY_BUS_WIDTH ;如果已经定义了ENDIAN_CHANGE,判断ENTRY_BUS_WIDTH是否定义 ENTRY_BUS_WIDTH=32 ;判断是不是为32b ChangeBigEndian ;DCD 0xea000007 ENTRY_BUS_WIDTH=16andeq r14,r7,r0,lsl #20 ;DCD 0x0007ea00 ENTRY_BUS_WIDTH=8streq r0,r0,-r10,ror #1 ;DCD 0x070000ea|b ResetHandlerb HandlerUn
8、def ;转跳到Undefined mode程序入口b HandlerSWI ;转跳到SWI 中断程序入口b HandlerPabort ;转跳到PAbort(指令异常程序入口b HandlerDabort ;转跳到DAbort(数据异常程序入口b . ;保留b HandlerIRQ ;转跳到IRQ 中断程序入口b HandlerFIQ ;转跳到FIQ 中断程序入口;0x20b EnterPWDN ; Must be 0x20.;通过设置CP15的C1的位7,设置存储格式为Bigendian,三种总线方式ChangeBigEndian ;下面是改变大小端的程序,这里采用直接定义机器码的方式;0
9、x24 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_WIDTH=16DCD 0x0f10ee11DCD 0x0080e380DCD 0x0f10ee01 ENTRY_BUS_WIDTH=8DCD 0x100f11eeDCD 0x800080e3DCD
10、0x100f01eeDCD 0xffffffffDCD 0xffffffffDCD 0xffffffffDCD 0xffffffffDCD 0xffffffffb ResetHandler;掉电模式;SDRAM自动刷新.;进入PWDNEnterPWDNmov r2,r0 ;r2=rCLKCONtst r0,#0x8 ;测试是否是SLEEP mode?bne ENTER_SLEEPENTER_STOP ;进入PWDN后如果不是sleep则进入stop ldr r0,=REFRESHldr r3,r0 ;r3=rREFRESHmov r1, r3orr r1, r1, #BIT_SELFREFRE
11、SHstr r1, r0 ;使SDRAM自动刷新mov r1,#16 ;等待刷新,也可能不需要0 subs r1,r1,#1bne %B0ldr r0,=CLKCON ;进入STOP mode.str r2,r0mov r1,#320 subs r1,r1,#1bne %B0; 进入SLEEP mode, 只有通过唤醒复位.ldr r0,=REFRESH ;退出SDRAM self refresh mode.str r3,r0MOV_PC_LRENTER_SLEEP;rGSTATUS3有一个返回地址ldr r0,=REFRESHldr r1,r0 ;r1=rREFRESHorr r1, r1,
12、 #BIT_SELFREFRESHstr r1, r0 ;启用SDRAM self-refreshmov r1,#16 ;等待self-refresh,也可能不需要.0 subs r1,r1,#1bne %B0ldr r1,=MISCCRldr r0,r1orr r0,r0,#(7<<17 ;设置SCLK0=0, SCLK1=0, SCKE=0.str r0,r1ldr r0,=CLKCON ;进入sleep modestr r2,r0b . ;CPU不工作.WAKEUP_SLEEP;Release SCLKn after wake-up from the SLEEP mode.l
13、dr r1,=MISCCRldr r0,r1bic r0,r0,#(7<<17 ;SCLK0:0->SCLK, SCLK1:0->SCLK, SCKE:0->=SCKE.str r0,r1;设置存储控制寄存器ldr r0,=SMRDATAldr r1,=BWSCON ;总线宽度和等待控制寄存器add r2, r0, #52 ;SMRDATA的结束地址ldr r3, r0, #4str r3, r1, #4cmp r2, r0bne %B0;数据在以SMRDATA为起始的存储区mov r1,#2560 subs r1,r1,#1 ;1 wait until the
14、SelfRefresh is released.bne %B0ldr r1,=GSTATUS3 ;GSTATUS3 has the start address just after SLEEP wake-up ldr r0,r1mov pc,r0;异常中断宏调用LTORGHandlerFIQ HANDLER HandleFIQHandlerIRQ HANDLER HandleIRQHandlerUndef HANDLER HandleUndefHandlerSWI HANDLER HandleSWIHandlerDabort HANDLER HandleDabortHandlerPabort
15、HANDLER HandlePabortIsrIRQsub sp,sp,#4 ;reserved for PCstmfd sp!,r8-r9ldr r9,=INTOFFSETldr r9,r9ldr r8,=HandleEINT0add r8,r8,r9,lsl #2ldr r8,r8str r8,sp,#8ldmfd sp!,r8-r9,pc;=; ENTRY;板子上电和复位后,程序开始从位于0x00执行b ResetHandler,程序跳转到这里执行;=ResetHandlerldr r0,=WTCON ;屏蔽看门狗ldr r1,=0x0str r1,r0ldr r0,=INTMSKldr
16、 r1,=0xffffffff ;屏蔽所有的中断str r1,r0ldr r0,=INTSUBMSKldr r1,=0x3ff ;屏蔽所有的子中断str r1,r0 FALSE; rGPFDAT = (rGPFDAT & (0xf<<4 | (data & 0xf<<4; Led_Displayldr r0,=GPFCONldr r1,=0x5500str r1,r0ldr r0,=GPFDATldr r1,=0x10str r1,r0;根据工作频率设置pllldr r0,=LOCKTIMEldr r1,=0xffffffstr r1,r0 PLL_ON
17、_START; 为2440添加时钟设备.; 设置Fclk:Hclk:Pclkldr r0,=CLKDIVNldr r1,=CLKDIV_VAL ; 0=1:1:1, 1=1:1:2, 2=1:2:2, 3=1:2:4, 4=1:4:4, 5=1:4:8, 6=1:3:3, 7=1:3:6. str r1,r0;Configure UPLLldr r0,=UPLLCONldr r1,=(U_MDIV<<12+(U_PDIV<<4+U_SDIV ;设定系统主时钟频率str r1,r0nop ; Caution: After UPLL setting, at least 7-
18、clocks delay must be inserted for setting hardware be completed.nopnopnopnopnopnop;配置MPLLldr r0,=MPLLCONldr r1,=(M_MDIV<<12+(M_PDIV<<4+M_SDIVstr r1,r0;检查启动是从休眠模式唤醒.ldr r1,=GSTATUS2ldr r0,r1tst r0,#0x2;是从休眠模式唤醒,跳转到SLEEP_WAKEUP handler.bne WAKEUP_SLEEPEXPORT StartPointAfterSleepWakeUpStart
19、PointAfterSleepWakeUp;设置存储相关寄存器的程序;SMRDATA中涉及的值请参考memcfg.inc程序ldr r0,=SMRDATAldr r1,=BWSCON ;BWSCON地址add r2, r0, #52 ;SMRDATA结束地址ldr r3, r0, #4str r3, r1, #4cmp r2, r0bne %B0;初始化堆栈bl InitStacks; 设置缺省中断处理函数ldr r0,=HandleIRQ ;This routine is neededldr r1,=IsrIRQ ;if there isn't 'subs pc,lr,#4&
20、#39; at 0x18, 0x1cstr r1,r0;将数据段拷贝到RAM中,将ZI数据段清零,跳入C语言的main函数执行。;If main( is used, the variable initialization will be done in _main(. :LNOT:USE_MAIN;Copy and paste RW data/zero initialized dataLDR r0, =|Image$RO$Limit| ; Get pointer to ROM dataLDR r1, =|Image$RW$Base| ; and RAM copyLDR r3, =|Image$
21、ZI$Base|;Zero init base => top of initialised dataCMP r0, r1 ; Check that they are differentBEQ %F21CMP r1, r3 ; Copy init dataLDRCC r2, r0, #4 ;-> LDRCC r2, r0 + ADD r0, r0, #4STRCC r2, r1, #4 ;-> STRCC r2, r1 + ADD r1, r1, #4BCC %B12LDR r1, =|Image$ZI$Limit| ; Top of zero init segmentMOV
22、r2, #03CMP r3, r1 ; Zero initSTRCC r2, r3, #4BCC %B3 :LNOT:THUMBCODEbl Main ;Don't use main( because .b . THUMBCODE ;for start-up code for Thumb modeorr lr,pc,#1bx lrCODE16bl Main ;Don't use main( because .b .CODE32;初始化各模式下的堆栈指针InitStacks;Don't use DRAM,such as stmfd,ldmfd.;SVCstack is i
23、nitialized before;Under toolkit ver 2.5, 'msr cpsr,r1' can be used instead of 'msr cpsr_cxsf,r1' mrs r0,cpsrbic r0,r0,#MODEMASKorr r1,r0,#UNDEFMODE|NOINTmsr cpsr_cxsf,r1 ;UndefModeldr sp,=UndefStack ; UndefStack=0x33FF_5C00orr r1,r0,#ABORTMODE|NOINTmsr cpsr_cxsf,r1 ;AbortModeldr sp,=
24、AbortStack ; AbortStack=0x33FF_6000orr r1,r0,#IRQMODE|NOINTmsr cpsr_cxsf,r1 ;IRQModeldr sp,=IRQStack ; IRQStack=0x33FF_7000orr r1,r0,#FIQMODE|NOINTmsr cpsr_cxsf,r1 ;FIQModeldr sp,=FIQStack ; FIQStack=0x33FF_8000bic r0,r0,#MODEMASK|NOINTorr r1,r0,#SVCMODEmsr cpsr_cxsf,r1 ;SVCModeldr sp,=SVCStack ; SV
25、CStack=0x33FF_5800;USER mode has not be initialized.mov pc,lr;The LR register won't be valid if the current mode is not SVC mode.;= ; 时钟测试; Assemble code, because VSYNC time is very short;= EXPORT CLKDIV124EXPORT CLKDIV144CLKDIV124ldr r0, = CLKDIVNldr r1, = 0x3 ; 0x3 = 1:2:4str r1, r0;延时时钟稳定nopn
26、opnopnopnopldr r0, = REFRESHldr r1, r0bic r1, r1, #0xffbic r1, r1, #(0x7<<8orr r1, r1, #0x470 ; REFCNT135str r1, r0nopnopnopnopnopmov pc, lrCLKDIV144 ldr ldr str nop nop nop nop nop ldr ldr bic bic orr str nop nop nop nop nop mov LTORG SMRDATA DATA ;存储器控制寄存器的定义区 ; 存储器访问周期参数 ; The memory settin
27、gs is safe parameters even at HCLK=75Mhz. ; SDRAM refresh period is for HCLK<=75Mhz. DCD (0+(B1_BWSCON<<4+(B2_BWSCON<<8+(B3_BWSCON<<12+(B4_BWSCON<<16+(B5_BWSCON<<20+(B6_BWSCON< <24+(B7_BWSCON<<28 DCD (B0_Tacs<<13+(B0_Tcos<<11+(B0_Tacc<<8
28、+(B0_Tcoh<<6+(B0_Tah<<4+(B0_Tacp<<2+(B0_PMC ;GCS0 DCD (B1_Tacs<<13+(B1_Tcos<<11+(B1_Tacc<<8+(B1_Tcoh<<6+(B1_Tah<<4+(B1_Tacp<<2+(B1_PMC ;GCS1 DCD (B2_Tacs<<13+(B2_Tcos<<11+(B2_Tacc<<8+(B2_Tcoh<<6+(B2_Tah<<4+(B2_Tacp&l
29、t;<2+(B2_PMC ;GCS2 pc, lr r0, = REFRESH r1, r0 r1, r1, #0xff r1, r1, #(0x7<<8 r1, r1, #0x630 ; REFCNT675 - 1520 r1, r0 r0, = CLKDIVN r1, = 0x4 r1, r0 ; 0x4 = 1:4:4 ;延时时钟稳定 DCD (B3_Tacs<<13+(B3_Tcos<<11+(B3_Tacc<<8+(B3_Tcoh<<6+(B3_Tah<<4+(B3_Tacp<<2+(B3_PM
30、C ;GCS3 DCD (B4_Tacs<<13+(B4_Tcos<<11+(B4_Tacc<<8+(B4_Tcoh<<6+(B4_Tah<<4+(B4_Tacp<<2+(B4_PMC ;GCS4 DCD (B5_Tacs<<13+(B5_Tcos<<11+(B5_Tacc<<8+(B5_Tcoh<<6+(B5_Tah<<4+(B5_Tacp<<2+(B5_PMC ;GCS5 DCD (B6_MT<<15+(B6_Trcd<<2+(B6_SCAN DCD (B7_MT<<15+(B7_Trcd<<2+(B7_SCAN ;GCS6 ;GCS7 DCD (REFEN<<23+(TREFMD<<22+(Trp<<20+(Trc<<18+(Tchr<<16+REFCNT DCD
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年西安雁塔区长延堡社区卫生服务中心招聘备考题库及完整答案详解一套
- 2025年河北省三河市医院招聘36人备考题库及完整答案详解1套
- 灰色插画风总结汇报模板
- 2025年成都大学附属小学公开招聘教师备考题库含答案详解
- 2025年遵化市事业单位公开选聘高层次人才8人备考题库含答案详解
- 2025年国家空间科学中心质量管理处招聘备考题库参考答案详解
- 2025年汤旺县事业单位公开招聘19人备考题库及完整答案详解一套
- 2025年福州市妇女儿童活动中心关于招聘劳务派遣制工作人员的备考题库及参考答案详解1套
- 2025年南宁市兴宁区虹桥路幼儿园招聘备考题库及1套完整答案详解
- 后疫情时代邀约策略
- 小小小厨师幼儿健康食谱烹饪
- 2023历史新课标培训心得
- 国家开放大学期末机考理工英语3
- 《贪污贿赂罪新》课件
- 《斯大林格勒保卫战》课件
- 清华大学《工程伦理》网课习题及期末考试答案
- 2023年运动康复期末复习-体适能理论与训练(运动康复专业)考试上岸题库历年考点含答案
- 中国纪录片发展历程
- 班组工程进度款申请表
- 四年级阅读训练概括文章主要内容(完美)
- JJG 1033-2007电磁流量计
评论
0/150
提交评论