迪文屏幕T5L平台学习笔记五:C51使用UART2打印log

Posted 无痕幽雨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了迪文屏幕T5L平台学习笔记五:C51使用UART2打印log相关的知识,希望对你有一定的参考价值。

上篇博客介绍了利用sprintf,实现数据转化,在文本框上显示字符串,这篇博客利用printf,实现串口打印log。

一、首先看UART2配置寄存器

 这里我们选择模式1,选择SRELOH:L产生波特率,释放T1定时器。

二、IO口配置配置寄存器

  

 一定要配置MUX_SEL的第六位使能为UART2和P0MDOUT的第4位为出输出脚,第5位输出关闭,P0.4是UART2的TX引脚,P0.5是RX脚。

三、波特率计算

该公式推导如下:

1、波特率定义为每秒发送多少bit,一个bit时间=1S/波特率;

2、一个bit时间=计时器计一个数时间=1/计数器频率(单位Hz);

3、推导出:

1S/波特率  = 1/计数器频率(单位Hz)   即:波特率(bit/S)=计数器频率(Hz)

4、计数器频率=CPU频率/分频系数;其中分频系数分为两个部分,一个是64或者32,另外一个为SREL0H:L计数值,有用是SREL0H:L是10位宽,最大1024,计时位向上增长,溢出触发,因此:

     分频系数 = (64或者32)*(SREL0H:L计数值);

     SREL0H:L计数值 = 1024 - 初值

波特率(bit/S)=计数器频率(Hz)=CPU频率(Hz)/((64或者32)*(1024 - 初值));

变换一下:初值 = 1024 - CPU频率(Hz)/((64或者32)*(波特率)),即为手册给出公式,

其中CPU频率单位为Hz。

如果晶振=11.0592M则,波特率范围为:3150~6451200,

四、驱动

#define UART2_ENABLE_RX()       T5LIB_ATOM_CODE(REN0= 0x01;)
#define UART2_DISENABLE_RX()    T5LIB_ATOM_CODE(REN0= 0x00;)
#define UART2_ENABLE_INT()      T5LIB_ATOM_CODE(ES0 = 0x01;)
#define UART2_DISENABLE_INT()   T5LIB_ATOM_CODE(ES0 = 0x00;)
#define UART2_CLEAR_TX_FLAG()   T5LIB_ATOM_CODE(TI0 = 0x00;)
#define UART2_READ_TX_FLAG()    (TI0)
#define UART2_CLEAR_RX_FLAG()   T5LIB_ATOM_CODE(RI0 = 0x00;)
#define UART2_READ_RX_FLAG()    (RI0)

bool uart2_set_baudrate(uint32_t baudrate)

    union _union_uint32_t tTemp   = 0;
    bool     bResult = false;

    if(baudrate < (CPU_SYSCLK/(64*1024l)))  //11.0592M  3150
        return false;
    

    if(baudrate > (CPU_SYSCLK/(32l)))        //11.0592M  6451200
        return false;
    

    T5LIB_ATOM_CODE(
        MUX_SEL = MUX_SEL | 0x40;   //配置UART2引脚 UART2 接口引出到 P0.4(TX)、P0.5(RX)
        P0MDOUT = P0MDOUT | 0x10;   //0=P0.4 输出关闭 1=P0.4 输出开启(推挽输出)
        ADCON = 0x80;               //选择SRELOH:L,释放T1
        SM0   = 0x00;
        SM1   = 0x01;
        SM2   = 0x00;        
        if(baudrate > (CPU_SYSCLK/(64l)))
            PCON = PCON | 0x80;
            tTemp.wTemp = 1024 - CPU_SYSCLK/(32l*baudrate);

            bResult = true;
        else
            PCON = PCON & 0x7F;
            tTemp.wTemp = 1024 - CPU_SYSCLK/(64l*baudrate);

            bResult = true;
        
        if(bResult)
            SREL0H = tTemp.chTemp[2];
            SREL0L = tTemp.chTemp[3];
        
    )

    return bResult;

实现putchar函数:

#if 1
char putchar(char c)   
             
    LOG_UART = c;
    while(0 == LOG_UART_READ_FLAG());
    LOG_UART_CLEAR_FLAG();
    
    return c;

#endif

初始化UART2:

static void uart2_init(void)

    UART2_DISENABLE_INT();
    UART2_ENABLE_RX();
    UART2_CLEAR_TX_FLAG();
    UART2_CLEAR_RX_FLAG();

    uart2_set_baudrate(115200);

    //UART2_ENABLE_RX();

测试代码:

void test(void)

    static enum
        FSM_TEST_START = 0,
        FSM_TEST_WAIT,
        FSM_TEST_SET,
    s_tState = FSM_TEST_START;

    static struct timer s_tTimer = 0;
    static uint32_t     s_wTimer = 0;

    switch(s_tState)
        case FSM_TEST_START:
            s_tState = FSM_TEST_WAIT;
            s_wTimer = 0;
            timer_set(&s_tTimer,DELAY_TIMERS(1000));
            //break;
        case FSM_TEST_WAIT:
            if(!timer_expired(&s_tTimer))
                break;
            
            timer_set(&s_tTimer,DELAY_TIMERS(1000));
            s_tState = FSM_TEST_SET;
            s_wTimer++;
            //break;
        case FSM_TEST_SET:
            
                static int8_t    cData[10];
                int        i = 0;
                printf("测试=%ld\\r\\n\\0",s_wTimer);
                i = sprintf(cData,"%bx%bx%bx%bx",SCON0,ADCON,SREL0H,SREL0L);
                write_dgusii_vp(0x500A,cData,10);
                i = sprintf(cData,"%ld\\0",s_wTimer);
                write_dgusii_vp(0x1000,cData,10);
                //SBUF0 = '1';
            
            s_tState = FSM_TEST_WAIT;
            break;
        default:
            FSM_DEFAULT_ACTION();
    

printf输出结果:

以上是关于迪文屏幕T5L平台学习笔记五:C51使用UART2打印log的主要内容,如果未能解决你的问题,请参考以下文章

迪文屏幕T5L平台学习笔记四:C51使用printf或者sprintf注意事项

迪文屏幕T5L平台学习笔记四:C51使用printf或者sprintf注意事项

迪文屏幕T5L平台学习笔记三:定时器使用

迪文屏幕T5L平台学习笔记六:UART4的回环测试

迪文屏幕T5L平台学习笔记六:UART4的回环测试

迪文屏幕T5L平台学习笔记七:RS485测试