打印
[单片机芯片]

CH552的UART用个115200波特率真费劲

[复制链接]
7578|40
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
imdx|  楼主 | 2020-10-25 14:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
要用USB,Fsys限定了24M/16M/12M/6M这几个频率,同时UART要用115200。算来算去,只有24M主频时可以。24e6/16/115200=13.02,但是3.3V供电时CH552最高频率16M,太难了。

使用特权

评论回复
评论
desertsailor 2020-11-20 08:29 回复TA
我看了下手册,好像没说3.3V供电只能工作在16M,只说了最高主频为24M,不知道是否真有这个限制。 
沙发
Taoyukai| | 2020-10-25 17:29 | 只看该作者
不会吧,我记得我用过可以的啊,参考这个帖子的
https://bbs.21ic.com/forum.php?mod=viewthread&tid=2872236&extra=page%3D7&mobile=2

使用特权

评论回复
板凳
imdx|  楼主 | 2020-10-25 17:58 | 只看该作者
Taoyukai 发表于 2020-10-25 17:29
不会吧,我记得我用过可以的啊,参考这个帖子的
https://bbs.21ic.com/forum.php?mod=viewthread&tid=28722 ...

你的例子都是9600,你试试115200,然后算算误差。

使用特权

评论回复
地板
imdx|  楼主 | 2020-10-25 19:36 | 只看该作者
CH552运行在16M频率下,比较准确的最高波特率是38400

使用特权

评论回复
5
imdx|  楼主 | 2020-10-26 13:08 | 只看该作者
WCHTech2 发表于 2020-10-26 09:53
您好,可以由定时器2作为UART0的波特率时钟来源,16M主频下可以产生115200的波特率,参考附件例程

用T2做波特率发生器没有改善。只看后面一部分:
16e6/16/115200=8.680555555555555
16e6/2/16/115200=4.340277777777778
16e6/4/16/115200=2.170138888888889
这几个尾数距离整数都很远,而且整数部分也很小,注定取整以后误差很大。
现在看你的附件里面的代码:
    x = 10 * 16000000 / 16 / 115200;   // 这里截断以后x是86                     
    x2 = x % 10;                                 // x2=6
    x /= 10;                                        // 这里x为8
    if ( x2 >= 5 ) x ++;                       // 这里x为9


实际上就是8.68取整到了9,误差多少呢?大约3.7%,根本就不可用。

使用特权

评论回复
6
imdx|  楼主 | 2020-10-26 13:17 | 只看该作者
本帖最后由 imdx 于 2020-10-26 13:24 编辑
WCHTech2 发表于 2020-10-26 09:53
您好,可以由定时器2作为UART0的波特率时钟来源,16M主频下可以产生115200的波特率,参考附件例程

另外,对于高波特率,减号前面到底是256还是65536并不重要。减号后面是否接近于整数才是重要的。
65535要想起到效果,减号后面那一部分要足够大,抵消尾数对误差的影响。
比如Fsys/16/波特率。拿掉那个16分频,直接Fsys/波特率,16e6/115200=138.88888888888889
取整到139,误差小于0.1%,小于256用定时器T1就足够了,没必要T2.这个地方感觉是CH552设计的一个缺陷了。

使用特权

评论回复
7
WCHTech2| | 2020-10-26 14:03 | 只看该作者
imdx 发表于 2020-10-26 13:17
另外,对于高波特率,减号前面到底是256还是65536并不重要。减号后面是否接近于整数才是重要的。
65535要 ...

因为要兼顾USB的功能,USB的时钟必须为48M,如果不用USB的功能,可以使用非整数的外置晶振,如11.0592M、18.432M。或者使用5V供电。

使用特权

评论回复
8
imdx|  楼主 | 2020-10-26 14:19 | 只看该作者
WCHTech2 发表于 2020-10-26 14:03
因为要兼顾USB的功能,USB的时钟必须为48M,如果不用USB的功能,可以使用非整数的外置晶振,如11.0592M、1 ...

