本帖最后由 ilikedota 于 2015-5-20 20:25 编辑
在LPC23xx的用户手册中关于芯片时钟以及外设时钟有以下几个寄存器可以设置,时钟源选择寄存器CLKSRCSEL,外设时钟选择寄存器PCLKSEL0、PCLKSEL1,主晶振使能OSCEN控制位、主振荡器范围选择控制位OSCRANGE以及PLL相关的设置寄存器。
我在验证某个功能时,不得不先先写个定时器的程序,定时1s,当时我对上述这些关于影响时钟的设置寄存器和设置位都不清楚,于是写了下面的程序:
int main(void)
{
LED_init( ); //初始化LED,其实就是配置IO口
T0MR0 = 110592; //匹配值,我的晶振是11.0592MHz
T0MCR = 3;
T0PR = 99; //100分频
VIC_init(); //VIC里面只设置了定时器
}
程序烧到板子上,运行正常,LED灯每1秒闪烁一次。
但是我后来发现,在LPC23XX的用户手册里有如下说明:
“复位后,LPC2300将从内部RC振荡器开始操作,直至由软件切换。这允许系统在没有外部晶体的情况下操作,并使Boot Loader代码可以在一个已知的频率下运行。当Boot Block准备跳转到一个用户程序时,可能有一个选项激活主振荡器,然后再进入用户代码。由于芯片操作总是从使用内部RC振荡器开始,且主振荡器可能永远不在相同的应用中使用,因此主振荡器将仅通过软件请求来启动。这种操作可通过将SCS寄存器中的位OSCEN置位来实现”
关于外设的时钟
“上电复位,定时器的时钟是CPU时钟的1/4”
看完这些,我觉得我写的程序也太奇葩了,这些寄存器都没有考虑,但是问题的关键是,在这些寄存器我都没有考虑要设置的情况下,居然得到了我想要的现象,这让我百思不得其解。按照用户手册的说明,我没有配置主晶振,CPU应该使用内部RC时钟(4MHz)工作才对啊,并且定时器的时钟是CPU的1/4,也就是1MHz? 开始我怀疑LED灯闪烁的时间可能不是1S,后来我用示波器测量波形,发现确实是精确的1S。到此我真的不知道为什么会这样,也不知道该怀疑哪里出了问题 ,请大家帮忙看看,非常感谢!!
|