迪文屏幕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输出结果:

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值