本来已经放弃用中断方式做串口通信了,去做定时器0中断的实验。在做定时器中断的实验时,先用ADS,用周的模板和程序,显然没有任何问题,定时1s很准确。上程序https://static.assets-stash.eet-china.com/album/old-resources/2010/5/8/60cb5dbb-1d58-4b94-9465-a37f4e0c0a74.rar
之后用KEIL的模板,发现定时总是有错误,定1s的,但是设断点看发现只有0.8s,而且0.8s很准确,尝试多次,绝不是偶然的。发现周的模板PLL初始化是在target.c这个文件里的,我在KEIL中并没有做PLL初始化的工作,暗想那么Fpclk应该和外部晶振一样,但是调试发现,PLL已经有值,见图:
如果CLOCK是55.296MHz,那么按程序就是0.8s!所以怀疑KEIL的模板已经设定了PLL,百度之果然。
“startup.s已经做了一部分基本资源的初始化。如果你不知道的话,那么认为main程序中没有初始化有些设置(很多特殊功能寄存器复位时是有初始值的),是不按照你的想象实现功能的。这很使人迷惑。其实startup.s已经给你做了某些事情。比如下面的程序中PLL,MAM他都给你做了设置,不再是复位状态了。我今天就认知到了这一点。因为我在设置LPC2214 UART0的波特率时一直实现不了,后来仿真时看到VPBDIV,PLLCFG,PLLCON都不是复位值了。多以按照复位值算出来的波特率怎么也对不上。所以startup.s一定要引起我们的注意,或者在main的开始要对我们必要的特殊功能寄存器按照我们自己的要求重新出事化一下。”
在程序了加入PLL初始化,结果正确。https://static.assets-stash.eet-china.com/album/old-resources/2010/5/8/9c4e8e39-6092-4115-9fd8-aa39001cf3d8.rar
上面的一句话引起了我的注意,他是在设置UART0波特率的时候发现的问题,我的用中断方式串口通信不成功,可能就是波特率的问题!
仍用KEIL的模板,删除了上文中说的更改的地方,加入PLL的初始化,编译烧写,打开串口调试助手,发送,收到字符了!不容易啊。。。上程序https://static.assets-stash.eet-china.com/album/old-resources/2010/5/8/f17fe44b-e99f-416e-a197-0531c660cacd.rar
另外,如果还按上文说的在startu.s中加入那些东西,而且程序中加入
IRQEnable(); //使能IRQ 中断,
那么PLL的CLOCK将会在11.0592M和11.0592*5M之间变化,波特率也不稳定了,这就导致了通信的失败。具体原因不太明白,可能是PLL设定期间要禁止IRQ中断吧,可能。
用户377235 2013-4-17 22:16
用户284278 2011-9-23 00:19
用户222124 2009-6-14 12:27
用户99739 2009-6-13 10:39