迪文屏幕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注意事项