En 0755-86038900
行业动态

友坚UT4412BV03开发板串口初始化分析

发布时间:2015-04-16
深圳ARM方案定制知名企业友坚恒天开发板平台,专业提供5260开发板,4412开发板,ARM等开发板定制方案.
串口初始化代码所在路劲:oardsamsungsmdk4212lowlevel_init.S
 
 
首先我们根据上图知道了UT4412BV03板子的UART连接的对应IO口,可想而知要使用串口肯定要对其进行初始化。下面将分析串口初始化过程
uart_asm_init通过此函数设置串口的波特率为115200.
/*
 * uart_asm_init: Initialize UART in asm mode, 115200bps fixed.
 * void uart_asm_init(void)
 */
.globl uart_asm_init
uart_asm_init:
 
/* set GPIO to enable UART */
@ GPIO setting for UART for UART0/1/2/3
ldr r0, =0x11400000
ldr r1, =0x22222222
str    r1, [r0]
ldr r0, =0x11400020
ldr r1, =0x222222
str    r1, [r0]
 
     //设置uart0~4的时钟源为SCLKMPLL_USER_T,为800MHz
ldr r0, =S5PV310_CLOCK_BASE
ldr r1, =CLK_SRC_PERIL0_VAL
ldr r2, =CLK_SRC_PERIL0_OFFSET
str r1, [r0, r2]
// 设置uart的分频系数为7,经计算得到SCLK UART=800M/(7+1)=100M
ldr r1, =CLK_DIV_PERIL0_VAL
ldr r2, =CLK_DIV_PERIL0_OFFSET
str r1, [r0, r2]
 
ldr r0, =S5PV310_UART_CONSOLE_BASE
ldr r1, =0x111
str r1, [r0, #UFCON_OFFSET]
// 设置uart0发送或者接受数据包每帧大小,这里设置为了8bit,1bit停止位,
//无奇偶校验,normal mode(除此之外还有一种叫做info-red的模式,用于红外发送和接受)
 
mov r1, #0x3
str r1, [r0, #ULCON_OFFSET]
    // 设置uart0的读取接收缓冲区和写输出缓冲区的方式为中断或者轮询(除此之外还有DMA方式等);
    //中断触发类型为电平触发
ldr r1, =0x3c5
str r1, [r0, #UCON_OFFSET]
 
ldr r1, =UART_UBRDIV_VAL
str r1, [r0, #UBRDIV_OFFSET]
 
ldr r1, =UART_UDIVSLOT_VAL
str r1, [r0, #UDIVSLOT_OFFSET]
 
ldr r1, =0x4f4f4f4f
str r1, [r0, #UTXH_OFFSET] @'O'//串口初始化后向控制台打印的字符“O”
 
mov pc, lr
以上代码就完成了UART的硬件初始化,接下来将调用printf函数将所有填入printbuffer中的字符通过puts()函数输出到串口控制台。
common/console.c:中printf函数分析
int printf(const char *fmt, ...)
{
va_list args;
uint i;
char printbuffer[CONFIG_SYS_PBSIZE]; //定义一个数组
va_start(args, fmt);
/* For this to work, printbuffer must be larger than
 * anything we ever want to print.
 */
i = vsprintf(printbuffer, fmt, args); 将要打印的内容写到printbuffer中
 
va_end(args);
/* Print the string */
puts(printbuffer); 将printbuffer中的内容从串口输出
return i;
}
 
注:怎样确定并使用哪个串口作为调试串口
在上面分析中我们看到这样一行代码,我们可以在Source insight中跳转到此语句定义处。
ldr r0, =S5PV310_UART_CONSOLE_BASE
跳转到这里我们看到如下的if else中定义的内容,知道UT4412BV03开发板使用了UART2作为调试串口。
 

通过上面的初始化UART的分析我们知道了调试信息是怎样打印到串口上的了。
但是在实际运用中,有些人为了利用足够多的串口作为应用串口,然而,就想到了把调试串口改为普通串口使用。这就要求要屏蔽掉调试口的打印信息。
其实在前面的分析中大家应该能够想到怎样去屏蔽调试口的信息。在printf()函数中调用put将printbuffer中的字符串信息打印到控制台,因此我们只需要将puts(printbuffer);语句调用注释掉,然后重新生成uboot即可,这样就屏蔽掉了uboot阶段的调试信息输出。
int printf(const char *fmt, ...)
{
va_list args;
uint i;
char printbuffer[CONFIG_SYS_PBSIZE]; //定义一个数组
va_start(args, fmt);
/* For this to work, printbuffer must be larger than
 * anything we ever want to print.
 */
i = vsprintf(printbuffer, fmt, args); 将要打印的内容写到printbuffer中
 
va_end(args);
/* Print the string */
puts(printbuffer); 将printbuffer中的内容从串口输出
return i;
}
了解更多的信息在友坚开发板官网:http://www.urbetter.net    http://www.urbetter.com.cn
更多问题请到友坚论坛进行发贴讨论:
http://bbs.urbetter.com