概述:LPC2136是基于一款支持实时仿真和跟踪的16/32位ARM7 TDMI-S CPU微控制器,它带有256 KB嵌入的高速片内FLASH存储器。LPC2136片内128位宽度的存储器接口和独特的加速结构使32位代码能够在最大时钟频率下运行。LPC2136把FLASH、RAM和众多模块集成在片内,大大提高了系统的可靠性,也节省了电路板的空间,并且节约了成本。它采用64脚LQFP-64封装工艺。
一、LPC2136引脚功能
备注:P0.27~P0.30为LPC2136的A/D转换器输入端。
二、LPC2136内部方框图
三、LPC2136中断原理
ARM7中断原理的最基本部分与单片机是一样的,如果对单片机中断原理比较熟悉,再来理解ARM7的中断原理是顺理成章的事情。
1.中断向量表
下面以Philips的lpc2136为例进行比较深入的分析:
我们在用ads1.2调试开发板时,有一个startup.s的汇编程序,这个程序就是lpc2136得以运行的启动代码,是及其重要的一部分,蕴含着ARM7的精髓。
其中,有这样一段代码:
AREA vectors,CODE,READONLY
ENTRY
;interrupt vectors
;中断向量表
Vector_Init_BLOCk
LDR PC, Reset_Addr
LDR PC, Undefined_Addr
LDR PC, SWI_Addr
LDR PC, Prefetch_Addr
LDR PC, Abort_Addr
DCD 0xb9205f80
LDR PC, [PC, #-0xff0]
LDR PC, FIQ_Addr
Reset_Addr DCD Start_Boot
Undefined_Addr DCD Undefined_Handler
SWI_Addr DCD SWI_Handler
Prefetch_Addr DCD Prefetch_Handler
Abort_Addr DCD Abort_Handler
Nouse DCD 0
IRQ_Addr DCD 0
FIQ_Addr DCD FIQ_Handler
;未定义指令
Undefined_Handler
B Undefined_Handler
;软中断
SWI_Handler
B SWI_Handler
;取指令中止
Prefetch_Handler
B Prefetch_Handler
;取数据中止
Abort_Handler
B Abort_Handler
;快速中断
FIQ_Handler
STMFD SP!, {R0-R3, LR}
BL FIQ_Exception
LDMFD SP!, {R0-R3, LR}
SUBS PC, LR, #4
下面的这个截图来自ads1.2安装后的“online book”里面(这里面有很多非常重要的知识,你不懂的任何疑问都可以在此找到答案,可惜很多人不知道这个好地方)
ARM体系设计有八种异常,并把所有现象用异常来表达,我们的代码任何时刻都在这八种异常中运行。
我们给开发板上电,这就是一种“异常”,这种异常用”Reset”来表示。
这八种异常对应八个地址:
Reset(复位)=========0x00000000(当上电,或按下开发板的复位键时,程序跳到该地址运行)
Undef(未定义指令)=========0x00000004(当程序指针访问地址出现未定义指令,程序跳到该地址运行)
SWI(软件中断)=========0x00000008(当发生软件中断,程序跳到该地址运行)
Prefetch Abort(预取指中止)=========0x0000000C(当预取值失败,程序跳到该地址运行)
Data Abort(数据中止)=========0x00000010(当访问数据区失败,程序跳到该地址运行)
Reserved(保留)===========0x00000014
IRQ===========0x00000018(当发生IRQ中断时,程序跳到该地址运行)
FIQ(快速中断)========0x0000001C(当发生快速中断时,程序跳到该地址运行)
2. FIQ中断,向量IRQ,非向量IRQ区别
FIQ是指快速中断请求(Fast Interrupt reQuest),具有最高优先级,一般只声明一个中断源为FIQ,这样可以得到最快的相应速度,如果非要申请多个中断源为FIQ,那么当中断发生时,FIQ中断线程通过读取FIQ状态寄存器来判断当前发生的是那个中断。
向量IRQ(Vector IRQ)是指向量中断请求(Vector Interrupt ReQuest)。具有次高优先级。
非向量IRQ(NO_Vector IRQ)是指非向量中断请求。具有最低优先级。
四、LPC2136内存结构(节选片段)
LPC2136是ARM7架构,是32位地址总线和数据总线,可以寻址的范围为2的32次方=4GB(0x00000000~0xFFFFFFFF)
我们的程序在哪里运行?
还记得我们在做“跑马灯”和“蜂鸣器”两个实验,用ads1.2中建立工程文件的时候有设置三个地址:
RO Base :0x40000000
RW Base :0x40001000
Image entry point :0x40000000
开始没有讲为什么,通过上面的系统存储器映射图解不知大家是否有所悟。LPC2136内部自带32KB RAM和256KB FLASH。
32KB RAM分布在整个CPU存储器空间的0x40000000~0x40007FFF;
256KB FLASH分布在整个CPU存储器空间的0x00000000~0x0003 FFFF;
RO Base是告诉编译系统把编译生成的目标码放在0x40000000起始的位置,也就是代码段存放在0x40000000开始的位置。
RW Base告诉编译系统把各种变量(常量放在RO开始的位置),堆栈放在0x40001000起始的位置。
Image entry point:是告诉编译系统程序入口点在0x40000000,即程序从这个地址开始执行。(此部分在附录二中细说)
Flash与RAM的区别
通过以上所说,好像FLASH在这里没什么用,如果你的RO地址定位在RAM中,那么FLASH确实没有用。但FLASH是必须的功能部件。
Flash的作用也许要从其与RAM的区别说起:
区别一:RAM是易失性存储器,Flash是非易失性存储器。通俗的说,存储在RAM中的数据掉电后数据丢失;而存储在FLASH中的数据掉电后任然保持。(必须通过工具或特殊命令来擦除)
区别二:RAM是可读写存储器,Flash只读存储器。(也许有人要问,Flash难道不能写吗?Flash可以写,但不能象RAM一样做简单赋值操作,必须通过Flash写命令写,而且写入数据的最小单位为512字节,即一个扇区)
区别三:RAM访问速度快,而Flash访问速度慢的多。
区别四:RAM价格昂贵,Flash便宜。
FLASH有何用途
我们一般在调试程序的时候为了提高开发进度,都把程序放在RAM中调试,在RAM中调试有一个缺陷就是每次上电必须下载程序到板子上,当产品的各个模块调试OK,产品就要实现脱机功能,即把程序烧写到FLASH中,这样就不需要每次上电加载程序。我们手中拿的手机,在开发阶段都是在RAM(SDRAM)中调试的,开发完成,要发布的时候就把程序烧到FLASH,这样我们开机有能运行FLASH的程序。
网友评论