2009-7-23
1 引脚控制
PINSEL0-0xE002C000-0x00000000(复位时默认为GPIO);
PINSEL1-0xE002C004-0x15400000(复位时,P0.27-30为AIN0-3);
PINSEL2-0xE002C014
复位时 地址线引脚功能的选择由BOOT[1:0]决定;
P2.31为AIN5;P2.30为AIN4;P3.28为AIN7;P3.29为AIN6;
不使能CS1 CS2 CS3 WE ;
是否使能跟踪端口由P1.20决定,是否使能调试端口由 P1.26决定。
配置一个引脚举例
P0.0为TXD0 PINSEL0 = (PINSEL0&0xfffffffc)|(0x01);
P0.0为GPIO PINSEL0 = (PINSEL0&0xfffffffc);
P0.0输出高 1
PINSEL0 = (PINSEL0&0xfffffffc); (先要配置为输出模式)
IO0DIR = IO0DIR|0x00000001; (写入1,输出,写入0,输入)
IO0SET = 0x00000001; (写入1,输出1,写入0,无效)
P0.0输出低 0
PINSEL0 = PINSEL0&0xfffffffc;
IO0DIR = IO0DIR|0x00000001;
IO0CLR = 0x00000001; (写入1,输出0,写入0,无效)
读取一个引脚的值
bak = IO0PIN; (基本上很少用到)
2存储器映射控制
存储器映射控制用于改变从地址0x00000000开始的中断向量的映射,这就允许了运行在不同存储器空间的代码对中断进行控制。
MEMMAP-0xE01FC040-0x00000000
MAP[1:0]
00时:Boot装载程序模式(0x7FFFE000-0x7FFFE03C),中断向量重新映射;
01时;用户FLASH模式(0x00000000-0x0000003C),中断向量不重新映射;
10时:用户RAM模式(0x40000000-0x4000003C),中断向量从静态RAM映射;
11时:用户外部存储器模式(0x80000000-0x8000003C),中断向量从外部存储器映射。
芯片复位时,MEMMAP=0,启动Boot,Boot检测P0.14口,判断是否进入ISP还是启动用户程序,若启动用户程序,则自动MEMMAP=1。若用户程序需要随时更改异常向量表,可以将异常向量表(64字节)复制到片内RAM的0x40000000上,然后设置MEMMAP=2进行重新映射,0x40000000上的向量表就可以更改。
程序清单如下:
...
uint8 i;
uint32 *cp1,*cp2;
extern void Reset(void);
cp1=(uint32)Reset;
cp2=uint32 * 0x40000000;
for(i=0;i<16;i++){*cp2++=*cp1++;}
MEMMAP = 2;
...
3外部中断控制与向量中断控制器
管脚 p0.1和p0.16 INT0; 管脚 p0.3和p0.14 INT1;
管脚 p0.7和p0.15 INT2; 管脚 p0.9,p0.20和p0.30 INT3;
外部中断标志寄存器EXTINT(0xE01FC140,复位时,无中断标志) ,对某位写入1(电平触发方式下,引脚无效时,该操作才有效),清除该位对应的中断号的中断标志;
外部中断唤醒寄存器EXTWAKEUP(0xE01FC144,复位时,不唤醒),对某位写入1,该中断可唤醒处理器;
外部中断方式寄存器EXTMODE (0xE01FC148,复位时,电平触发方式)和 外部中断极性寄存器EXTPOLAR (0xE01FC14C,复位时,低电平有效)
EXTMODE[0] + EXTPOLAR[0]位
00时,低电平有效(此时,如果有多个引脚为EINT0功能,则相“与”);
01时,高电平有效(此时,如果有多个引脚为EINT0功能,则相“或”);
10时,下降沿触发(此时,如果有多个引脚为EINT0功能,则选端口号最低的引脚);
11时,上升沿触发(此时,如果有多个引脚为EINT0功能,则选端口号最低的引脚)。
多个引脚选为同一INT功能是,可通过IO0PIN和IO1PIN的值来判断产生该中断的引脚!
外部中断程序示例:
1初始化EINT0为低电平中断 引脚p0.16
PINSEL1 = (PINSEL1&0xfffffffc)|0x01; (P0.16选择INT功能)
EXTMODE = EXTMODE & 0X0E;
EXTPOLAR = EXTPOLAR & 0X0E;
2初始化EINT0为下降沿触发 引脚P0.16
PINSEL1 = (PINSEL1 & 0xfffffffc)|0x01;
EXTMODE = EXTMODE | 0x01;
EXTPOLAR = EXTPOLAR & 0x0E;
3 清除INT0中断标志
EXTINT = EXTINT | 0X01;
向量中断控制器(VIC)
VIC具有32个中断请求输入,16个向量IRQ中断,16个优先级(可动态分配),可产生软中断。
(1)快速中断请求(FIQ)具有最高的优先级。当只有一个中断被分配为FIQ中断时,可实现最短的FIQ等待时间;如果请求多于1个,VIC将中断请求相“或”,向ARM产生FIQ信号;
(2)向量IRQ具有slot0-slot15(最低的优先级)共16个优先级,32个请求中可分配16,它的中断优先级只是在同时产生多个中断时,VIC会将最高优先级请求的IRQ服务程序地址存入向量地址寄存器(VICVectAddr);
(3)非向量IRQ的优先级最低,且如果分配给它的中断多于1个,默认中断服务程序要从VIC中读取IRQ状态寄存器来识别产生中断请求的IRQ中断源是哪一个。
VIC将IRQ+非向量IRQ中断 相“或”,来产生IRQ信号。IRQ发出请求时,VIC提供 IRQ服务程序的地址,即VICVectAddr里的值。
VICSoftInt -0xFFFFF018-0 软件中断寄存器
写入1,强制产生与该位相关的中断
VICSoftIntClear-0xFFFFF01C-0 软件中断清零寄存器
写入1,强制清除软件中断寄存器的相应位,并强制解除中断 (只写)
VICRawIntr -0xFFFFF008-0 所有中断的状态寄存器,不管是否使能
某位为1,表示对应位的中断请求或软件中断声明 (只读)
VICIntEnable-0xFFFFF010-0 中断使能寄存器
写入1,使能中断请求或软件中断,写入0,无效。读该寄存器,为1时,表示IRQ或FIQ。
VICIntEnClr -0xFFFFF014-0 中断使能清零寄存器
写入1,清零中断使能寄存器中的对应位,并清除中断请求;写入0,无效(只写)
VICIntSelect-0xFFFFF00C-0 中断选择寄存器,分配为FIQ或IRQ
1,对应的中断分配为FIQ,0,对应的中断分配为IRQ;(读写)
VICIRQStatus-0xFFFFF000-0 IRQ状态寄存器,读出使能的IRQ的状态
1 对应的中断请求使能,并分配为 IRQ。(只读)
VICFIQStatus-0xFFFFF004-0 FIQ状态寄存器,读出使能的FIQ的状态
1 对应的中断请求使能,并分配为 FIQ。(只读)
VICVectCntl0 -0xFFFFF200-0 向量控制0寄存器
... ... ...
VICVectCntl15 -0xFFFFF23C-0 向量控制15寄存器
在VICVectCnt中禁止一个向量IRQ不会禁止中断本身,只是中断变为了非向量的形式;
bit5 为1,向量IRQ使能,当分配的中断请求或软件中断使能,被分配为IRQ并声明时,可产生一个唯一的ISR地址(读VICVectAddr寄存器)
bit4-0,分配给此向量IRQslot的中断请求或软件中断的编号。 (读写)
VICVectAddr0 -0xFFFFF100-0 向量地址0寄存器
... ... ...
VICVectAddr15 -0xFFFFF13C-0 向量地址15寄存器
16个向量IRQsolt中断服务程序地址。(读写)
VICDefVectAddr -0xFFFFF034-0 默认向量地址寄存器
当一个IRQ服务程序读取向量地址寄存器,并且没有IRQ响应时,则返回该寄存器的地址。 (读写)
VICVectAddr -0xFFFFF030-0 向量地址寄存器
当发生一个IRQ中断时,VIC会将对应的IRQ服务程序地址存入该寄存器,IRQ中断入口处的程序可读取该寄存器并跳转到读出的地址,执行相应的
中断服务程序。
注意:该寄存器应该在ISR快结束时执行一次写操作(写入的值一般为0),以便更新优先级硬件。
VICProtection -0xFFFFF020-0 保护使能寄存器
bit0 为1,VIC只能在特权模式下访问,为0,可以在用户或特权模式下访问。
中断源
0 WDT 1 保留给软件中断 2 ARM内核 3 ARM内核 4 定时器0 5 定时器1
6 UART0 7 UART1 8 PWM0 9 I2C 10 SPI0 11 SPI1
12 PLL 13 RTC 14 EINT0 15 EINT1 16 EINT2 17 EINT3 18 AD
程序代码示例:
(1)向量非向量IRQ中断初始化
VICIntSelect = 0x00004000; //设置EINT0 bit 14 FIQ中断;其他 IRQ中断
VICVectCntl0 = 0x20|15; //设置EINT1 bit 15 向量IRQ中断,slot 0
VICVectAddr0 = (uint32) Eint_IRQ; //设置EINT1中断服务程序入口地址
VICDefVectAddr = (uint32) Eint2_IRQ; //设置非向量IRQ中断服务程序的入口地址
VICIntEnable = 0x0001c000; //使能EINT0,EINT1,EINT2
(2)中断服务程序
void _irq Eint1_IRQ(void)
{
...
EXTINT = 0X02; //清 EXINT1 中断标志
VICVectAddr = 0; //向量中断结束
}
(3)VIC产生软中断初始化
VICIntSelect = 0x00000000; //设置所有中断均为IRQ中断
VICVectCntl15 = 0x20|31; //通道号31分配到slot15
VICVectAddr15 = (uint32) Soft_IRQ; //设置VIC软件中断服务程序入口地址
VICIntEnable = 1<<31; //使能
4PLL控制与VPB控制
PLL的激活由PLLCON控制,PLL倍频器与分频器的值由PLLCFG寄存器控制。在芯片复位和进入掉电模式时,PLL被关闭并旁路。所以PLL只能通过软件使能。程序必须在配置并激活PLL后,等待其锁定,然后再连接PPL。
PLLCON -0xE01FC080 PLL控制寄存器
bit0 PLLE PLL使能,该位为1,激活PLL
bit1 PLLC PLL连接,该位为1 和 PLLE为1时,连接PLL;
bit 7-2 保留
写入该寄存器的值在有效的PLL馈送序列执行之前不起作用;
PLLCFG -0xE01FC084 PLL配置寄存器
bit 4-0 倍频值M bit 6-5 分频值 P bit 7 保留
写入该寄存器的值在有效的PLL馈送序列执行之前不起作用;
PLLSTAT-0xE01FC088 PLL状态寄存器 (RO)
bit4-0 当前M bit6-5 当前P bit7 保留 bit8 PLLE
bit9 PLLC bit10 PLOCK 为1 表示锁定 bit15-11 保留
PLLFEED-0xE01FC08C PLL馈送寄存器 (WO)
正确的馈送序列 正确连续写入 0XAA 0X55到PLLFEED
先看看LPC21XX LPC22XX系统时钟频率的计算
#define Fosc 11059200
//晶振频率,10MHz~25MHz,PLL接受的时钟频率范围,应当与实际一至
#define Fcclk (Fosc * 4)
//系统频率,必须为 Fosc的整数倍(1~32),实际上,倍频值M不能超过6,且Fcclk<=60MHZ.
//假定 Fcclk=40MHZ,则 M=4
#define Fcco (Fcclk * 4)
//CCO频率, 必须为Fcclk的2、4、8、 16倍,这个倍值为P,范围156MHz~320MHz
//Fcco最小/Fcclk=156/40=3.9,因此 2*P 的值必须大于 3.9,最接近的值为 4.
#define Fpclk (Fcclk / 4) * 1
//VPB时钟频率,只能为(Fcclk / 4)的 1 ~ 4倍
VPB分频器
VPB分频器决定Fcclk与Fpclk(外设器件所用的时钟之间的关系)。复位后,默认是以1/4速度运行。
VPB分频器的作用(1)设外设在合适的速度下工作;(2)在不需要任何外设情况下,降低功耗。
VPBDIV -0xE01FC100-0
bit1-0 VPBDIV 00:1/4,01:1,10:1/2,11:与原来相同。
bit3-2 保留
bit5-4 XCLKDIV 用于2210 2212 2214中,具体内容请看手册。
bit7-6 保留
程序示例:
1 PLL 初始化过程:
1) 写 PLLCFG和 PLLCON:启动 PLL,但是不连接 PLL到系统内核。
PLLCON = 0x01 //PLLE = 1,PLLC = 0
PLLCFG = 0x04 //假定 Fosc=10MHZ,Fcclk=40MHZ计算
2) 保存中断寄存器,关中断
3) 连续写 PLLSEED(必须连续,不能被中断)
PLLSEED = 0xAA
PLLSEED = 0x55
4) 查询 PLLSTAT一直到 PLOCK=1
While((PLLSTART & 0x40) == 0);//等待,一直到 PLOCK=1
5) 写 PLLCFG和 PLLCON:启动 PLL,连接 PLL到系统内核。
PLLCON = 0x03 //PLLE = 1,PLLC = 1
PLLCFG = 0x04 //假定 Fosc=10MHZ,Fcclk=40MHZ计算
6) 连续写 PLLSEED(必须连续,不能被中断)
PLLSEED = 0xAA
PLLSEED = 0x55
7) 查询 PLLSTAT,等待 PLOCK=1,PLLE=1,PLLC=1,MSEL4:1和 PSEL1:0(PLLSTAT的位 6-5)
看是否完全符合,如果符合执行下一步,不符合报错。
8) 恢复原来的中断寄存器状态
2VPBDIV的值
if( Fpclk == Fcclk)
{
VPBDIV = 1;
}
else if( (Fpclk<<1) == Fcclk)
{
VPBDIV = 2;
}
else if( (Fpclk<<2) == Fcclk)
{
VPBDIV = 0;
}
功率控制
LPC21XXLPC22XX有两种节电模式。
(1)空闲模式,系统CCLK一直有效,指令被挂起,外设功能保存,并可产生中断使处理器恢复运行。该模式可使处理器,存储区系统,相关控制器以及内部总线不再消耗功率。
(2)掉电模式,振荡器关闭,没有任何内部时钟,处理器状态和寄存器,外设寄存器以及内部SRAM在掉电模式下保持,引脚的逻辑电平保持静态。复位或特定的不需要时钟仍能工作的中断可以终止掉电模式,是芯片恢复正常运行。
PCON -0xE01FC0C0-0 功率控制寄存器
bit0 IDL 该位置位,进入空闲模式 bit1 PD 该位置位,进入掉电模式
PCONP -0xE01FC0C4-0 外设功率控制寄存器
看门狗定时器,GPIO,引脚连接模块和系统控制模块 不能被关闭。
LPC2210/2212/2214
bit0 保留
bit1 PCTIM0 为1 定时器0使能,为0 关闭;复位时为1
bit2 PCTIM1 为1 定时器1使能,为0 关闭;复位时为1
bit3 PCUART0 为1 UART0使能, 为0 关闭;复位时为1
bit4 PCUART1 为1 UART1使能, 为0 关闭;复位时为1
bit5 PCPWM0 为1 PWM0使能, 为0 关闭;复位时为1
bit6 保留
bit7 PCI2C 为1 I2C接口使能,为0 关闭;复位时为1
bit8 PCSPI0 为1 SPI0使能, 为0 关闭;复位时为1
bit9 PCRTC 为1 RTC使能, 为0 关闭;复位时为1
bit10 PCSPI1 为1 SPI1使能, 为0 关闭;复位时为1
bit11 PCEMC 为1 EMC使能, 为0 关闭;复位时为1
bit12 PCAD 为1 A/D使能, 为0 关闭;复位时为1
bit13-31保留
程序示例:
PCONP = 0x0802;// 除定时器和外围存储器,其他外设都关闭
PCON = 1; // 进入节电状态