ARM9学习笔记之——SDRAM实验

发布者:meirong最新更新时间:2016-05-09 来源: eefocus关键字:ARM9  SDRAM实验 手机看文章 扫描二维码
随时随地手机看文章
 最近,我有努力学习《深入浅出嵌入式底层软件开发》。我自我觉得这本书很好。如果你有一块Mini2440的开发板,那就再好不过了。

    学了点东西,写点总结。以下是我在做 Page130,2.6.8内存驱动实验总结。

-------

    我按照书上的指示,完成了代码的编写。对项目作如下配置:ARM9学习笔记之——SDRAM实验

 

 

上述的配置中 -ro-base 0x30000000 告诉Linker,本程序将被加载到 0x30000000 上运行。

    实验程序的功能是,程序最初是在0x00000000 地址上开始运行。它初始化SDRAM后,将自己到0x30000000地址上,然后跳到SDRAM中运行。

 

第一个问题:我在用AXD进行调试时,总是发现程序运行到 copyallloop 中死掉。

copyall
	IMPORT	|Image$$RO$$Base|    
	IMPORT	|Image$$RW$$Limit|    
	   
	ldr r0, = |Image$$RO$$Base|   
	ldr r1, = |Image$$RW$$Limit|   
	ldr r2, = 0x00000000   
	   
copyallloop
	teq r0, r1   
	beq quitcopy   
	ldr r3 , [r2], #4   
	str r3 , [r0], #4	     
	b copyallloop   
quitcopy
    mov pc, lr

copyall函数的功能是将 0x00000000 地址上的所有程序代到到SDRAM的 0x30000000 地址上去。可是总是在copyallloop 循环中死掉。

    结果查看寄存器才知道,知道程序开始并没有被加载到0x00000000的地址上,而是被加载到SDRAM中。如下是程序开始运行时,各寄存器的值:

由此可以得知,PC的初始值为0x3000005C,而不是PC = 0x00000000。说明调试时程序被加载到SDRAM中运行。

    这么一来,那么将0x00000000地址区间的数据考到0x30000000地址上来,而程序自身就运行在0x30000000地址上。这样一来,的数据将程序自己给覆盖了。难怪要死在那里。

    在进入copyallloop之前,反汇编如下:

当r0 = 0x3000000D0时:

 

ARM9学习笔记之——SDRAM实验
 

 

 

此时,0x300000D0之前的指令已被更改。所以,死在这里了。

 

第二个问题:为什么xmain()函数被放在0x0000地址上,而不是start呢?

    令我奇怪的是,程序开始执行时,PC并不等于0x00000000,而是另一个值。如下所示:

 

ARM9学习笔记之——SDRAM实验

 

 

可见,图中所示A处,PC并不等于0x0000,而是0x005C。不对呀!ARM核启动不是多0x0000开始的吗?怎么成了0x005C呢?再看D处,start启动程序被放到了0x005C的位置。而放在 0x0000 地址上的指令则是xmain函数入口,见C处。

    当我退出调试模式,直接复位运行。我发现,程序只在反复运行 xmain() 函数。而没有执行start处初始化相关的指令。可见ARM复位后,还是从0x0000地址上开始执行的。

    那么,为什么编译器要把 xmain 放在0x0000地址上,而不是 start 呢?我详细地对比了书上的配置界面的各项设置。发现在 Equivalent Command Line 栏中,我少写了 "-first init.o" 这句话的意思就是说,把init.o目标文件的代码放在首位。正确的命令串为:

    -info totals -ro-base 0x30000000 -first init.o

 


 

修改配置后,重新编译。在AXD中查看其反汇编代码,如下:

这样一来,start就被放到了前面了。

