1.1 ARM 串口输出函数uart_printf
ARM如果能使用C函数库自带的printf函数格式输出,那多方便,但是默认的printf都是定位到stdout终端,而不是串口,本文章讲述的是如何定位到ARM的串口。
1.1.1 函数主要代码有在Mini2440开发板上验证过
//*****************main.c*******************************
#include"serial.h"
int Main()
{
unsignedint plck_val = 50000000;
unsignedint buad_val = 115200;
unsignedint ch_val = 0;
char*string="Hello,";
uart_init();
uart_printf("\n\r%s\n",string);
uart_printf("\rUse uart0\n\rParameter:PCLK is %d,buad is %d,uart_port is %d \n",plck_val,buad_val,ch_val);
uart_printf("\r该函数不能打印浮点数!");
return 0;
}
//***********************serial.c**************************
#include"s3c2440.h"
#include"serial.h"
#include <stdarg.h> //需要包含此stdarg.h头文件
#include <stdio.h> //需要包涵此stdio.h头文件
#define TXD0READY (1<<2)
#defineRXD0READY (1)
#definePCLK 50000000 // init.c中的clock_init函数设置PCLK为50MHz
#defineUART_CLK PCLK // UART0的时钟源设为PCLK
#defineUART_BAUD_RATE 115200 // 波特率
#defineUART_BRD ((UART_CLK / (UART_BAUD_RATE * 16)) - 1)
voiduart_init()
{ //UART初始化:端口使能、功能设定、波特率、设置数据格式
GPHCON = (GPHCON & ~(0xfff<<4)) |(0xaaa<<4);//端口配置成uart0、uart1,uart3
GPHUP = 0x38; //端口GPH禁止上拉
UFCON0 = 0x0; //禁止FIFO
UMCON0 = 0x0; //禁止AutoFlow Control
//Normal:No parity:One stop:8-bits 中断响应 UART clock: PCLK
ULCON0 = 0x03; // 8N1(8个数据位,无较验,1个停止位)
UCON0 = 0x05; // 查询方式,UART时钟源为PCLK
UBRDIV0 = UART_BRD; // 波特率为115200
}
voiduart_send_byte(char data)
{
while (!(UTRSTAT0 & TXD0READY));
UTXH0 = data;
}
voiduart_send_string(char *string)
{
while(*string)
{
uart_send_byte(*string++);
}
}
void uart_printf(char *fmt,...) //这个才是本文重点
{
va_listap;
charstring[256];
va_start(ap,fmt);
vsprintf(string,fmt,ap);
uart_send_string(string);
va_end(ap);
}
//***************************************************
1.1.2 uart_printf分析这里涉及到一个重要概念,变参函数,比如C库函数int printf(char *fmt, ...),就是一个典型的变参函数。
我们即将编写的uart_printf毫无疑问,也是一个变参函数。
可变参数入栈顺序