用CH552的,肯定是冲着USB外设去的。不考虑USB的话别的选择有很多。
而且UART波特率这个锅USB外设不背,本身就是因为给UART外设的频率不够高引起的,最低16分频,16M主频给UART最低才1M,115200波特率没戏一点也不奇怪。
Fsys直接给UART外设甚至2分频给就一点问题都没有了。当然CH552内部有PLL,最高频率96M,USB外设频率48M,内部高频率源根本就不是问题。

使用特权

评论回复
9
imdx|  楼主 | 2020-10-26 14:22 | 只看该作者
WCHTech2 发表于 2020-10-26 14:03
因为要兼顾USB的功能,USB的时钟必须为48M,如果不用USB的功能,可以使用非整数的外置晶振,如11.0592M、1 ...

当然这些都是从技术角度来讨论的,CH552的UART完全可以支持更好的波特率。
从商业角度来考虑,如果CH552对UART波特率支持太好,可能会影响CH340这些芯片的销量,所以完全有可能是故意这么设计的

使用特权

评论回复
10
jcdzxh| | 2020-10-26 15:16 | 只看该作者
我用了个烂眼办法,可以16mhz,115200正常通讯

使用特权

评论回复
11
jcdzxh| | 2020-10-26 15:20 | 只看该作者
每694T中断一次,brr在8和9之间修改,相当于brr=8.5

使用特权

评论回复
12
jcdzxh| | 2020-10-26 15:22 | 只看该作者
误差快2.1%,实测能正常用,而设置成9接收有问题

使用特权

评论回复
13
jcdzxh| | 2020-10-26 15:26 | 只看该作者
看ch552时钟结构,uart时钟完全可以从48mhz处引,那样波特设置就灵活多了

使用特权

评论回复
14
imdx|  楼主 | 2020-10-26 21:34 | 只看该作者
jcdzxh 发表于 2020-10-26 15:26
看ch552时钟结构,uart时钟完全可以从48mhz处引,那样波特设置就灵活多了

其实UART时钟不需要从48M引,把默认Fsys的16分频改成2分频就好多了。STC就是这么做的。
当然,鉴于CH552和CH340价格差不多,这样必然会影响CH340的销售。

使用特权

评论回复
15
家有两宝呀| | 2020-10-26 23:17 | 只看该作者
这么说的话 误差确实有点大

使用特权

评论回复
16
家有两宝呀| | 2020-10-26 23:18 | 只看该作者
jcdzxh 发表于 2020-10-26 15:22
误差快2.1%,实测能正常用,而设置成9接收有问题

什么烂眼办法?可以16mhz,115200正常通讯

使用特权

评论回复
17
chunk| | 2020-10-26 23:53 | 只看该作者
我也被同样的问题困扰,最后弃用。

把CH340停产,把CH552的UART改改,再做个固件实现CH340的USB协议,也是个思路。

使用特权

评论回复
18
led222| | 2020-10-27 08:58 | 只看该作者
技术贴,顶!
“把CH340停产,把CH552的UART改改,再做个固件实现CH340的USB协议,也是个思路。”这个建议很专业,

使用特权

评论回复
19
WCHTech2| | 2020-10-27 10:34 | 只看该作者
imdx 发表于 2020-10-26 14:22
当然这些都是从技术角度来讨论的,CH552的UART完全可以支持更好的波特率。
从商业角度来考虑,如果CH552 ...

您好,这边可以推荐您使用CH546这颗芯片:http://www.wch.cn/products/CH546.html 。3.3V下主频最高50M,115200波特率可以实现。批量价格在2元以内,和CH552相差不多,具体价格可以咨询销售:025-52638388.

使用特权

评论回复
20
AKOO| | 2020-11-9 09:14 | 只看该作者
CH546好是好,不过不太好买,不批量价格基本都大于3元*币

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

120

主题

901

帖子

8

粉丝