原创 ARM系统时钟设置

2007-10-25 15:17 6347 5 5 分类: MCU/ 嵌入式

/* 系统设置, 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 ~ 4 倍
通常只需要设置Fosc 即可。需要更改Fcclk 和Fcco 时,参照注释。


倍频和分频的计算计算顺序:
1) 先根据系统需要的频率选择Fosc,必须10-25MHZ.(假定Fosc=10MHZ)
2) 根据需要的系统频率Fcclk,选择倍频系数M,M = Fcclk/Fosc(假定Fcclk=40MHZ,则M=4).
3) M 的值为PLLCFG bits 4:0.(PLLCFG 的低5 位为二进制00100)
4) 根据Fcclk 的频率选择Fcco. Fcco = cclk * 2 * P,则进行下列计算
Fcco 最小/Fcclk=156/40=3.9,因此2*P 的值必须大于3.9,最接近的值为4.
此时P=4/2=2。由于2 的PLLCFG bits 6:5 次方等于P,因此PLLCFG bits 6:5 为二进制00.


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)
{
Wait; //等待,一直到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) 恢复原来的中断寄存器状态


参考资料:“周立功LPC2200启动代码分析”

文章评论0条评论)

登录后参与讨论
我要评论
0
5
关闭 站长推荐上一条 /2 下一条