ARM7(LPC2xxx)芯片的小总结

发布者:敬亭山人最新更新时间:2019-01-16 来源: eefocus关键字:ARM7  LPC2xxx  小总结 手机看文章 扫描二维码
随时随地手机看文章

7种工作模式:

fiq/irq/abt/und/sys/usr/svc。通过"MSR cpsr_c,#0xdx"切换。上电时进入svc模式。

svc和usr的区别是:svc可以通过"MSR cpsr_c,#0xdx"自由切换到其它任何模式,但是usr不可以。

各模式下有自己的堆栈。要在程序启动后依次进入各个模式分别设置自己的堆栈,最后进入usr模式。


Prefetch Abort和Data Abort模式:

Prefetch Abort通常会发生在自修改指令之后。而Data Abort发生于向无效内存中取操作数时,通常是数据指针越过边界了。如果在scatter文件中不指定边界,若编译时内存分配超过了实际物理内存,一定会有Data Abort或Prefetch Abort发生。 Data Abort这个异常会经常出现,要注意。


存储器映射:
0-1G(0x0000,0000 - 0x3fff,ffff): 片内Flash.
1-2G(0x4000,0000 - 0x7fff,ffff): 片内RAM.
2-3.5G(0x8000,0000 - 0xbfff,ffff - 0xdfff,ffff): 片外存储器。
3.5G - 3.75G(0xe000,0000 - 0xefff,ffff): VPB外设。
3.75G - 4G(0xf000,0000 - 0xffff,ffff): AHB外设。


虽然ARM7的寻址空间为4G,但是LPC2200系列只提供A0~A23总共16M的地址。片选信号CS0 - CS3是A24和A25的译码输出,将片外存储区0x8000,0000 - 0x83ff,ffff划分为bank0 - bank3,共16M*4=64M. 这4个bank可以被分别配置为8/16/32位总线宽度。复位时,bank0的总线宽度由Boot1:0引脚决定, bank1为32位,bank2为16位,bank3为8位。


Boot Block

LPC2114/2214的BootBlock被固化在最高的Flash块中,运行时被映射到0x7FFF,E000 - 0x7FFFF,FFFF的区域。而LPC2210没有片内Flash,但它有8K片内ROM存储了BootBlock,也被映射到0x7FFF,E000处。BootBlock是上电以后芯片最早自动运行的程序,被固化在LPC22XX中,相当于LPC22xx自身的bootloader。


分散加载描述文件.scf的设置


Metrowerks Code Warrior V1.2的"Edit->Debug In ExRAM Settings",然后在"Linker->ARM Linker"的Output页中,选中Scatter选项。在Scatter的编辑框中选择写好的.scf文件。(Scatter-Loading description file).


简单应用时可以不写.scf文件。而在"Output"页中选择"Simple".然后填写"RO Base"和"RW Base"的起始地址。在"Lay Out"页中,填写Object/Symble: Startup.o, Section: Start.编写启动文件:Startup.s.


在"Option"页里的"Image Entry Point"填入起始地址。


Scatter-Load Description File的结构:

".scf"文件中的"+RW"对应".s"源文件中的"READWRITE".
".scf"文件中的"+ZI"对应".s"源文件中的"NOINIT".
".scf"文件中的"+RO"对应".s"源文件中的"READONLY".

在".s"源文件中有:
AREA area_name CODE/DATA,READONLY/NOINIT/READWRITE
END

".scf"的例子:


