我所知道的EC====>Uart
1. Introduction
“没有输出之前调试是一门艺术,有了输出以后调试就是一门技术!”这句话准确的道出了调试程序时能够查看运行状况和环境信息的重要性;尤其在FW环境下debug手段非常有限,uart是几乎所有FW都会采用的debug方式。Uart全称是 Universal Asynchronous Receiver/Transmitter即通用异步收发器(异步串行通信口)它包括了RS232、RS485等接口和总线标准规范, 它作为一种低速通信协议广泛应用于通信领域。
2. Hardware Interface
Uart spec定义了非常多的信号,但debug过程中通常只需要接三根信号RX、TX、GND就可以了,故常见串口debug线路如下图1所示:
串口读写数据时数据送往内部的fifo,如果fifo满了数据就会按照顺讯逐个bit送往总线。数据读写的时序和格式如下图2所示:
串口通信常见的波特率有19200,115200,9600,4800,2400,1200 Bps,波特率可以通过寄存器配置。
3. How to Implement
前一段时间有同事问我一个问题:”为什么我们EC之中使用printf、puts、 putchar这些函数输出字符,字符会送给串口呢?以前写的DOS下的程序是输出到终端的呀。”,他的困惑不无道理,为什么呢?不要着急,让我来告诉你其中的奥秘。若干年以前,我曾经在arm9上面portting过bootloader(u-boot),u-boot也有一个串口debug的部分,所以我就碰巧大致翻了翻这部分的代码,关注过这个问题J.先来看看printf的实现吧,下述代码是u-boot 中的printf code:
void printf (const char *fmt, ...)
{
va_list args;
uint i;
char printbuffer[CFG_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);
va_end (args);
/* Print the string */
puts (printbuffer);
}
注意看红色部分的代码,printf