Fosc是外部晶振时钟;
Fcco是PLL倍频之后的时钟;
CCLK是PLL输出时钟,也是处理器的运行时钟;
PLL0 是处理器运行和UART0使用
PLL1是USB使用,要求必须48MHz,要求外部晶振时钟必须是12MHz,16MHz,24MHz
M、P的值是配置寄存器中的值加1;
2,PLL时钟配置新建工程之后,在启动文件cr_startup_lpc21.s 中,默认对PLL和外部设备时钟进行了配置
#ifdef PLL_INIT
.set PLL, SYSCTRL+0x40
.set PLLCON_OFFSET, 0x0
.set PLLCFG_OFFSET, 0x4
.set PLLSTAT_OFFSET, 0x8
.set PLLFEED_OFFSET, 0xC
.set PLOCK, (1<<10) //lock bit inside PLLSTAT
.set SET_PLLCFG_MUL3, 0x2
.set SET_PLLCFG_MUL4, 0x3
.set SET_PLLCFG_MUL5, 0x4
.set SET_PLLCFG_MUL6, 0x5
.set SET_PLLCFG_DIV1, (0x0<<4)
.set SET_PLLCFG_DIV2, (0x1<<4)
.set SET_PLLCFG_DIV4, (0x2<<4)
.set SET_PLLCFG_DIV8, (0x3<<4)
.set PLLCFG_INIT_VAL, SET_PLLCFG_MUL6 | SET_PLLCFG_DIV1
.set SET_PLLCON_ENABLE, 1
.set SET_PLLCON_CONNECT, 2
/*
* Setup the PLL
*/
LDR R0,=PLL
MOV R1,#0xAA
MOV R2,#0x55
MOV R3,#PLLCFG_INIT_VAL
STR R3,[R0,#PLLCFG_OFFSET]
MOV R3,#SET_PLLCON_ENABLE
STR R3,[R0,#PLLCON_OFFSET]
STR R1,[R0,#PLLFEED_OFFSET]
STR R2,[R0,#PLLFEED_OFFSET]
// Wait for the loop to lock
1: LDR R3,[R0,#PLLSTAT_OFFSET]
ANDS R3,R3,#PLOCK
BEQ 1b
// Now swap the cpu clock to the PLL
MOV R3,#(SET_PLLCON_ENABLE | SET_PLLCON_CONNECT)
STR R3,[R0,#PLLCON_OFFSET]
STR R1,[R0,#PLLFEED_OFFSET]
STR R2,[R0,#PLLFEED_OFFSET]
#endif
通过代码.set PLLCFG_INIT_VAL, SET_PLLCFG_MUL6 | SET_PLLCFG_DIV1
可以得知M = 6;P = 1;
CCLK = M * Fosc = 6 * 12 = 72MHz;
3,APB divider外设时钟(PCLK)配置APB分频器确定处理器时钟(CCLK)和外围设备使用的时钟(PCLK)之间的关系。
APB分隔符有两个目的。
首先是通过APB总线为外设提供所需的PCLK,以便它们能够以为ARM处理器选择的速度运行。
为了实现这一点,APB总线可以被减慢到处理器时钟速率的一半或四分之一。
因为APB总线必须在通电时正常工作(如果APB分频器控制寄存器驻留在APB总线上,它的时间不能改变),重置时的默认条件是APB总线以四分之一的速度运行。
APB分频器的第二个目的是,当应用程序不需要任何外围设备以全处理器速率运行时,允许节省电力。
APB分频器相对于振荡器和处理器时钟的连接如图12所示。
因为APB分隔符已连接到PLL输出,所以PLL在空闲模式下仍然保持活动状态(如果它正在运行)。
也就是说PCLK是由CCLK分频得到的,分频值由APBDIV确定。
00 处理器时钟四分之一; 01 与处理器时钟相同 10 处理器适中的一半; 11 保留,不影响;
在启动文件cr_startup_lpc21.s 中,默认配置如下
#ifdef VPB_INIT
/*
* Setup the VPB/APB Peripheral bus clock
*/
.set VPBDIV_OFFSET, 0xc0
.set VPBDIV, SYSCTRL+VPBDIV_OFFSET
.set VPBDIV_INIT_VAL, 1
LDR R0,=VPBDIV
LDR R1,=VPBDIV_INIT_VAL
STR R1,[R0]
#endif
由上文件可知APBDIV的值为1,与处理器时钟相同,即72MHz。
举例将CCLK设置为60MHz,PCLK设置为30MHz;修改cr_startup_lpc21.s中的内容
CCLK = M * Fosc = 5 * 12 = 60MHz;
PCLK = CCLK / 2 = 30MHz;
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)