接下来清除锁相环锁定中断,因为待会等待锁相环锁定时还需要判断这一中断。
HWREG(SYSCTL_MISC) = SYSCTL_INT_PLL_LOCK;
把变量中暂存的值写入实际寄存器:
if(ulRCC2 & SYSCTL_RCC2_USERCC2)
{
HWREG(SYSCTL_RCC2) = ulRCC2;
HWREG(SYSCTL_RCC) = ulRCC;
}
else
{
HWREG(SYSCTL_RCC) = ulRCC;
HWREG(SYSCTL_RCC2) = ulRCC2;
}
SysCtlDelay(16);
这里有个顺序,如果使用了RCC2,则需要先写RCC2再写RCC,否则先写RCC再写RCC2,我想估计是RCC2中的USERRCC2位需要抢先控制系统吧,目前还不很确定为什么这么做。
写入寄存器之后需要等待一段时间等待新的设定生效。
最后是有关锁相环分频系数和振荡源使能及其它一些的设置,由于前面新的时钟源已经运行起来了,所以这里不需要再注意顺序了,全部设置完成后一次性写入。
下面是关于锁相环分频系数及振荡源使能的设置,目前操作是在临时变量中进行的。
ulRCC &= ~(SYSCTL_RCC_SYSDIV_M | SYSCTL_RCC_USESYSDIV |
SYSCTL_RCC_IOSCDIS | SYSCTL_RCC_MOSCDIS);
ulRCC |= ulConfig & (SYSCTL_RCC_SYSDIV_M | SYSCTL_RCC_USESYSDIV |
SYSCTL_RCC_IOSCDIS | SYSCTL_RCC_MOSCDIS);
ulRCC2 &= ~(SYSCTL_RCC2_SYSDIV2_M);
ulRCC2 |= ulConfig & SYSCTL_RCC2_SYSDIV2_M;
如果使用了锁相环,则需要等待锁相环锁定后才能进行后面的操作:
if(!(ulConfig & SYSCTL_RCC_BYPASS))
{
for(ulDelay = 32768; ulDelay > 0; ulDelay--)
{
if(HWREG(SYSCTL_RIS) & SYSCTL_INT_PLL_LOCK)
{
break;//等待锁相环锁定
}
}
// 如果使用了锁相环,则需要将锁相环旁路位清零
ulRCC &= ~(SYSCTL_RCC_BYPASS);
ulRCC2 &= ~(SYSCTL_RCC2_BYPASS2);
}
HWREG(SYSCTL_RCC) = ulRCC;
HWREG(SYSCTL_RCC2) = ulRCC2;
SysCtlDelay(16);
最后将暂存变量中的值写入寄存器,短暂延时等待新设置生效,时钟设置就完成了!
注:程序中用到的宏DEVICE_IS_SANDSTORM及HWREG(x)在hw_types.h中定义。函数SysCtlDelay(x)就在文件sysctl.c中定义。 |