[技术问答]

N76E003的波特率为何这样设置就是9600能给解释下吗?

[复制链接]
1289|14
手机看帖
扫描二维码
随时随地手机跟帖
taobaofarmer|  楼主 | 2020-7-26 22:22 | 显示全部楼层 |阅读模式
P06_Quasi_Mode;               
P07_Quasi_Mode;
       
SCON  = 0x50;    //UART0 Mode1/REN=1/TI=1
TMOD |= 0x20;    //模式2: 8位定时器/计数器,带自动TH1重载模式

set_SMOD;        //UART0 Double Rate Enable
set_T1M;
clr_BRCK;        //Serial port 0 baud rate clock source = Timer1

TH1 = 256 - (1000000/BaudRate + 1);               /*16 MHz */
set_TR1;
ES = 1;
上面是从N76E003官方给出的democode里截取出来整理的,经实验,通信波特率确实是9600,波特率发生器用的是T1,但就是没研究明白为何这样配置就是9600波特,望前辈指点一二

940645f1d91bacd024.png

使用特权

评论回复
643757107| | 2020-7-27 11:52 | 显示全部楼层
根据手册,和波特率计算公式。。

使用特权

评论回复
643757107| | 2020-7-27 11:53 | 显示全部楼层
手册给出的有个表格,就是不同时钟源下的波特率配置参数。你可以看看,根本不需要管他咋回事。

使用特权

评论回复
taobaofarmer|  楼主 | 2020-7-27 12:29 | 显示全部楼层
这个表格倒是没注意过,我查查看

使用特权

评论回复
643757107| | 2020-7-27 12:53 | 显示全部楼层
825575f1e5dad869d1.png

使用特权

评论回复
643757107| | 2020-7-27 12:53 | 显示全部楼层
518385f1e5dbc06887.png

使用特权

评论回复
cooldog123pp| | 2020-7-27 21:42 | 显示全部楼层
新塘的单片机没有用过,但是还是给楼主顶一顶吧,希望问题早点解决。

使用特权

评论回复
taobaofarmer|  楼主 | 2020-7-28 11:07 | 显示全部楼层
本帖最后由 taobaofarmer 于 2020-7-28 11:21 编辑

问题已经解决,115200bps嗖嗖的,贴上代码,直接用就行
void Make_HIRC_16p6MHz(void)
{
        unsigned char hircmap0, hircmap1;
        unsigned int  trimvalue16bit; /* Since only power on will reload RCTRIM0 and RCTRIM1 value, check power on flag*/
        
        //产生上电复位(冷复位),其它任何方式复位不会影响改位(POF)
        if((PCON & SET_BIT4) == SET_BIT4)
        {
                hircmap0 = RCTRIM0;
                hircmap1 = RCTRIM1;
               
                trimvalue16bit = ((hircmap0<<1) + (hircmap1&0x01));
                trimvalue16bit = trimvalue16bit - 15;

                hircmap1 = trimvalue16bit  & 0x01;
                hircmap0 = trimvalue16bit >> 1;
               
                TA = 0xaa;
                TA = 0x55;
                {
                        RCTRIM0 = hircmap0;
                }
                TA = 0xaa;
                TA = 0x55;
               
                RCTRIM1 = hircmap1;
               
                //After modify HIRC value, clear power on flag
                PCON &= CLR_BIT4;
        }
}

//工作主频16.6M
void Uart0_MyInit_Base16p6MHz(void)
{
        P06_Quasi_Mode;               
        P07_Quasi_Mode;
        
        //SCON寄存器:模式1/接收总是有效不管停止位的逻辑电平/接收使能
        SM0 = 0;
        SM1 = 1;
        SM2 = 0;
        REN = 1;
        
        P06_Quasi_Mode;
        P07_Quasi_Mode;        
        
        SCON = 0x50;     //UART0 Mode 1/SM1=1/REN=1
                                 //模式1/接收总是有效不管停止位的逻辑电平/接收使能
        
       set_SMOD;          //UART0 Double Rate Enable
       T3CON &= 0xF8;  //T3PS:2/T3PS:11/T3PS:0 = 000(时钟分频 = 1/1)
       set_BRCK;           //串口0波特率时钟源为Timer3
        
        switch(uBPS)
       {
            case 0x10: //1200
                        RH3 = 0xfc;
                        RL3 = 0xa0;
                        break;
            case 0x11: //2400
                        RH3 = 0xfe;
                        RL3 = 0x50;
                        break;
            case 0x12: //4800
                        RH3 = 0xff;
                        RL3 = 0x28;
                        break;
            case 0x13: //9600
                        RH3 = 0xff;
                        RL3 = 0x94;
                        break;
            case 0x14: //19200
                        RH3 = 0xff;
                        RL3 = 0xca;
                        break;
            case 0x15: //38400
                        RH3 = 0xff;
                        RL3 = 0xe5;
                        break;
            case 0x16: //57600
                        RH3 = 0xff;
                        RL3 = 0xee;
                        break;
            case 0x17: //115200
                        RH3 = 0xff;
                        RL3 = 0xf7;
                        break;
            default:
                        uBPS = 0x13;
               
                        RH3 = 0xff;
                        RL3 = 0x94;
                        break;
        }

        //Trigger Timer3
        set_TR3;        
        
        ES = 1;
}
分别调用这两个函数就可以



使用特权

评论回复
幸福小强| | 2020-7-28 11:41 | 显示全部楼层
给楼主打CALL,多谢楼主分享经验。

使用特权

评论回复
piteqiu| | 2020-7-28 12:06 | 显示全部楼层
波特率有误差正常,但还是可以通讯上的,按官方手册提供的参数配置就好了。

使用特权

评论回复
taobaofarmer|  楼主 | 2020-7-28 12:21 | 显示全部楼层
我把工作主频调整到16.6M了,波特率误差极小了,115200都没有任何影响了

使用特权

评论回复
monitoring| | 2020-7-28 20:20 | 显示全部楼层
一般波特率都是根据时钟频率和定时器的分频配置以及计数值来计算的

使用特权

评论回复
电子xiaocainiao| | 2020-7-28 21:26 | 显示全部楼层
BaudRate这个值,看看宏定义是什么,应该就是表格中的值了。

使用特权

评论回复
taobaofarmer|  楼主 | 2020-7-29 17:25 | 显示全部楼层
又来了新问题,2400 115200都试过了,通信嗖嗖的,但是因为这个表儿没有1200BPS的初始值,我就自己算了下,2400BPS的初始值是FE50,距离FFFF的值是431,那么1200波特速度是2400的一半,所以距离FFFF的值是431*2就应该可以,根据这个推理得出的初始值是FC A0,但是实际通信之后,发现就第一第二个字节对,其余的就不对了,看来这个初始值还是有点儿小误差,有用过1200BPS的没,把初始值给咱公示下

使用特权

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

本版积分规则

71

主题

460

帖子

3

粉丝