Chinaunix首页 | 论坛 | 博客
  • 博客访问: 276751
  • 博文数量: 60
  • 博客积分: 2501
  • 博客等级: 少校
  • 技术积分: 774
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-16 13:27
文章分类

全部博文(60)

文章存档

2011年(1)

2010年(1)

2009年(58)

我的朋友

分类: 嵌入式

2009-07-23 21:21:06

                                         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.0TXD0  PINSEL0 = (PINSEL0&0xfffffffc)|(0x01)

P0.0GPIO  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.1p0.16 INT0; 管脚 p0.3p0.14 INT1;

管脚 p0.7p0.15 INT2; 管脚 p0.9p0.20p0.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;      // 进入节电状态
 
阅读(5551) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~