打印
[技术问答]

1Mhz主频下UART波特率9600无法使用4800正常?

[复制链接]
757|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dqqqqqq|  楼主 | 2020-5-6 10:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
分频到1Mhz ,UART波特率9600无法使用收到的和发送的数据不一致,4800收到的数据正常

官方例程代码如下:
        CKDIV=0x0C;  //分频到1Mhz
     MFP_P31_UART0_TXD;
    P31_QUASI_MODE;
    UART_Open(1000000,UART0_Timer1,9600);        /* Open UART0 use timer1 as baudrate generate and baud rate = 115200 */
  
     MFP_P55_UART2_RXD;
    P55_INPUT_MODE;
    UART_Open(1000000,UART2,9600);                /* Open UART2 use timer1 as baudrate generate and baud rate = 115200*/
    UART_Interrupt_Enable(UART2,Enable);
    ENABLE_GLOBAL_INTERRUPT;
/* Connect P5.5 and P3.1 to check loop  from UART0 to UART2*/
    UART_Send_Data(UART0,TXtemp);  
    while(1)
    {
      if (uart2rvflag)
      {
          TXtemp++;
          uart2rvflag=0;
          Timer3_Delay(1000000,4,300,1000);
          UART_Send_Data(UART0,TXtemp);  
      }
    }

使用特权

评论回复
沙发
gejigeji521| | 2020-5-6 10:58 | 只看该作者
应该是波特率没有配置对。

使用特权

评论回复
板凳
huangcunxiake| | 2020-5-6 18:57 | 只看该作者
M51?

使用特权

评论回复
评论
dqqqqqq 2020-5-6 22:03 回复TA
ML51 
地板
wanduzi| | 2020-5-6 20:06 | 只看该作者
没试过,官方例子默认的是多少

使用特权

评论回复
5
wanduzi| | 2020-5-6 20:07 | 只看该作者
          SC0ETURD0 = LOBYTE(u32SysClock/8/u32Baudrate-1);  /* define baud rate low byte */
          SC0ETURD1 &= 0xF0;                                /* define baud rate high byte */
          SC0ETURD1 |= (HIBYTE(u32SysClock/8/u32Baudrate-1))&0x0F;
要看这两个配置对不对吧。

使用特权

评论回复
6
wanduzi| | 2020-5-6 20:08 | 只看该作者
如果你太低,估计这个配置好后,误差太大。你看看误差

使用特权

评论回复
7
wangshujun| | 2020-5-7 09:12 | 只看该作者
本帖最后由 wangshujun 于 2020-5-8 10:12 编辑

自己算一下,如果频率精确的话,频率发生器导致的误差接近10%了,肯定有问题的1000000/16/9600=6.510416666666667
无论用6分频还是7分频误差都接近10%,串口能容忍的极限是5%误差,实际超过3%就进入危险区间了
4800则分频数是13.02083333333333,直接用13分频,误差0.16%左右,通信效果肯定是很好的
在晶振频率低的时候要么选择非整数的晶振,要么选择非标的波特率,都可以很好的适应
比如1.8432兆晶体可以良好的支持到115200
用1兆的时候使用非标波特率的话62500及整数分频的都能支持的不错,这时需要串口工具支持非标bps,并且还要看串口硬件是否支持(比较低的非标大多数usb转串口都支持的不错的,但是高了要小心)

使用特权

评论回复
评论
dqqqqqq 2020-5-11 11:42 回复TA
好的,回答很详细,非常感谢! 我现在试了LPR_UART2_PDMA例程的UART2 在主频38.4Khz下 4800bps和9600bps都可以正常收发。 void LowPower_LIRC_UART2_4800_init(void) 
8
wanduzi| | 2020-5-8 22:56 | 只看该作者
是的,波特率是关键,所以你可以根据实际的波特率配置电脑串口软件的波特率测试,应该就没问题了。

使用特权

评论回复
9
wanduzi| | 2020-5-8 22:56 | 只看该作者
多谢楼主分享,下次做这个,我也会注意一下。

使用特权

评论回复
10
huahuagg| | 2020-5-10 17:20 | 只看该作者
51内核的库函数没有ARM内核的库函数更智能,因为51的库函数要考虑本身存储比较小,新唐ARM内核的都会自动判断是否有误差,不行的配置,就不给你设置,直接报错。

使用特权

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

本版积分规则

24

主题

90

帖子

0

粉丝