用的片子是lpc2365,在做掉电唤醒的工作,用外部中断2(只唤醒,不产生中断),按照zlg的模板,重新使能配置pll。但是总是在唤醒后复位,查了好多资料,还是不明白。下面是我的代码,请大家指教: Delay(10000); AD0CR = 0x00; PCONP = 0x00; PCON = 0x02;
OS_ENTER_CRITICAL(); Delay(10000); EXTINT = BIT(1) | BIT(2) |BIT(3); PLLinit(); OS_EXIT_CRITICAL();
while(1) { UART0Write((uint8*)"step2",5); OSTimeDly(OS_TICKS_PER_SEC); //??? }
其中PLLinit()函数是直接从周立功的程序上找的。
void PLLinit(void) { SCS = (SCS & 0x04) | 0x20; // 使能主振荡器,1MHz~20MHz while ((SCS & 0x40) == 0 ); // 等待主振荡器可用 if (PLLSTAT & (1 << 25)) // 如果PLL连接 { PLLCON = 0x01; PLLFEED = 0xAA; // 断开连接 PLLFEED = 0x55; PLLCON = 0x00; PLLFEED = 0xAA; // 不使能PLL PLLFEED = 0x55; } else if (PLLSTAT & (1 << 24)) // 如果PLL使能 // 如果PLL已被使能,则先禁止PLL { PLLCON = 0x00; PLLFEED = 0xAA; // 不使能PLL PLLFEED = 0x55; } CLKSRCSEL = 0x01; // 选择主振荡器作为PLL输入时钟源 PLLCON = 1; // 使能但不连接PLL PLLCFG = (((PLL_NValue - 1) << 16) | (PLL_MValue - 1) ); // 设置N、M值 PLLFEED = 0xAA; // 使能PLL PLLFEED = 0x55; while (((PLLSTAT & (1 << 24)) == 0));// 等待PLL可用 CCLKCFG = (Fcco / Fcclk - 1); // 用于防止CPU工作频率过大 PLLCON = 3; // 连接PLL PLLFEED = 0xAA; PLLFEED = 0x55; while (((PLLSTAT & (3 << 25)) != (3 << 25)));// 等待PLL连接好 } |