第三个问题:如何完成实验?

    现在,我把 RO Base设置成了0x30000000 ,只要一进入调试模式,AXD就自动将我的代码加载到了 SDRAM 的 0x30000000 地址上了。

    按照书中的要求,代码应该被烧录到 0x00000000 地址上(Nor Flash)中才对。而且工程编译后又没有bin或hex文件,也没法直接用H-Flasher烧。

    (1)我该怎么让代码在调试时烧到 0x00000000 上,而不是 0x30000000上。

    (2)如何让工程在编译时生成烧录文件。

 

关于生成bin文件方法:

1. DebugRel Settings->Linker->ARM fromELF->Output format指定Plain binary->Output file name 路径

2. DebugRel Settings->Target->Post-Linker中选择ARM fromELF

3. 重新Make,就会生成bin文件。

关键字:ARM9  SDRAM实验 引用地址:ARM9学习笔记之——SDRAM实验

上一篇:ARM9学习笔记之——MMU
下一篇:在MDK上建立一个C++的STM32开发工程

推荐阅读最新更新时间:2024-03-16 14:53

ARM9协处理器CP15、MCR/MRC指令
在基于ARM的嵌入式应用系统中,存储系统通常是通过系统控制协处理器CP15完成的。CP15包含16个32位的寄存器,其编号为0~15。 访问CP15寄存器的指令 MCR ARM寄存器到协处理器寄存器的数据传送 MRC 协处理器寄存器到ARM寄存器的数据传送 MCR指令和MRC指令只能在处理器模式为系统模式时执行,在用户模式下执行MCR指令和MRC指令将会触发未定义指令的异常中断。 MCR指令 MCR指令将ARM处理器的寄存器中的数据传送到协处理器寄存器中。如果协处理器不能成功地执行该操作,将产生未定义的指令异常中断。 指令语法格式 MCR{ cond } p , opcode_1 , Rd , CRn , CRm
[单片机]
<font color='red'>ARM9</font>协处理器CP15、MCR/MRC指令
ARM9(2440)的IIC-理论知识及程序实例
概述 S3C2440A RISC 微处理器可以支持一个多主控IIC 总线串行接口。一条专用串行数据线(SDA)和一条专用 串行时钟线(SCL)传递连接到IIC 总线的总线主控和外设之间的信息。SDA 和SCL 线都为双向的。 多主控IIC 总线模式中,多个S3C2440A RISC 微处理器可以发送或接收串行数据来自或到从设备。主机 S3C2440A 可以通过IIC 总线启动和结束数据传输。S3C2440A 中的IIC 总线是使用标准总线仲裁步骤。 为了控制多主控IIC 总线操作,必须写入值到以下寄存器中: 多主控IIC 总线控制寄存器,IICCON 多主控IIC 总线控制/状态寄存器,IICSTAT 多主控IIC 总线Tx/
[单片机]
嵌入Linux的ARM9处理器LPC3250与16位AD采样芯片
本文针对数据采集与处理系统的应用需求,设计了嵌入Linux的ARM9处理器LPC3250与16位AD采样芯片MAX1303的硬件接口和驱动程序。首先,描述了LPC3250和MAX1303的性能、特点以及硬件接口电路设计方案。然后,在硬件平台的基础上,详细地阐述了嵌入式Linux下MAXl303驱动程序的组成模块和具体实现方法,并给出了部分源代码以及对设备驱动的测试方法。测试结果表明,系统工作正常、稳定,采样结果正确,具有实际工程应用价值。 在数据采集系统中,通常是通过传感器将自然世界的物理量转化成电量,电量是模拟量,必须经过模/数转换才能被系统的处理器读取。现在的很多微处理器都有片内AD,但这些AD多数是8位、10位或者1
[单片机]
嵌入Linux的<font color='red'>ARM9</font>处理器LPC3250与16位AD采样芯片
基于ARM9处理器的嵌入式Boa服务器的网络远程监测实现方案
随着高科技技术逐渐融入到传统的农副业,温室培养已成为生产反季节作物的方式。介绍了基于S3C2410处理器的温室监测控制系统的设计,并设计了一种基于ARM9处理器的嵌入式Boa服务器的网络远程监测实现方案,用户通过以太网对温室内的环境进行监测和一些设备的控制,提高远端机器的安全可靠性。 随着经济的快速发展和科技的进步,人们的生活水平不断提高,对生活质量的要求越来越高,对春茶的需求也大大增加。使得春茶供不应求,从而提出了温室培养茶树,以缓解人们对春茶的需求。 随着Internet技术的兴起,在嵌入式设备的管理与交互中,基于Web方式的应用成为目前的主流,这种程序结构也就是大家非常熟悉的B/S结构,即在嵌入式设备上运行一个支持脚
[单片机]
基于<font color='red'>ARM9</font>处理器的嵌入式Boa服务器的网络远程监测实现方案
测试ARM9的外部中断功能
/******************************************* * 文件名称:EINT.c * 实现功能:测试外部中断的操作 * 作者:jianqi * 版本:1.0 **********************************************/ #include 2440addr.h //包含2440相关寄存器的设置 #include def.h #define LED1 5 #define LED2 6 #define LED3 7 #define LED4 8 #define KEY1 1 #define KEY2 4 #def
[单片机]
采用ARM9微控制器实现上层控制算法解析方案
  引言   在很多嵌入式控制系统中,系统既要完成大量的信息采集和复杂的算法,又要实现精确的控制功能。采用运行有嵌入式Linux操作系统的ARM9微控制器完成信号采集及实现上层控制算法,并向 DSP 芯片发送上层算法得到控制参数,DSP芯片根据获得的参数和下层控制算法实现精确、可靠的闭环控制。   1 多机系统组成   该多机控制系统以ARM9微控制器s3c2440为核心,采用I2C总线挂载多个DSP芯片TMS320F28015作为协控制器,构成整个控制系统的核心。   1.1 S3C2440及TMS320F28015简介   Samsung公司的处理器S3C2440是内部集成了ARM公司ARM920T处理器内核的32位微控制器,