内容
注解
ROM_LOAD 0x80000000
{

Name of Load Region, Start Address for Load Region and Maximum size of Load Region(省略了)

ROM_EXEC 0x80000000 0x20000
{
片外存储区,从0x80000000开始,最多0x20000字节。

Startup.o(Vector,+First)Startup模块的Vector段放在最前面。注1

*(+RO)其他所有模块中的所有代码和只读的数据放在这里。

}

IRAM 0x40000000 0x00004000
{
片内RAM区,从0x40000000开始,最多0x4000字节

Startup.o(MyStacks,+first)指定Startup.o中MyStacks放在最前面。

Startup.o(+RW,+ZI)Startup.o中的其他+RW/+ZI段。注1

os_cpu_a.o(+RW,+ZI)

}

STACKS 0x40004000 UNINIT
{
片内16K RAM的顶端,存放不需要被"C library"初始化的段。

Stack.o(+ZI)注2

}

ERAM 0x80040000
{


*(+RW,+ZI)

}

HEAP +0 UNINIT
{
"+0"表示接着上一段"ERAM"的结尾,继续安排存储区。

Heap.o(+ZI)注3

}
}


下面是在scf文件中引用过的源文件示意:


"Startup.s"
  code 32
  area Vectors,CODE,READONLY
  entry
  ...
  end
注1:在"Startup.o"里面会生成名为"Vectors"的段,段的属性为"READONLY"
"Stack.s"
  area Stacks, DATA, NOINIT
  export StackUsr
StackUsr  SPACE 1
  end
注2: 在"Stack.o"里面会生成名为"Stacks"的段,段的属性为"NOINIT",该属性对应scf文件中的"+ZI". 该段不需要初始化或者可以被初始化为"0".
"Heap.s"
  area Heap,DATA,NOINIT
  export bottom_of_heap
bottom_of_heap  SPACE 1
  end
注3: "Heap.o"里面名为"Heap"的段。


在Scatter文件中最好每一个Region都加一个Maximum参数,这样当编译时如果实际使用的空间大于Maximum Size,会有Error:16220E: Excution region xxx size (xxx bytes) exceeds limit (xx bytes)。如果地址有重复,会有Error: 16221E: Excution region xxx overlaps with excution region xxx。前一个Region的首地址 + Maximum > 后一个Region的首地址时不一定有Error。只有当一分配的内存出现覆盖时才会有Error。


Region的"UNINIT"之类的参数要放在"Maximum size"参数之前。


在一个Region中,RAM的分配不是按照罗列的顺序来的。要想让汇编中使用的变量有固定的位置,可以把所有汇编文件产生的".o"放在同一个Region中。如:


IRAM1 0x40000000
{
  startup.o(+RW,+ZI)
  ASMSourceCode1.o(+RW,+ZI)
  ASMSourceCode2.o(+RW,+ZI)
}
IRAM2 +0
{
  CSourceCode1.o(+RW,+ZI)
  CSourceCode2.o(+RW,+ZI)
}
这样,所有汇编中定义的变量地址就相对集中了。
如果只有一个汇编文件如startup.s,也可以这样:
IRAM 0x40002000 0x1000
{
  startup.o (Mystack,+first)
  *(+RW,+ZI)
}
用一个"+first"强行将startup.s中的Mystack放在0x40002000位置。

编译器的全局变量和局部变量:
全局变量从Scatter文件规定的起始地址向地址增加的方向生长。
局部变量从堆栈中规划,向地址减小的方向生长。


实验如下:

1、在".c"中定义全局变量:
  uint8 ucData2[17]="__/__ hh:mm:ss";

2、在main()函数中定义局部变量:
  uint8 ucdata1[17]="abcdefghijklmnop";

3、运行程序,至"void main(){"处停下。观察0x40003000处为"__/__ hh:mm:ss"。堆栈指针SP(r13)=0x40004000。

4、观察地址0x40003c00处,没有蛛丝马迹。按"Step In"单步执行,指针停在"uint8 ucdata1[17]="abcdefghijklmnop";"处。 SP变为0x40003FC8。

5、再按"Step In"单步执行,进入Disassembly窗口。当前程序标号为"__rt_memcpy",应该是初始化局部变量的。

6、按"Step Out"退出Disassembly窗口。0x40003FCC~0x40003FDB被初始化为"abcdefghijklmnop"。
 

 此时,SP(r13)仍旧为0x40003FC8,与在第4步时的内容相比,没有变化。说明在刚刚进入"void main()"以后,即在第3、4步中间,局部变量的地址就已经分配好了。


