[技术问答]

N76E003 双串口同时用定时器3产生波特率可行?

[复制链接]
1125|9
手机看帖
扫描二维码
随时随地手机跟帖
ak5136728|  楼主 | 2019-7-23 14:19 | 显示全部楼层 |阅读模式
在STC的单片机上,多路串口如果波特率相同的情况下可以采用同一个定时器来产生时钟,那么在N76E003上面是否也可以这么实现呢?调试了好久都行,问下有哪位大神实现了?还是说硬件上本身就不支持这么做?初始化部分如下: 是否有漏了什么?

/********************************************************************
* 名称: InitialUART0AndUART1_Timer3(UINT32 u32Baudrate)
* 功能: 初始化串口
* 调用:
* 输入:
* 返回值:
***********************************************************************/
void InitialUART0AndUART1_Timer3(UINT32 u32Baudrate) //use timer3 as Baudrate generator
{
/****串口0端口设置******************************************************/
        P06_Quasi_Mode;                //Setting UART pin as Quasi mode for transmit
        P07_Quasi_Mode;                //Setting UART pin as Quasi mode for transmit       
/********************************************************************/
/****串口1端口设置******************************************************/
        P02_Quasi_Mode;                //Setting UART pin as Quasi mode for transmit
        P16_Quasi_Mode;                //Setting UART pin as Quasi mode for transmit
/***串口0相关寄存器配置******************************************************/       
    SCON = 0x50;     //UART0 Mode1,REN=1,TI=1        串口0控制寄存器
    set_SMOD;        //UART0 Double Rate Enable
    set_BRCK;        //UART0 baud rate clock source = Timer3
/********************************************************************/
/***串口1相关寄存器配置******************************************************/
        SCON_1 = 0x50;   //UART1 Mode1,REN_1=1,TI_1=1

/********************************************************************/
           T3CON &= 0xF8;   //T3PS2=0,T3PS1=0,T3PS0=0(Prescale=1)定时器3预分频        1/1

#ifdef FOSC_160000
        RH3    = HIBYTE(65536 - (1000000/u32Baudrate)-1);                          /*16 MHz */
        RL3    = LOBYTE(65536 - (1000000/u32Baudrate)-1);                        /*16 MHz */
#endif
#ifdef FOSC_166000
    RH3    = HIBYTE(65536 - (1037500/u32Baudrate));                         /*16.6 MHz */
    RL3    = LOBYTE(65536 - (1037500/u32Baudrate));                         /*16.6 MHz */
#endif
    set_TR3;        //Trigger Timer3
        set_TI;                        //For printf function must setting TI = 1
        set_ES;                        //enable UART interrupt
        set_TI_1;                //For printf function must setting TI_1 = 1
        set_ES_1;                //For interrupt enable
    set_EA;         //enable global interrupt
}



使用特权

评论回复
xuanhuanzi| | 2019-7-23 15:23 | 显示全部楼层
波特率一样就应该可以

使用特权

评论回复
xuanhuanzi| | 2019-7-23 15:31 | 显示全部楼层
362025d36b7c21cba7.png

使用特权

评论回复
xuanhuanzi| | 2019-7-23 15:33 | 显示全部楼层
有可能是上面这个配置问题。

使用特权

评论回复
xuanhuanzi| | 2019-7-23 15:33 | 显示全部楼层
922385d36b85092d76.png

使用特权

评论回复
ak5136728|  楼主 | 2019-7-23 16:28 | 显示全部楼层
谢谢各位,波特率相同的情况下可以使用同一个定时器3来做波特率发生器,已经调试通过了。

使用特权

评论回复
评论
598330983 2019-7-23 17:38 回复TA
是上面的那配置代码吗 
598330983| | 2019-7-23 17:38 | 显示全部楼层
求分享一下这个配置的代码。给大神提鞋。

使用特权

评论回复
tianxj01| | 2019-8-26 18:31 | 显示全部楼层
598330983 发表于 2019-7-23 17:38
求分享一下这个配置的代码。给大神提鞋。

非常简单,官方的串口配置库有点问题
毛病在这里:
官方库里面,关于这个配置到UART0  是这样的
T3CON &= 0xF8;  //T3PS2=0,T3PS1=0,T3PS0=0(Prescale=1)
到UART1 是这样的
T3CON = 0x08;   //T3PS2=0,T3PS1=0,T3PS0=0(Prescale=1), UART1 in MODE 1
InitialUART0_Timer3(19200);
InitialUART1_Timer3(19200);
这样配置通不过,UART0的T3CON 配置好了后,被UART1的配置过程替换了,所以顺序换一下:
InitialUART1_Timer3(19200);
InitialUART0_Timer3(19200);
就OK了

使用特权

评论回复
mintspring| | 2019-8-29 00:29 | 显示全部楼层
tianxj01 发表于 2019-8-26 18:31
非常简单,官方的串口配置库有点问题
毛病在这里:
官方库里面,关于这个配置到UART0  是这样的

我去,秘密隐藏的好深,多谢楼主分享。

使用特权

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

本版积分规则

5

主题

51

帖子

3

粉丝