LPC2148的系统时钟配置II

使用官方LPCXpresso IDE ,可以参考的资料实在太少了, 调试串口通信,两天了不成功,没想到IDE自动生成的启动文件cr_startup_lpc21.s 有BUG,在这里做个记录吧,避免以后再遇到,也给后来人提个醒。

        UART0的波特率配置依赖PCLK,PCLK 又依赖CCLK,所以要先设置系统时钟,在启动文件里有相关设置,官方IDE自动生成的部分代码如下:

start:
_mainCRTStartup:

		.set	SYSCTRL,			0xE01FC040

#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



#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
		

这里一定一定要注意两点!!!!!!!!

1,#ifdef PLL_INIT      #ifdef VPB_INIT   系统是没有定义的,所以在这里你改了配置也是无效,先宏定义一下,或则删除 这个预编译,才能让这段代码执行。

2,更让人无语的是里面有个BUG

		.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	SET_PLLCFG_DIV1,	(0x0<<5)
		.set	SET_PLLCFG_DIV2,	(0x1<<5)
		.set	SET_PLLCFG_DIV4,	(0x2<<5)
		.set	SET_PLLCFG_DIV8,	(0x3<<5)

因为移位错误,导致M的太大,处理器去执行这部分代码时,就会跑飞,导致功耗大大增加,而且不能再用IDE进行debug调试了,没办法只能用FlashMagic通过串口,烧录程序之后才可以恢复

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值