[ZLG-ARM] 关于LPC2148串口波特率设置

[复制链接]
5146|10
 楼主| tyxixi 发表于 2007-3-13 11:25 | 显示全部楼层 |阅读模式
我在使用LPC2148,外部晶振为12M,但经过PLL设置后为60M,想串口0设置波特率为1200,如下:<br />U0LCR=0x83;<br />U0DLM=0x2;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;U0DLL=0x71;<br />U0LCR=0x03;<br />但是在KEIL&nbsp;C通过软件调试显示波特率为1500,这是怎么回事?恳请高手赐教!<br />而且在LPC2148手册中给出的公式是不是有问题?
zlgARM 发表于 2007-3-13 14:31 | 显示全部楼层

RE

公式没有问题,做过实验验证了。试验了串口0工作在1200BPS,结果正常。<br /><br />您的Fpclk是多少?<br /><br />
 楼主| tyxixi 发表于 2007-3-16 12:27 | 显示全部楼层

串口波特率公式有问题?

谢谢楼上,我找到原因了。我的外部晶振是12M,经过PLL后是60M,由于LPC2148默认的PCLK是PLL的四分频,故FPCLK是1500,按照上面的配置,算出来是15M。<br />我还是觉得计算波特率公式有问题,在U0DLM前面的系数不应是16,而应该是256,不是吗?
zlgARM 发表于 2007-3-16 13:46 | 显示全部楼层

RE

您说得对,估计是NXP的笔误。<br />高8位应该乘以256。谢谢了!
meihuadipu 发表于 2007-3-25 15:25 | 显示全部楼层

高手帮我看看 LPC2148的串口程序 -不知哪里错了!

程序功能:用LPC2148发送一个16进制数,2148再把这个数回送PC机<br /><br />运行程序后,用串口软件发送,结果送回来的数据总是错的,代码如下(keil下的):<br /><br /><br />#include&nbsp;&ltLPC214x.H&gt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />void&nbsp;uartini(void)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//串口初始化<br />{<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;Fdiv=0;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;U0LCR&nbsp;=&nbsp;0x83;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;Fdiv&nbsp;=&nbsp;(&nbsp;3000000&nbsp;/&nbsp;16&nbsp;)&nbsp;/&nbsp;9600&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;//设定波特率,12M晶振,没用PLL<br />&nbsp;&nbsp;&nbsp;&nbsp;U0DLM&nbsp;=&nbsp;Fdiv&nbsp;/&nbsp;256;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;U0DLL&nbsp;=&nbsp;Fdiv&nbsp;%&nbsp;256;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;U0LCR&nbsp;=&nbsp;0x03;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//DLAB&nbsp;=&nbsp;0<br />}<br /><br /><br />main()<br />{<br />&nbsp;&nbsp;unsigned&nbsp;char&nbsp;data=0x00;<br />&nbsp;&nbsp;PINSEL0&nbsp;=&nbsp;0x00000005;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//打开&nbsp;P0.0,P0.1的串口功能<br /><br />&nbsp;&nbsp;uartini();<br />&nbsp;&nbsp;while(1)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while((U0LSR&0x01)==0);&nbsp;//先等待接收PC机发来的数据<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data=U0RBR;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//取出数据<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;U0THR=&nbsp;0x13;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//把取到的数据再回发出去<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while((U0LSR&0x40)==0);<br />&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />}
meihuadipu 发表于 2007-3-25 15:30 | 显示全部楼层

倒数第二行 U0THR= 0x13; 应为 U0THR= data;

倒数第二行&nbsp;U0THR=&nbsp;0x13;&nbsp;&nbsp;应为&nbsp;U0THR=&nbsp;data;&nbsp;敲错了&nbsp;
 楼主| tyxixi 发表于 2007-4-1 20:33 | 显示全部楼层

我的答案

在PC机上,你是不是用串口调试助手接受数据的?如果是你看看你的串口调试助手是不是选择了“十六进制显示”。还有,你可以在Keil中用软件调试的时候,再仔细看下波特率是不是选择对了。<br />
liujigan 发表于 2007-4-2 10:07 | 显示全部楼层

to:meihuadipu

如果用Keil&nbsp;mdk&nbsp;RV的话自动生成的Startup.s中默认VPBDIV=0X00000001,PLLCFG=0X00000024这一点要注意,我在上面吃过亏,找毛病,找了好几天。
woshixinshou 发表于 2011-2-19 15:44 | 显示全部楼层
找到了,谢谢~~
米其林r 发表于 2011-2-19 22:09 | 显示全部楼层
你的主频是多少
amini 发表于 2011-2-20 15:57 | 显示全部楼层
:o,四年前的贴子?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

18

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部