|
// SYSCLK REGS
#define SYSCLK_PWRCON (*(volatile uint32_t *)(CLK_BA + 0x00))
#define SYSCLK_AHBCLK (*(volatile uint32_t *)(CLK_BA + 0x04))
#define SYSCLK_APBCLK (*(volatile uint32_t *)(CLK_BA + 0x08))
#define SYSCLK_CLKSTATUS (*(volatile uint32_t *)(CLK_BA + 0x0C))
#define SYSCLK_CLKSEL0 (*(volatile uint32_t *)(CLK_BA + 0x10))
#define SYSCLK_CLKSEL1 (*(volatile uint32_t *)(CLK_BA + 0x14))
#define SYSCLK_CLKSEL2 (*(volatile uint32_t *)(CLK_BA + 0x1C))
#define SYSCLK_CLKDIV (*(volatile uint32_t *)(CLK_BA + 0x18))
#define SYSCLK_PLLCON (*(volatile uint32_t *)(CLK_BA + 0x20))
#define SYSCLK_FRQDIV (*(volatile uint32_t *)(CLK_BA + 0x24))
#define unlock_reg() REGWRPROT=0x59;\
REGWRPROT=0x16;\
REGWRPROT = 0x88
#define lock_reg() REGWRPROT = 0x00
#define XTAL12M 0x0001
#define OSC22M 0x0004
#define OSC10K 0x0010
#define ClkSrc_XTAL12M 0x00
#define ClkSrc_PLL 0x02
#define ClkSrc_OSC10K 0x03
#define ClkSrc_OSC22M 0x07
#define PLL_enable() SYSCLK_PLLCON &= 0xFFFAFFFF
#define PLL_disable() SYSCLK_PLLCON |= 0x00050000
#define PLL_SRC_XTAL12M() SYSCLK_PLLCON |= 0x00080000
#define PLL_SRC_OSC22M() SYSCLK_PLLCON &= 0xFFF7FFFF
void sys_clk_init(void)
{
unlock_reg(); // 解锁寄存器
SYSCLK_PWRCON |= XTAL12M; // OSC22M // OSC10K
while((SYSCLK_CLKSTATUS & XTAL12M) == 0 ); //等待外部晶体稳定
PLL_SRC_XTAL12M(); // PLL时钟源为外部12M晶体
SYSCLK_PLLCON &= 0xFFFF0000; // 默认值
SYSCLK_PLLCON |= 0x0000C22E;
PLL_enable();
while((SYSCLK_CLKSTATUS & 0x0004) == 0 );//等待PLL稳定
SYSCLK_CLKSEL0 &= 0x38; // 切换到XTAL12M
SYSCLK_CLKSEL0 |= ClkSrc_PLL; // 切换到PLL时钟
SYSCLK_CLKDIV |= 0x00; //Divider=0, HCLK频率=源频率(SYSCLK_CLKSEL0)/(Divider+1)
lock_reg(); // 锁定寄存器
}
以上这段程序设定的PLL时钟竟然是66M的,因为作为UART时钟时和作为TIMER0时钟时,如果按66M进行计算就是比较准确的。曾怀疑计算公式问题,作使用外部12M时钟或者内部22.1184时钟时按公式计算出来的与实际的相符,有没高手遇到过此问题,或者此程序哪里出了问题,请各位高手拍砖,谢谢! |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|