TQ2440裸奔程序1-LED流水灯.doc_第1页
TQ2440裸奔程序1-LED流水灯.doc_第2页
TQ2440裸奔程序1-LED流水灯.doc_第3页
TQ2440裸奔程序1-LED流水灯.doc_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

裸奔程序1-跑马灯最近,把半个多月来学习ARM的笔记进行了整理,主要是想让自己养成一个良好的学习习惯,加深对汇编语言的理解,见证自己学习过程中的体会和感悟,同时感谢在论坛上给予我帮助的人,你们的帮助是我继续研究下去的动力。故将自己的笔记整理发布,仅供像我这样的初学者参考。 第一章 GPIO端口操作S3C2440有117个I/O端口,共分为A-H组,可以通过设置寄存器来确定某个引脚用于输入、输出或其他特殊功能。对端口的操作主要通过以下三个寄存器来进行。1. GPxCON,用于配置/选择引脚的功能。2. GPxDAT,用于引脚读写,当引脚被设为输入时,可以读此寄存器得到引脚输入,当引脚为输出时,写此寄存器相应位可令此引脚输出高电平或低电平。3. GPxUP,用于设置内部上拉电阻,为0时,相应引脚使用上拉电阻,为1时不使用(当引脚处于高阻状态时,它的电平由上拉、下拉电阻确定)因此对端口的操作实际上就是通过对这三个寄存器进行读写。代码如下:Ldr r0,=GPxCON 配置某端口功能Ldr r1,=0x? Str r1,r0Ldr r0,=GPxDAT 读取端口数据Ldr r1,=0x?Str r1,r0 ;向端口写入数据Ldr r1,r0 ;读取端口数据1、 TQ2440LED跑马灯程序硬件说明:TQ2440中,LED1-LED4接GPB5-GPB8,其中1灯灭,0灯亮 GPBCON地址为0x56000010,GPBDAT地址为0x56000014 GPBCON每两位控制一个端口,其中00为输入端,01为输出端,取值11保留,10为其它定义 软件说明: 设置GPB5-GPB8为输出端(0x0110)+ (0x0112)+ (0x0114)+ (0x0116)=0x15400首先,我们初始化程序主要工作为: 关闭看门狗电路 关闭子中断源 关闭中断 设置系统模式并关闭中断 设置堆栈指针 调用TestMain应用程序程序:Start ldr r0,=WTCON ;watch dog disable ldr r1,=0x0 str r1,r0 ldr r0,=INTMSK ldr r1,=0xffffffff;all interrupt disable str r1,r0 ldr r0,=SUBINTMSK ldr r1,=0x7fff ;all sub interrupt disable str r1,r0 msr cpsr_c,#0xdf ;系统模式并关闭IQR中断 ldr sp,=4096 b TestMain需要说明的是,我们在调用外部汇编程序时,需要用IMPORT TestMain引入该程序,同理,需要用EXPORT TestMain导出该函数定义。在LED.S文件中ldr r0,=GPBCONldr r1,=(0x0110)+(0x0112)+(0x0114)+(0x0116)str r1,r0用来设置GPBCON端口中GPB5-GPB8四个引脚功能为输出端。ldr r0,=GPBDATldr r1,=(0xe5) ;led1str r1,r0向GPB端口输出数据 (111000000)点亮LED1灯,其他同理ldr r2,=0x20000loop1 sub r2,r2,#1 cmp r2,#0 bne loop1用来延时,需要说明的是,在我们的初始化程序中,由于没有对时钟频率进行设置,TQ2440外接频率为FIN=12M,故程序运转正常。当我们将其用7命令下载到SDRAM中运行时,你会觉得四个LED灯全亮。原因何在,这是因为TQ2440中U_BOOT程序已将CPU时钟设置为400MHz,运行速度加快给你造成的错觉(这个问题,曾让我困惑,以为下载到NAND中不运行)。将此程序下载到NANDFLASH或SDRAM中运行,我们自然产生一个问题,从NAND启动后,CPU自动将前4K数据拷贝到内部RAM中运行,地址为0x00000000而下载到SDRAM中时,其地址为0x30000000,两个地址不一样,程序是如何都能运行的呢?它是如何处理地址的呢?让我们看看汇编后的代码:ldr r0,=WTCON ;watch dog disable0xe3a00453 mov r0,#0x53000000 ldr r1,=0x0 0xe3a01000 mov r1,#0 str r1,r0 0xe5801000 str r1,r0,#0 ldr r0,=INTMSK0xe59f001c ldr r0,0x30000030 ; = #0x4a000008 ldr r1,=0xffffffff;all interrupt disable 0xe3e01000 mvn r1,#0 str r1,r0从汇编后代码我们可以看到,因为WTCON地址0x53000000是一个合法的立即数,故ldr r0,=WTCON被处理成mov r0,#0x53000000指令,与地址无关。而INTMSK的地址为0x4a000008不是合法立即数,故 ldr r0,=INTMSK指令被汇编成一条ldr r0,0x30000030 ; = #0x4a000008即从地址为0x30000030处读取0x4a000008,我们知道,编译器会在每段的未尾放一缺省的文字池,用来存放不是合法立即数的常数,当用伪指令LDR时,根据操作数的情况,或汇编成MOV指令,或用LDR读取指令。从上面我们可以看出,当程序在SDRAM(0x30000000)运行时,程序能根据地址读取正确的数,而程序写入NAND并运行时,它的开始地址为0x00000000,同理,数据0x4a000008的地址应该变为0x00000030,如图:SDRAM运行,其地址如下:0x30000000 ldr r0,=GPBCON 0x3000000c ldrr0,0x30000030 ; = #0x4a000008 0xe59f001c(二进制代码) 0x30000030 0x4a000008 那么当从NAND中运行时,其地址空间如下:0x00000000 ldr r0,=GPBCON 0x0000000c ldrr0,0x30000030 ; = #0x4a000008 0xe59f001c(二进制代码) 0x00000030 0x4a000008 那么,ldr指令是如何保证从SDRAM或NAND中运行得到正确的地址的呢,这是因为ldr指令的地址是基于PC+8+偏移地址,我们看其二进代码0xe59f001c(二进制代码),偏移值为c,其值计算如下:0x3000000c+8+1c=0x30000030(SDRAM) 0x0000000c+8+1c=0x00000030(NAND)同理,我们再看看b TestMain指令情况:其汇编为:b TestMain 0x3000002c0xea000002 b TestMain而TestMain代码的第一条指令地址为0x3000003c而转移指令的地址计算方法如下:后24位向左移动2位后再与PC+8相加的值就是程序转移的地址:(SDRAM)0x3000002c+8+000002*4(左移位)=0x3000003c (NADND) 0x0000002c+8+000002*4(左移2位)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论