使用官方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通过串口,烧录程序之后才可以恢复。