最近接触F030芯片,用了一个F4P6,算是最便宜的了,而且功能也不差,真是物美价廉,量也很足。
而且刚发现,这个芯片的USART不但支持485自动方向控制,还支持自动波特率识别,真是赚大了。
芯片最高支持48MHz时钟,串口如果使用16倍超采样,最高波特率是3Mbps,如果使用8位超采样,最高波特率达到6Mbps,还是很不错的嘛,就喜欢这种超高波特率。
波特率自动识别原理也很简单,就是在接收到第一个字节的时候,测量1位或者2位数据的时长,然后再计算出波特率,当然,对第一个字节有一些要求,一般我们做串口通讯,加包格式,如果有前导起始字符,比如0x55,或者'%',都是符合这个格式的。
更可贵的是,这个第一个不知道波特率的字节,并不会丢失,而是会正确得接收,加10分。
但是真正测试这个自动波特率的时候,发现了问题了。
如果设置16倍超采样,自动计算出的波特率是正确的,虽然略有误差,但是能够满足通讯的要求。
如果设置8倍超采样,问题就来了,自动波特率算出的BRR结果还是按照16倍超采样算出来的,结果波特率完全就不对了,基本上变成原来的2倍。
虽然可以使用一些奇技淫巧,在8倍超采样的时候,自动波特率识**的波特率数值自动改成正确的,但是应该正确接收的第一个字节已经丢失了,造成无法挽回的遗憾。
另外,如果波特率超过16位超采样支持的最高波特率,那么自动波特率识别又识别不到。
这样就造成那个8位超采样和自动波特率识别没法匹配,芯片支持的超高波特率功能也就成了**肋了。
估计这个问题,应该是硬件设计时候的BUG吧。
|