LPC2148的时钟配置

LPC2148的时钟配置,第1张

1,时钟结构

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;

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/568666.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-09
下一篇 2022-04-09

发表评论

登录后才能评论

评论列表(0条)

保存