[单片机]
采用<font color='red'>ARM9</font>微控制器实现上层控制算法解析方案
具有硬件矢量浮点运算单元的微控制器在医疗电子中的应用
  微控制器是将微型计算机的主要部分集成在一个芯片上的单芯片微型计算机。微控制器诞生于20世纪70年代中期,经过20多年的发展,其成本越来越低,而性能越来越强大,这使其应用已经无处不在,遍及各个领域。例如电机控制、条码阅读器/扫描器、消费类电子、游戏设备、电话、HVAC、楼宇安全与门禁控制、工业控制与自动化和白色家电(洗衣机、微波炉)等。   现今的嵌入式工业及汽车系统中,有许多是基于8位或16位微控制器架构来设计的。随着新的低功耗32位架构的面市,这些应用有可能获得更高的性能、准确度和功效。此外,处理能力的提高也有助于实现新产品的差异性功能,包括先进的控制算法,GUI显示器、语音控制,以及电容式触摸感测等下一代接口。8 bit/1
[医疗电子]
具有硬件矢量浮点运算单元的微控制器在医疗电子中的应用
基于ARM9的嵌入式网关的研究
   摘 要: 介绍了一种基于ARM9的嵌入式以太网的设计方案。基于ARM内核微处理器S3C2410的功能特点及其外扩组成部分,分析了以太网控制器芯片RTL8019AS的性能以及与S3C2410的接口。在软件设计上,分析了BootLoader的作用,介绍了Linux的移植,并给出了通信程序的流程图,实现了嵌入式以太网的数据传输。    关键词: 嵌入式系统;网关;ARM;移植    引 言   无所不在的网络给网络接入设备带来了巨大的发展机遇。而随着网络接入市场的迅速增长,嵌入式网络接入开始成为嵌入式系统技术中最令人关注的一个领域。在嵌入式网络技术的推动下将会形成这样一个局面:在网络上传输的信息中,将有70%的信息来自嵌入式
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved