/************************************************************************** * tiny4412 UART for C printf Demo * 声明: * 这主要是在tiny4412的串口上实现C语言中的printf函数的Demo,当然, * 除了实现printf,还提供了由此产生的一些常用函数(ntoi,trim)。 * * 2015-7-5 晴 深圳 南山平山村 曾剑锋 *************************************************************************/ \\-*- 目录 -*-///// | 一、cat uart.h | 二、cat uart.c \\\\\////////// 一、cat uart.h #ifndef __UART_H__ #define __UART_H__ typedef volatile unsigned int U32 ; //Uart #define GPA0CON *(U32 *)0x11400000 #define com0base 0x13800000 //com3 #define ULCON0 *(U32 *)(com0base + 0x0000) #define UCON0 *(U32 *)(com0base + 0x0004) #define UFCON0 *(U32 *)(com0base + 0x0008) #define UMCON0 *(U32 *)(com0base + 0x000C) #define UTRSTAT0 *(U32 *)(com0base + 0x0010) #define UERSTAT0 *(U32 *)(com0base + 0x0014) #define UFSTAT0 *(U32 *)(com0base + 0x0018) #define UMSTAT0 *(U32 *)(com0base + 0x001C) #define UTXH0 *(U32 *)(com0base + 0x0020) #define URXH0 *(U32 *)(com0base + 0x0024) #define UBRDIV0 *(U32 *)(com0base + 0x0028) #define UFRACVAL0 *(U32 *)(com0base + 0x002C) #define UINTP0 *(U32 *)(com0base + 0x0030) // 初始化Uart0 int init_uart(void) // 获取一个字符 char get_char(void); // 输出一个字符 void put_char(char ch); // 获取一个字符串 int gets(char* string); // 输出一个字符串 int puts(char* string); // 字符串比较 int strcmp(char* srcstr, char* diststr); // 打印输出printf int printf(char* fmt, ...); // 计算字符串的长度 int strlen(char* str); // 输出一个数字 void put_num(int num); // 以十六进制输出数字 void put_hex(int num); // 数字转换成十六进制字符 char ntohex(int num); // 以2进制输出数字 void put_bin(int num); // 输出一行字符串 void put_line(char* string); // 修剪字符串右侧的空白字符 char* trimr(char* string); // 修剪字符串左侧的空白字符 char* triml(char* string); // 修剪字符串左右的空白字符 char* trim(char* string); #endif //__UART_H__ 二、cat uart.c #include "uart.h" /** * 初始化Uart0 */ int init_uart(void) { //configure RX0,TX0 as Uart GPA0CON &= ~(0xff); GPA0CON |= 0x22; //controler //configure Uart as 8N1 ULCON0 &= ~0x3 ; ULCON0 |= 0x3 ; //set RX TX as polling mode UCON0 &= ~0x3f ; UCON0 |= 5 ; //set baud rate as 115200 Pclock as 100M UBRDIV0 = 53 ; UFRACVAL0 = 4 ; } char get_char(void) { /** * 尽可能等待数据 */ while((UTRSTAT0 & 0x1) == 0) delays( 0xffff); return URXH0; } void put_char(char ch) { /** * 一定要等待数据写完 */ while((UTRSTAT0 & 0x4) == 0) delays( 0xffff); UTXH0 = ch; } int gets(char* string) { puts("[zjf@root ]# "); int i = 0; for(i = 0; i < 1024-1; i++){ while((UTRSTAT0 & 0x1) == 0) delays( 0xffffff); string[i] = URXH0; if(string[i] == ' '){ put_char(' '); put_char(' '); string[i] = '