收藏 分销(赏)

LPC2000系列学习笔记.doc

上传人:仙人****88 文档编号:12012098 上传时间:2025-08-27 格式:DOC 页数:11 大小:80.04KB 下载积分:10 金币
下载 相关 举报
LPC2000系列学习笔记.doc_第1页
第1页 / 共11页
LPC2000系列学习笔记.doc_第2页
第2页 / 共11页


点击查看更多>>
资源描述
LPC2000系列学习笔记--目录 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         其它    18  LPC2000系列学习笔记2--时钟周期       对于LPC2000系列,如果从XTAL1脚输入占空比为50-50的时钟信号,则时钟频率在1~50MHz内;如果使用外部晶振,则仅支持1~30MHz的外部晶振;如果使用片内PLL系统或者引导程序(即ISP功能),输入时钟频率将被限制在10~25MHz。以上是对于晶振输出频率(Fosc)的限制。       除了晶振输出频率,LPC2000还有如下几种频率:        Fcco        PLL电流控制震荡器的频率,不需太过关注        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处于 156~320MHz        Fplck = Fcclk / (VPBDIV的值)    VPBDIV取值1,2,4      特别注意,PLL的操作顺序应该是:先将PLL激活并等待锁定,然后再将PLL连接。不要试图在掉电唤醒之后简单地执行馈送序列来重新启动PLL,因为这会在PLL锁定建立之前同时使能并连接PLL。      举例:设置系统时钟 /* 系统设置, Fosc、Fcclk、Fcco、Fpclk必须定义*/ #define    Fosc              11059200              //应当与实际晶振频率一致,10MHz~25MHz #define    Fcclk      (Fosc * 4)      //系统频率,必须为Fosc的整数倍(1~32),且<=60MHZ #define    Fcco              (Fcclk * 4)     //CCO频率,必须为Fcclk的2、4、8、16倍,范围为156MHz~320MHz #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 功能                        描述                         00      Boot装载程序模式  中断向量从Boot Block重新映射。一般情况下,即为地址0x7FFFE000 01      用户Flash模式       中断向量不重新映射,它位于Flash中。一般情况下,即为地址0x00000000 10     用户RAM模式        中断向量从静态RAM重新映射。一般情况下,即为地址0x40000000 11     用户外部存储器模式 中断向量从外部存储器重新映射。一般情况下,即为地址0x80000000        特别注意,不正确的设定会导致器件的错误操作。        例如,每当产生一个软件中断请求,ARM内核就从0x0000 0008处取出32位数据。这就意味着当MEMMAP[1:0]=10(用户RAM模式)时,从0x0000 0008的读数/取指是对0x4000 0008单元进行操作;当MEMMAP[1:0]=00(Boot装载程序模式)时,从0x0000 0008的读数/取指是对0x7FFF E008单元的数据进行操作(Boot Block从片内ROM存储器重新映射);如果MEMMAP[1:0]=11(用户外部存储器模式),从地址为0x8000 0008的片外存储器中读取数据。 4.2  BOOT管脚的功能        LPC22xx系列具有外部存储器接口,BOOT[1:0]脚的状态控制着引导方式,见下表。引脚悬空,内部上拉电阻保证其高电平状态。 BOOT1   BOOT1  引导方式                                            备注 0            0          CS0控制的8位存储器              MEMMAP[1:0]应设置为11 0            1          CS0控制的16位存储器            MEMMAP[1:0]应设置为11 1            0          CS0控制的32位存储器            MEMMAP[1:0]应设置为11 1            1          内部Flash存储器                    MEMMAP[1:0]应设置为01        注意:BOOT管脚和MEMMAP寄存器的设置应该根据硬件电路的具体情况进行设置。若从32位的外部存储器引导,则MEMMAP[1:0]应设置为11,BOOT管脚设置为10。        对于LPC21xx系列,没有外部存储器接口,只能设置MEMMAP[1:0]为01。        对于LPC2200,无片内Flash,故不能设置MEMMAP[1:0]为01。        当然,也可以将P0.14接地,强制芯片重启后(/RESET为低)进入ISP状态。   4.3举例:启动代码 #ifdef __DEBUG        MEMMAP = 0x3;           #endif               #ifdef __OUT_CHIP          MEMMAP = 0x3; #endif #ifdef __IN_CHIP        MEMMAP = 0x1;      #endif    LPC2000系列学习笔记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.5  IRQ中断       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 = 3<<8;                               // 设置管脚连接,P0.20设置为EINT3     EXTMODE = 0x00;                                         // 设置EINT3中断为电平触发模式     /* 打开EINT3中断(使用非向量IRQ) */     VICIntSelect = 0x00000000;               // 设置所有中断分配为IRQ中断     VICDefVectAddr = (int)IRQ_Eint3;             // 设置中断服务程序地址     EXTINT = 1<<3;                                      // 清除EINT3中断标志     VICIntEnable = 1<<17;                    // 使能EINT3中断,EINT3在Bit17上 2. EINT3的中断服务子程序 void   __irq IRQ_Eint3(void)   {  /* 用户添加 */     /* 等待外部中断信号恢复为高电平(若信号保持为低电平,中断标志会一直置位) */     while( (EXTINT&1<<3)!=0 )           {          EXTINT = 1<<3;          // 清除EINT3中断标志,1<<3 等价于 0x08     }    VICVectAddr = 0;                                // 向量中断结束 } LPC2000系列学习笔记10--Bootloader 对周立功公司开发板SmartARM LPC2210开发板Chenmingji写的Bootlaoder进行分析和解读。 1.1        变(常)量声明 首先声明堆栈大小 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  USR32Mode   EQU 0x10     SVC32Mode   EQU 0x13     SYS32Mode   EQU 0x1f     IRQ32Mode   EQU 0x12     FIQ32Mode   EQU 0x11   外部存储器配置声明     PINSEL2     EQU 0xE002C014   BCFG0       EQU 0xFFE00000     BCFG1       EQU 0xFFE00004      BCFG2       EQU 0xFFE00008     BCFG3       EQU 0xFFE0000C  IMPORT __use_no_semihosting_swi     IMPORT __use_two_region_memory   ;引入的外部标号在这声明     IMPORT  FIQ_Exception                   ;快速中断异常处理程序     IMPORT  __main                          ; C语言主程序入口      IMPORT  TargetResetInit                 ;目标板基本初始化 ;给外部使用的标号在这声明     EXPORT  bottom_of_heap                  ;heap的底部     EXPORT  bottom_of_Stacks                ;stack的底部     EXPORT  top_of_heap                     ;heap的顶部     EXPORT  StackUsr                                  EXPORT  Reset                           ;复位     EXPORT __user_initial_stackheap         ;用户初始化堆栈和堆   1.2        建立中断向量表(向量表所有数据32位累加和为0)  Reset         LDR     PC, ResetAddr               ;复位后开始的执行地址         LDR     PC, UndefinedAddr           ;未定义指令异常                    LDR     PC, SWI_Addr                ;软件中断         LDR     PC, PrefetchAddr            ;预取中止         LDR     PC, DataAbortAddr           ;预取数据中止         DCD     0xb9205f80                  ;保留的异常         LDR     PC, [PC, #-0xff0]           ;IRQ ( 该指令会读取VICVectAddr寄存器的值,然后放入PC指针 )         LDR     PC, FIQ_Addr                ;FIQ     ;给每一个向量分配连续的字存储单元     ResetAddr           DCD     ResetInit     UndefinedAddr       DCD     Undefined     SWI_Addr            DCD     SoftwareInterrupt     PrefetchAddr        DCD     PrefetchAbort     DataAbortAddr       DCD     DataAbort     Nouse               DCD     0     IRQ_Addr            DCD     0     FIQ_Addr            DCD     FIQ_Handler     ;发生以下异常时程序暂停( 除了FIQ )     ;未定义指令     Undefined             B       Undefined     ;软中断     SoftwareInterrupt                B       SoftwareInterrupt      ;取指令中止     PrefetchAbort             B       PrefetchAbort     ;取数据中止     DataAbort             B       DataAbort     ;快速中断     FIQ_Handler             STMFD   SP!, {R0-R3, LR}            ;把R0-R3,LR的值存入堆栈             BL      FIQ_Exception               ;跳转到FIQ中断程序             LDMFD   SP!, {R0-R3, LR}            ;恢复R0-R3,LR的值             SUBS    PC,  LR,  #4                ;PC指针跳转到LR-4   1.3        复位程序     根据外部存储器控制器的引脚接法,对GPIO进行设置(外部存储器所接引脚与P1,P2,P3口的GPIO功能复用),之后对用到的四组存储器组进行设置.     ResetInit     ;Initial extenal bus controller.     ;初始化外部总线控制器,根据目标板决定配置             LDR     R0, =PINSEL2         IF :DEF: EN_CRP             LDR     R1, =0x0f814910   ;芯片加密,禁止JTAG调试         ELSE             LDR     R1, =0x0f814914   ;设置总线的I/O引脚         ENDIF             STR     R1, [R0]     ;设置四组存储器配置             LDR     R0, =BCFG0             LDR     R1, =0x1000ffef             STR     R1, [R0]                 ;设置外部第0个存储区             LDR     R0, =BCFG1             LDR     R1, =0x1000ffef             STR     R1, [R0]                 ;设置外部第1个存储区     ;        LDR     R0, =BCFG2              ;该开发板没有用到后面两组存储器接口       ;        LDR     R1, =0x2000ffef     ;        STR     R1, [R0]                ;设置外部第2个存储区     ;        LDR     R0, =BCFG3     ;        LDR     R1, =0x2000ffef     ;        STR     R1, [R0]                ;设置外部第3个存储区             BL      InitStack               ;初始化堆栈 Initialize the stack             BL      TargetResetInit         ;目标板基本初始化 Initialize the target board                                             ;跳转到c语言入口 Jump to the entry point of C program         B       __main   1.4        堆栈初始化     初始化各模式堆栈 InitStack             MOV     R0, LR;因芯片模式切换,故将程序返回地址保存到R0,同时在初始化堆栈完成后使用R0返回 ;Build the SVC stack ;设置管理模式堆栈         MSR     CPSR_c, #0xd3           LDR     SP, StackSvc ;Build the IRQ stack    ;设置中断模式堆栈         MSR     CPSR_c, #0xd2         LDR     SP, StackIrq ;Build the FIQ stack ;设置快速中断模式堆栈         MSR     CPSR_c, #0xd1         LDR     SP, StackFiq ;Build the DATAABORT stack ;设置中止模式堆栈         MSR     CPSR_c, #0xd7         LDR     SP, StackAbt ;Build the UDF stack ;设置未定义模式堆栈         MSR     CPSR_c, #0xdb         LDR     SP, StackUnd ;Build the SYS stack ;设置系统模式堆栈         MSR     CPSR_c, #0xdf             ;修改为0x5d将打开IRQ中断         LDR     SP, =StackUsr         MOV     PC, R0                    ;子程序返回   1.5        目标板初始化         void TargetResetInit(void) { // 设置存储器映射方式,这必须根据硬件来设置. 这里是ADS1.2中的设置. #ifdef __DEBUG         MEMMAP = 0x3;                   //remap #endif #ifdef __OUT_CHIP         MEMMAP = 0x3;                   //remap #endif #ifdef __IN_CHIP         MEMMAP = 0x1;                   //remap,根据预定义的宏,设置存储器映射方式 #endif /* 设置系统各部分时钟 */     PLLCON = 1;                    ;使能PLL(锁相环),但不连接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                          /*设置外设时钟(VPB时钟pclk)与系统时钟(cclk)的分频比*/ #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              /*根据PLL的电流控制振荡器和系统时钟的频率比,设置PLL的乘因子和除因子*/     PLLFEED = 0xaa;     PLLFEED = 0x55;     /*使用芯片要求的访问序列把数据写入PLL相关寄存器*/     while((PLLSTAT & (1 << 10)) == 0);    /*等待PLL跟踪完成*/     PLLCON = 3;                                // 按照特定的设置方式对PLL控制寄存器进行设置     PLLFEED = 0xaa;     PLLFEED = 0x55;                    /*使PLL连上系统*/          /* 设置存储器加速模块 */     MAMCR = 0;                         /*关闭MAM*/ #if Fcclk < 20000000     MAMTIM = 1; #else #if Fcclk < 40000000     MAMTIM = 2; #else     MAMTIM = 3;                      /*根据Fcclk的大小来设置MAM定时寄存器*/ #endif #endif     MAMCR = 2;                          /*使能MAM*/          /* 初始化VIC */     /* initialize VIC*/     VICIntEnClr = 0xffffffff;           ;禁止所有中断     VICVectAddr = 0;                    ;设置向量地址寄存器(VICVectAddr)的值为0     VICIntSelect = 0;                   ;将所有中断设置为IRQ中断 }   1.6        其它 ;/********************************************************************************************************* ;** unction name  函数名称:  __user_initial_stackheap ;** Descriptions  功能描述:  Initial the function library stacks and heaps, can not deleted!    ;**                                     库函数初始化堆和栈,不能删除 ;** input parameters  输 入:    reference by function library 参考库函数手册 ;** Returned value    输 出 :   reference by function library 参考库函数手册 ;** Used global variables 全局变量:  None 无 ;** Calling modules  调用模块:  None 无 ;********************************************************************************************************/ __user_initial_stackheap         LDR   r0,=bottom_of_heap ;    LDR   r1,=StackUsr     LDR   r2,=top_of_heap     LDR   r3,=bottom_of_Stacks     MOV   pc,lr StackSvc           DCD     SvcStackSpace + (SVC_STACK_LEGTH - 1)* 4 StackIrq           DCD     IrqStackSpace + (IRQ_STACK_LEGTH - 1)* 4 StackFiq           DCD     FiqStackSpace + (FIQ_STACK_LEGTH - 1)* 4 StackAbt           DCD     AbtStackSpace + (ABT_STACK_LEGTH - 1)* 4 StackUnd           DCD     UndtStackSpace + (UND_STACK_LEGTH - 1)* 4 ;/********************************************************************************************************* ;** unction name  函数名称:  CrpData ;** Descriptions  功能描述:  encrypt the chip ;** input parameters  输 入:    None 无 ;** Returned value
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服