在安排全局变量的时候,若某一模块有被初始化的需求,则该模块放在前面,Scatter文件中的"+first"被移到所有有初始值得变量后面。"first"只是没有初始化要求的数据块的"first"。


我看来这篇文章写的很好,是笔记类型的,其中好多常见问题和主要事项都列了出来,不过是初学者还是老鸟都能从中或多或少的收益,因此摘录一部分记录。


关键字:ARM7  LPC2xxx  小总结 引用地址:ARM7(LPC2xxx)芯片的小总结

上一篇:MCU内部参考电压妙用
下一篇:LPC2200系列bootloader实现过程:

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

ARM7(lpc2146)学习笔记-0607
1.关于VBP分频器 VPB 分频器决定处理器时钟(cclk)和外设时钟(pclk)之间的关系。VPB 分频器有两个用途。第一 通过 VPB总线为外设提供需要的PCLK时钟,以便外设能在选择的ARM处理器速度下操作。为了实现该特性, VPB 总线频率可以降低为处理器时钟频率的 1/2 或 1/4。由于上电后 VPB 总线必须正常工作(如果它由于 VPB 总线的 VPB 分频器控制寄存器的原因而不能工作,则 VPB 总线的时序不能改变),因此,VPB 总线 在复位后的默认状态是以 1/4 速率运行。VPB 分频器的第二个用途是当所有外设都不必在全速率下运行时 降频以降低功耗。由于VPB分频器连接到PLL的输出,PLL(如果正在运行)在
[单片机]
ARM7、ARM9、ARM11、ARM-Cortex的关系
1. ARM7、ARM9、ARM11、ARM-Cortex的关系 ARM7:ARMv4架构,ARM9:ARMv5架构,ARM11:ARMv6架构,ARM-Cortex 系列:ARMv7架构 ARM7没有MMU(内存管理单元),只能叫做MCU(微控制器),不能运行诸如Linux、WinCE等这些现代的多用户多进程操作系统, 因为运行这些系统需要MMU,才能给每个用户进程分配进程自己独立的地址空间 。ucOS、ucLinux这些精简实时的RTOS不需要MMU,当然可以在ARM7上运行。 ARM9、ARM11,是嵌入式CPU(处理器),带有MMU,可以运行诸如Linux等多用户多进程的操作系统,应用场合也不同于ARM7。 到了ARM
[单片机]
基于ARM7系列芯片嵌入式平台上实现的设计方案
系统防掉电设计的目的是:采用一种机制,使得系统在意外失去供电的情况下,可以保证系统运行状态的确定性以及记录数据的完整性;当系统供电恢复后,现场数据可以及时恢复,避免应用系统产生混乱。我们知道,在嵌入式系统设计与开发中越来越多地应用嵌入式操作系统。由于操作系统的引入,数据的读写往往是通过文件的方式完成,而不是直接对存储单元地址操作。用文件读写方式操作数据,在程序的运行过程中往往将数据暂存在易失性的存储空间,如SDRAM,一旦系统意外失电,这些数据往往被丢失。因此,当系统意外失电时必须采取一定的措施进行系统的掉电保护,以避免系统产生混乱。总的说来,防掉电程序的主要思路就是:产生掉电信号,捕捉掉电信号,处理掉电信号和数据以及现场状态的恢
[电源管理]
基于<font color='red'>ARM7</font>系列芯片嵌入式平台上实现的设计方案
基于μC/OSII和ARM7 中断机制的IRQ中断响应机制改进及优化
如今,在嵌入式处理器芯片中,以ARM7为核心的处理器是应用较多的一种。它具有多种工作模式,并且支持两种不同的指令集(标准32位ARM指令集和16位Thumb指令集)。μC/OSII是专为嵌入式应用设计的抢占式、多任务实时操作系统,可用于各类8位、16位和32位单片机或DSP。μC/OSII向ARM7移植具有得天独厚的优点,因此,“μC/OSII+ARM7”成为广泛应用的一款平台。 不管是哪种型号的ARM处理器,也无论该嵌入式系统中是否有操作系统,在计算机与外界实时交互的过程中,中断技术都是一项关键的技术。当外部事件发生时,CPU必须及时响应中断以实现对相应事件的处理,因此能否中断嵌套是影响嵌入式系统实时性能的主要因素。 1
[单片机]
基于μC/OSII和<font color='red'>ARM7</font> 中断机制的IRQ中断响应机制改进及优化
基于ARM7 LPC2210的触摸屏触摸点数据采集系统设计
本文提出了基于ARM7系列LPC2210微控制器和嵌入式操作系统μC/OS—II来实现触摸屏触摸点数据采集系统的设计,并完成了微控制器与上位机之间的物理层电路转换,实现了基于LIN总线的数据通信,能够在上位机得到触摸点的精确坐标以及控制菜单信息,并且准确可靠、传输速率高。 嵌入式系统实际上是“嵌入式计算机系统”的简称,是相对于通用计算机系统而言的,根据应用的要求,将操作系统和功能软件集成于计算机硬件系统中,以应用为中心,计算机技术为基础,实现软件与硬件的一体化。其适用于对功能、可靠性、成本、体积和功耗等有严格要求的专用计算机系统。 触摸屏又称为“触控屏”、“触控面板”,是一种附加在显示器表面的透明介质。触摸屏作为一种新的输
[单片机]
基于<font color='red'>ARM7</font> LPC2210的触摸屏触摸点数据采集系统设计
ARM7在嵌入式应用中启动程序技术难点分析
技术难点分析 ⑴.MMU的使用 MMU是存储器管理单元的缩写,是用来管理虚拟内存系统的器件。MMU通常是CPU的一部分,本身有少量存储空间存放从虚拟地址到物理地址的匹配表。此表称作TLB(转换旁置缓冲区)。所有数据请求都送往MMU,由MMU决定数据是在RAM内还是在大容量存储器设备内。如果数据不在存储空间内,MMU将产生页面错误中断。 MMU的两个主要功能是: 将虚地址转换成物理地址。 控制存储器存取允许。MMU关掉时,虚地址直接输出到物理地址总线。 在实践中,使用MMU解决了如下几个问题: ①使用DRAM作为大容量存储器时,如果DRAM的行列是非平方的,会导致该DRAM的物理地址不连续,这将给程序的编写调试造成极大
[工业控制]
ARM7 LPC2210的Bootloader源码分析
对周立功公司开发板EasyARM LPC2210开发板Chenmingji写的Bootlaoder进行分析和解读。 一、变(常)量声明 首先声明堆栈大小 ;define the stack size ;定义堆栈的大小 SVC_STACK_LEGTH EQU 0 FIQ_STACK_LEGTH EQU 0 IRQ_STACK_LEGTH EQU 256 ;IRQ中断堆栈 ABT_STACK_LEGTH EQU 0 UND_STACK_LEGTH EQU 0 处理器模式声明 NoInt EQU 0x80
[单片机]
基于ARM7的RTU微控制器的设计
引言 随着我国在水情数据采集系统的信息化和现代化步伐的加快,需要采集的数据种类增多,采集的站点数增加,对数据采集的速度和质量都提出了新的要求,传统的水情数据测报系统的RTU(远端数据采集器)已不能适应新的要求,亟需开发新的产品。 新开发的RTU,其处理能力要比较强,可扩展性要比较好,运行的软件系统具有可移植性,可以移植到不同的硬件平台,可以根据需要配置不同的传感器。为此技术上选用成熟可靠的RTOS 和层次化、构件化的设计思想构建平台软件,保证软件稳定、可靠,扩充新业务功能时软件结构体系保持不变。 RTU 对外有各种类型的传感器接口及通信接口,平时处于守侯状态,当有外部事件或定时处理事件时,由中断信号唤醒CPU 进行相应的处理
[单片机]
基于<font color='red'>ARM7</font>的RTU微控制器的设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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