LPC2000系列学习笔记.doc_第1页
LPC2000系列学习笔记.doc_第2页
LPC2000系列学习笔记.doc_第3页
LPC2000系列学习笔记.doc_第4页
LPC2000系列学习笔记.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

LPC2000系列学习笔记目录 /sikinzen/1 LPC2000系列简介. 1 1.1 部分特性. 2 1.2 存储器映射. 3 2 时钟周期. 3 3 引脚连接模块. 6 4 存储器映射控制. 6 4.1 寄存器MEMMAP的取值. 7 4.2 BOOT管脚的功能. 7 4.3 举例:启动代码. 8 5 中断. 8 5.1 中断源. 8 5.2 三种中断类型. 10 5.3 如何初始化某个中断源为三类中断中的一类. 10 5.4 中断处理过程. 10 5.5 IRQ中断. 11 5.6 关于外部中断. 11 5.7 举例. 11 6 定时器. 12 6.1基本定时功能. 13 7 UART. 13 8 PWM. 13 9 A/D模块. 13 10 bootloader 13 10.1 变(常)量声明. 13 10.2 建立中断向量表(向量表所有数据32位累加和为0) 14 10.3 复位程序. 15 10.4 堆栈初始化. 16 10.5 目标板初始化. 17 10.6 其它 18LPC2000系列学习笔记2-时钟周期 对于LPC2000系列,如果从XTAL1脚输入占空比为5050的时钟信号,则时钟频率在150MHz内;如果使用外部晶振,则仅支持130MHz的外部晶振;如果使用片内PLL系统或者引导程序(即ISP功能),输入时钟频率将被限制在1025MHz。以上是对于晶振输出频率(Fosc)的限制。 除了晶振输出频率,LPC2000还有如下几种频率: FccoPLL电流控制震荡器的频率,不需太过关注 Fcclk PLL输出频率,也称处理器的时钟频率 Fpclk VPB时钟频率,即为处理器与外设通讯的频率 它们之间的关系如下:(M 、P为PLLCFG寄存器中的倍增器值与分频器值) Fcclk = Fosc (M+1) M=0,1,2,31;Fcclk不大于60MHz Fcco = Fosc 2 P P=1,2,3,4;Fcco处于 156320MHz Fplck = Fcclk / (VPBDIV的值) VPBDIV取值1,2,4 特别注意,PLL的操作顺序应该是:先将PLL激活并等待锁定,然后再将PLL连接。不要试图在掉电唤醒之后简单地执行馈送序列来重新启动PLL,因为这会在PLL锁定建立之前同时使能并连接PLL。 举例:设置系统时钟 /* 系统设置, Fosc、Fcclk、Fcco、Fpclk必须定义*/ #define Fosc 11059200 /应当与实际晶振频率一致,10MHz25MHz #define Fcclk (Fosc * 4) /系统频率,必须为Fosc的整数倍(132),且=60MHZ #define Fcco (Fcclk * 4) /CCO频率,必须为Fcclk的2、4、8、16倍,范围为156MHz320MHz #define Fpclk (Fcclk / 4) * 1 /VPB时钟频率,只能为(Fcclk / 4)的1、2、4倍 /* 启动代码中相关部分 */ PLLCON = 1; /使能PLL #if (Fpclk / (Fcclk / 4) = 1 VPBDIV = 0; #endif #if (Fpclk / (Fcclk / 4) = 2 VPBDIV = 2; #endif #if (Fpclk / (Fcclk / 4) = 4 VPBDIV = 1; #endif #if (Fcco / Fcclk) = 2 PLLCFG = (Fcclk / Fosc) - 1) | (0 5); #endif #if (Fcco / Fcclk) = 4 PLLCFG = (Fcclk / Fosc) - 1) | (1 5); #endif #if (Fcco / Fcclk) = 8 PLLCFG = (Fcclk / Fosc) - 1) | (2 5); #endif #if (Fcco / Fcclk) = 16 PLLCFG = (Fcclk / Fosc) - 1) | (3 5); #endif PLLFEED = 0xaa; PLLFEED = 0x55; while(PLLSTAT & (1 10) = 0); /等待PLL锁定 PLLCON = 3; /使能并连接PLL PLLFEED = 0xaa; /进行有效的PLL馈送后将激活PLL PLLFEED = 0x55;LPC2000系列学习笔记3-引脚连接模块LPC2000系列学习笔记4-存储器映射控制 对于一般的处理器,系统启动后是从0x00000000地址开始读取中断向量表并引导程序的。但利用LPC2000的存储器重映射功能,我们可以将中断向量表转移至其它存储器,而不一定要从0x00000000这个地址读取。 LPC2000的这个功能是通过存储器映射控制寄存器MEMMAP和BOOT管脚来实现的。 4.1寄存器MEMMAP的取值 MEMMAP 功能 描述 00Boot装载程序模式 中断向量从Boot Block重新映射。一般情况下,即为地址0x7FFFE000 01用户Flash模式 中断向量不重新映射,它位于Flash中。一般情况下,即为地址0x00000000 10用户RAM模式 中断向量从静态RAM重新映射。一般情况下,即为地址0x40000000 11用户外部存储器模式 中断向量从外部存储器重新映射。一般情况下,即为地址0x80000000 特别注意,不正确的设定会导致器件的错误操作。 例如,每当产生一个软件中断请求,ARM内核就从0x0000 0008处取出32位数据。这就意味着当MEMMAP1:0=10(用户RAM模式)时,从0x0000 0008的读数/取指是对0x4000 0008单元进行操作;当MEMMAP1:0=00(Boot装载程序模式)时,从0x0000 0008的读数/取指是对0x7FFF E008单元的数据进行操作(Boot Block从片内ROM存储器重新映射);如果MEMMAP1:0=11(用户外部存储器模式),从地址为0x8000 0008的片外存储器中读取数据。 4.2BOOT管脚的功能 LPC22xx系列具有外部存储器接口,BOOT1:0脚的状态控制着引导方式,见下表。引脚悬空,内部上拉电阻保证其高电平状态。 BOOT1 BOOT1 引导方式 备注 0 0 CS0控制的8位存储器 MEMMAP1:0应设置为11 0 1 CS0控制的16位存储器 MEMMAP1:0应设置为11 1 0 CS0控制的32位存储器 MEMMAP1:0应设置为11 1 1 内部Flash存储器 MEMMAP1:0应设置为01 注意:BOOT管脚和MEMMAP寄存器的设置应该根据硬件电路的具体情况进行设置。若从32位的外部存储器引导,则MEMMAP1:0应设置为11,BOOT管脚设置为10。 对于LPC21xx系列,没有外部存储器接口,只能设置MEMMAP1:0为01。 对于LPC2200,无片内Flash,故不能设置MEMMAP1:0为01。 当然,也可以将P0.14接地,强制芯片重启后(/RESET为低)进入ISP状态。 4.3举例:启动代码#ifdef _DEBUG MEMMAP = 0x3; #endif #ifdef _OUT_CHIP MEMMAP = 0x3; #endif #ifdef _IN_CHIP MEMMAP = 0x1; #endifLPC2000系列学习笔记5-中断1.1中断源 LPC2000系列的向量中断控制器(VIC)支持32个中断请求输入,也即是支持32个中断源,见表5.1。这32个中断按顺序称为VIC通道0,VIC通道1,VIC通道31。 每一个VIC通道都支持软件中断与硬件中断,即每个中断均可由软件或硬件中断产生,软件中断与对应通道上的硬件中断是逻辑“或”的关系。软件中断可通过置位VICSoftInt寄存器相应位来产生,也可通过置位VICSoftIntClear寄存器相应位来清除。 表5.1 外设功能的中断源1.2三种中断类型 LPC2000具有3类中断:FIQ、向量IRQ和非向量IRQ。LPC2000系列可通过对VICIntSelect和VICVectCntlx(x=0,1,15)这两类寄存器的设置,将以上的32个中断源设置为这三类中断的任何一种。其中, ? 快速中断请求FIQ具有最高优先级。建议只分配一个中断请求给FIQ以减少中断处理程序的延迟。当然,VIC支持多个FIQ中断。 ? 向量IRQ具有中等优先级。该级别最多可分配32个请求中的16个。32个请求中的任何一个都可以分配到16个向量IRQslot中的任意一个。其中,slot0具有最高优先级,而slot15则为最低优先级。 ? 非向量IRQ具有最低优先级。 1.3如何初始化某个中断源为三类中断中的一类 通过VICIntSelect中断选择寄存器将32个中断请求分配为FIQ或IRQ(包括向量IRQ与非向量IRQ);通过VICVectCntlx(x=0,1,15)来选择32个中断请求中的某个为向量IRQ并设定此中断请求为IRQ slotx(x对应于VICVectCntlx中的x)。若某个中断源被设定为IRQ,但却未通过VICVectCntlx使能,则该中断源将被默认为非向量IRQ。 1.4中断处理过程中断处理过程如下所示: ?初始化:设置中断源为3种中断源之一,设置中断地址,使能中断,然后正常运行用户程序; ?当有IRQ中断产生时,VIC将会根据中断源设置VICVectAddr寄存器为相应中断服务程序的地址,切换处理器工作模式为IRQ模式,并跳转到IRQ中断入口0x00000018处; ?异常中断向量表中0x00000018处使用“LDR PC, PC, #-0xFF0”,使得程序跳转到(0x00000018+8-0x00000FF0=0xFFFFF030)存储器处保存的地址。0xFFFFF030是VICVectAddr寄存器地址。也即是说:通过该指令,程序跳转到VICVectAddr寄存器所指向的中断服务程序的地址; ?中断服务程序执行相应的中断处理,清除中断。建议用_irq关键字定义中断服务程序; ?中断服务完成后,即可返回原中断点。返回时要同时切换处理器工作模式。 注意:退出中断前,一定要对VICVectAddr寄存器写0,通知VIC中断结束;建议用_irq关键字定义中断服务程序,这样的话,该函数将自动切换处理器工作模式,但该函数不能返回参数或者数值。 1.5IRQ中断 IRQ中断有向量IRQ和非向量IRQ中断两种类型,当IRQ中断产生时: ?若是向量IRQ中断,由于之前VIC已经将最高优先级请求的IRQ服务程序地址VICVectAddrx(x=0,1,15)装入VICVectAddr,故程序跳入该中断服务程序继续执行。 ?若是非向量IRQ中断,VIC提供默认服务程序地址VICDefVectAddr,IRQ中断入口程序可通过读取VIC的向量地址寄存器VICVectAddr来取得该地址,然后跳转到相应服务程序继续执行。该默认服务程序由所有非向量IRQ公用,默认服务程序可读取IRQ状态寄存器以确定哪个IRQ被激活。 1.6关于外部中断 外部中断的设置除了与上述各种寄存器有关外,还与EXTINT、EXTWAKE、EXTMODE和EXTPOLAR等寄存器相关。 1.7举例 1. 初始化外部中断3(EINT3)为非向量中断,并设置为电平触发模式,然后等待外部中断。 PINSEL1 = 38; / 设置管脚连接,P0.20设置为EINT3 EXTMODE = 0x00; / 设置EINT3中断为电平触发模式 /* 打开EINT3中断(使用非向量IRQ) */ VICIntSelect = 0x00000000; / 设置所有中断分配为IRQ中断 VICDefVectAddr = (int)IRQ_Eint3; / 设置中断服务程序地址 EXTINT = 13; / 清除EINT3中断标志 VICIntEnable = 117; / 使能EINT3中断,EINT3在Bit17上 2. EINT3的中断服务子程序 void _irq IRQ_Eint3(void) /* 用户添加 */ /* 等待外部中断信号恢复为高电平(若信号保持为低电平,中断标志会一直置位) */ while( (EXTINT&13)!=0 ) EXTINT = 13; / 清除EINT3中断标志,13 等价于 0x08 VICVectAddr = 0; / 向量中断结束 LPC2000系列学习笔记10-Bootloader 对周立功公司开发板SmartARMLPC2210开发板Chenmingji写的Bootlaoder进行分析和解读。1.1 变(常)量声明首先声明堆栈大小SVC_STACK_LEGTHEQU0FIQ_STACK_LEGTHEQU0IRQ_STACK_LEGTHEQU256;IRQ中断堆栈ABT_STACK_LEGTHEQU0UND_STACK_LEGTHEQU0处理器模式声明NoIntEQU0x80USR32ModeEQU0x10SVC32ModeEQU0x13SYS32ModeEQU0x1fIRQ32ModeEQU0x12FIQ32ModeEQU0x11外部存储器配置声明PINSEL2EQU0xE002C014BCFG0EQU0xFFE00000BCFG1EQU0xFFE00004BCFG2EQU0xFFE00008BCFG3EQU0xFFE0000CIMPORT_use_no_semihosting_swiIMPORT_use_two_region_memory;引入的外部标号在这声明IMPORTFIQ_Exception;快速中断异常处理程序IMPORT_main; C语言主程序入口IMPORTTargetResetInit;目标板基本初始化;给外部使用的标号在这声明EXPORTbottom_of_heap;heap的底部EXPORTbottom_of_Stacks;stack的底部EXPORTtop_of_heap;heap的顶部EXPORTStackUsrEXPORTReset;复位EXPORT_user_initial_stackheap;用户初始化堆栈和堆1.2 建立中断向量表(向量表所有数据32位累加和为0)ResetLDRPC,ResetAddr;复位后开始的执行地址LDRPC,UndefinedAddr;未定义指令异常LDRPC,SWI_Addr;软件中断LDRPC,PrefetchAddr;预取中止LDRPC,DataAbortAddr;预取数据中止DCD0xb9205f80;保留的异常LDRPC,PC,#-0xff0;IRQ(该指令会读取VICVectAddr寄存器的值,然后放入PC指针)LDRPC,FIQ_Addr;FIQ;给每一个向量分配连续的字存储单元ResetAddrDCDResetInitUndefinedAddrDCDUndefinedSWI_AddrDCDSoftwareInterruptPrefetchAddrDCDPrefetchAbortDataAbortAddrDCDDataAbortNouseDCD0IRQ_AddrDCD0FIQ_AddrDCDFIQ_Handler;发生以下异常时程序暂停(除了FIQ);未定义指令UndefinedBUndefined;软中断SoftwareInterruptBSoftwareInterrupt;取指令中止PrefetchAbortBPrefetchAbort;取数据中止DataAbortBDataAbort;快速中断FIQ_HandlerSTMFDSP!,R0-R3,LR;把R0-R3,LR的值存入堆栈BLFIQ_Exception;跳转到FIQ中断程序LDMFDSP!,R0-R3,LR;恢复R0-R3,LR的值SUBSPC,LR,#4;PC指针跳转到LR-41.3 复位程序根据外部存储器控制器的引脚接法,对GPIO进行设置(外部存储器所接引脚与P1,P2,P3口的GPIO功能复用),之后对用到的四组存储器组进行设置.ResetInit;Initialextenalbuscontroller.;初始化外部总线控制器,根据目标板决定配置LDRR0,=PINSEL2IF:DEF:EN_CRPLDRR1,=0x0f814910;芯片加密,禁止JTAG调试ELSELDRR1,=0x0f814914;设置总线的I/O引脚ENDIFSTRR1,R0;设置四组存储器配置LDRR0,=BCFG0LDRR1,=0x1000ffefSTRR1,R0;设置外部第0个存储区LDRR0,=BCFG1LDRR1,=0x1000ffefSTRR1,R0;设置外部第1个存储区;LDRR0,=BCFG2;该开发板没有用到后面两组存储器接口;LDRR1,=0x2000ffef;STRR1,R0;设置外部第2个存储区;LDRR0,=BCFG3;LDRR1,=0x2000ffef;STRR1,R0;设置外部第3个存储区BLInitStack;初始化堆栈InitializethestackBLTargetResetInit;目标板基本初始化Initializethetargetboard;跳转到c语言入口JumptotheentrypointofCprogramB_main1.4 堆栈初始化初始化各模式堆栈InitStackMOVR0,LR;因芯片模式切换,故将程序返回地址保存到R0,同时在初始化堆栈完成后使用R0返回;BuildtheSVCstack;设置管理模式堆栈MSRCPSR_c,#0xd3LDRSP,StackSvc;BuildtheIRQstack;设置中断模式堆栈MSRCPSR_c,#0xd2LDRSP,StackIrq;BuildtheFIQstack;设置快速中断模式堆栈MSRCPSR_c,#0xd1LDRSP,StackFiq;BuildtheDATAABORTstack;设置中止模式堆栈MSRCPSR_c,#0xd7LDRSP,StackAbt;BuildtheUDFstack;设置未定义模式堆栈MSRCPSR_c,#0xdbLDRSP,StackUnd;BuildtheSYSstack;设置系统模式堆栈MSRCPSR_c,#0xdf;修改为0x5d将打开IRQ中断LDRSP,=StackUsrMOVPC,R0;子程序返回1.5 目标板初始化voidTargetResetInit(void)/设置存储器映射方式,这必须根据硬件来设置.这里是ADS1.2中的设置.#ifdef_DEBUGMEMMAP=0x3;/remap#endif#ifdef_OUT_CHIPMEMMAP=0x3;/remap#endif#ifdef_IN_CHIPMEMMAP=0x1;/remap,根据预定义的宏,设置存储器映射方式#endif/*设置系统各部分时钟*/PLLCON=1;使能PLL(锁相环),但不连接PLL#if(Fpclk/(Fcclk/4)=1VPBDIV=0;#endif#if(Fpclk/(Fcclk/4)=2VPBDIV=2;#endif#if(Fpclk/(Fcclk/4)=4VPBDIV=1;#endif/*设置外设时钟(VPB时钟pclk)与系统时钟(cclk)的分频比*/#if(Fcco/Fcclk)=2PLLCFG=(Fcclk/Fosc)-1)|(05);#endif#if(Fcco/Fcclk)=4PLLCFG=(Fcclk/Fosc)-1)|(15);#endif#if(Fcco/Fcclk)=8PLLCFG=(Fcclk/Fosc)-1)|(25);#endif#if(Fcco/Fcclk)=16PLLCFG=(Fcclk/Fosc)-1)|(35);#endif/*根据PLL的电流控制振荡器和系统时钟的频率比,设置PLL的乘因子和除因子*/PLLFEED=0xaa;PLLFEED=0x55;/*使用芯片要求的访问序列把数据写入PLL相关寄存器*/while(PLLSTAT&(110)=0);/*等待PL

温馨提示

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

评论

0/150

提交评论