DM3730 x-loader 分析 六 UART

来源:互联网 发布:淘宝卖家怎么看收藏 编辑:程序博客网 时间:2024/05/22 13:37

一. UART初始化

1.先配置MUX_DEFAULT,使需要使用UART管脚有效

2.配置相应寄存器,针对x-loader/Drivers/Ns16550.c文件,总结一个便于分析表格



关于波特率的产生,先看sprugn4r.pdf截图

可见波特率的产生需要,48MHz,DLH和DLL中的值也就是26,Divisor也就是表格中提到的16,以115200为例,26=4800000/(115200*16)
至于26的来源,可以参见sprugn4r中2913页
3.UART 接收和发送主要操作THR_REG串口数据发送寄存器,RHR_REG串口数据接收寄存器。
二 . 源码分析
x-loader/asm/arch-omap3/omap3430.h 69-72行宏定义了3个串口配置寄存器的基地址
x-loader/Include/configs/Omap3stalker.h中88-105行,用条件编译CFG_PRINTF,定义串口配置相关的宏。可以看到 配置的是uart1作为串口。因此如果要配置UART3作为串口打印信息,就是要修改88-105行。
x-loader/include/Ns16550.h 中定义在Ns16550.c中用到宏定义。主要是针对串口寄存器
x-loader/Drivers/Ns16550.c主要分析这个文件,如何对寄存器,对哪些寄存器进行配置。
x-loader/Drivers/Serial.c主要是串口波特率生成函数,发送函数以及接收函数,以及配置寄存器基地址选择。
x-loader/Drivers/Ns16550.c

void NS16550_init (NS16550_t com_port, int baud_divisor) 
参数说明
NS16550_t com_port  串口配置寄存器基地址
int baud_diviso  波特率除数26

这个函数的意思是给串口配置寄存器赋值
{
com_port->ier = 0x00;
//com_port指向ier,IER_REG赋值0x00,不使能中断//
#ifdef CONFIG_OMAP
com_port->mdr1 = 0x7;   /* mode select reset TL16C750*/
// ifdef 条件编译,之前如果定义了CONFIG_OMAP,就编译下面内容。
   MDR1_REG赋值0x7,默认模式//
#endif
com_port->lcr = LCR_BKSE | LCRVAL;
// 0x80|0x03=1000 0011=LCR_REG,8bit数据位1位停止位,除数锁存模式//
com_port->dll = baud_divisor & 0xff;
// 通过分析baud_divisor=26,DLL_REG=0001 1010//
com_port->dlm = (baud_divisor >> 8) & 0xff;
//DLH_REG=0//
com_port->lcr = LCRVAL;
//LCR_REG=0000 0011,8bit数据位1停止位//
com_port->mcr = MCRVAL;
//MCR_REG=0000 0011,使能RTS,DTS//
com_port->fcr = FCRVAL;
//FCR_REG=0000 0111,使能FIFO,并且清空发送/接收FIFO//
#if defined(CONFIG_OMAP)
com_port->mdr1 = 0;/* select uart mode */
// DR1_REG=0,设置串口模式,UART 16X mode//
#endif
}

void NS16550_reinit (NS16550_t com_port, int baud_divisor)
//再次赋值初始化,目前还不太理解//
{
com_port->ier = 0x00;
com_port->lcr = LCR_BKSE;
com_port->dll = baud_divisor & 0xff;
com_port->dlm = (baud_divisor >> 8) & 0xff;
com_port->lcr = LCRVAL;
com_port->mcr = MCRVAL;
com_port->fcr = FCRVAL;
}

void NS16550_putc (NS16550_t com_port, char c)
参数说明
NS16550_t com_port   串口配置寄存器基地址
char c
 
发送函数判断LSR_REG【5】是否为0,如果是0,说明TX FIFO不为空,等待。
如果是1,说明TX FIFO已经发送完毕。

{
while ((com_port->lsr & LSR_THRE) == 0);
com_port->thr = c;
//THR_REG串口数据发送寄存器,填入字符c*/
}

char NS16550_getc (NS16550_t com_port)
参数说明
NS16550_t com_port   串口配置寄存器基地址
接收函数判断LSR_REG【0】,RX FIFO是否有数据接收。如果是0,没有数据接收,则等待。
如果是1,说明接收到1位数据,指针指向RHR_REG 接收数据寄存器。

{
while ((com_port->lsr & LSR_DR) == 0);
return (com_port->rbr);
}

int NS16550_tstc (NS16550_t com_port)
参数说明
NS16550_t com_port   串口配置寄存器基地址
这个函数判断LSR_REG【0】,如果是1,继续接收数据。

{
return ((com_port->lsr & LSR_DR) != 0);
}


#endif
#endif
三. 做个简单的实验,使开发板UART3打印出信息
修改x-loader/Include/configs/Omap3stalker.h
















0 0
原创粉丝点击