tiny4412 UART for C printf Demo

时间:2023-03-09 22:45:26
tiny4412 UART for C printf Demo
/**************************************************************************
* 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 |= ; //set baud rate as 115200 Pclock as 100M
UBRDIV0 = ;
UFRACVAL0 = ;
} char get_char(void)
{
/**
* 尽可能等待数据
*/
while((UTRSTAT0 & 0x1) == )
delays( 0xffff);
return URXH0;
} void put_char(char ch)
{
/**
* 一定要等待数据写完
*/
while((UTRSTAT0 & 0x4) == )
delays( 0xffff);
UTXH0 = ch;
} int gets(char* string)
{
puts("[zjf@root ]# "); int i = ;
for(i = ; i < -; i++){ while((UTRSTAT0 & 0x1) == )
delays( 0xffffff); string[i] = URXH0;
if(string[i] == '\r'){ put_char('\n');
put_char('\r'); string[i] = '\0'; return i+;
}
if(string[i] == '\b'){
if (i == ){
string[i] = '\0';
continue;
}
//清除当前输入的'\b', 并换成'\0',并用空格覆盖前面那个字符,同时输出一次
string[i--] = '\0';
string[i] = ' ';
put_char('\r');
puts("[zjf@root ]# ");
puts(string); //将前面换成空格的字符换成'\0'结束符, 在输出一次,
//主要是为了让光标往前移一个字符
string[i--] = '\0';
put_char('\r');
puts("[zjf@root ]# ");
puts(string);
continue;
}
if(string[i] == ){ //ctrl+c
//清除string中所有的数据
int j = ;
for(j = ; j <= i; j++){
string[j] = '\0';
}
//输出<ctrl+c>等字符
puts("<Ctrl+c>\r\n");
puts("[zjf@root ]# ");
//将i置为起始位
i = -;
continue;
}
if(string[i] == ){
//清除string中所有的数据
int j = ;
for(j = ; j <= i; j++){
string[j] = '\0';
}
//输出<ctrl+c>等字符
puts("<Ctrl+d>\r\n");
return ;
}
put_char(string[i]);
}
} int puts(char* string)
{
int i = ;
while(string[i]){
put_char(string[i]);
i++;
}
return i;
} void put_line(char* string)
{
puts(string);
puts("\r\n");
} int strcmp(char* srcstr, char* diststr)
{
while((*srcstr) && (*diststr) && ((*srcstr) == (*diststr))){
srcstr++;
diststr++;
}
return (*srcstr)-(*diststr);
} int bzero(char* string, int size)
{
if(size < ){
return ;
} int i = ;
if(strlen(string) >= size){
for (i = ; i < size; i++){
string[i] = '\0';
}
return i;
}else{
int length = strlen(string);
for (i = ; i < length; i++){
string[i] = '\0';
}
return length;
}
} int printf(char* fmt, ...)
{
unsigned int ** begin_add = (unsigned int **)(&fmt);
char ch = '\0';
int num = ;
while (ch = (*(fmt++))) {
if (ch == '%') {
ch = (*(fmt++));
if (ch == 'd') {
num = (int)(*(++begin_add));
if(num >= ){
put_num(num);
}else{
put_char('-');
put_num((~num)+);
}
}
if (ch == 's') {
puts((char *)(*(++begin_add)));
}
if ((ch == 'x') || (ch == 'p')){
put_char('');
put_char('x');
put_hex((int)(*(++begin_add)));
}
if (ch == 'b') {
put_char('');
put_char('b');
put_bin((int)(*(++begin_add)));
}
if (ch == '%'){
put_char(ch);
} continue;
}
put_char(ch);
}
} void put_num(int num){
if(num < ){
put_char(num+'');
return;
} put_num(num/); put_char(num%+'');
} int atoi (char* string)
{
int i = ;
trim(string);
char ch = '\0';
int num = ;
if(string[] != '-'){
while(ch = string[i++]){
if ((ch < '') || (ch > '')) {
return ;
}
num *= ;
num += (ch-'');
}
}else{
//pass the '-'
i++;
while(ch = string[i++]){
if ((ch < '') || (ch > '')) {
return ;
}
num *= ;
num += (ch-'');
}
num = (~num) + ;
}
return num;
} int strlen(char* str)
{
int count = ;
while(str[count++]);
return count-;
} void put_bin(int num){
if(num < ){
put_char(num+'');
return ;
}
put_bin(num/);
put_char(num%+'');
} void put_hex(int num){
char ch = '\0';
if(num < ){
ch = ntohex(num);
put_char(ch);
return ;
}
put_hex(num/);
ch = ntohex(num%);
put_char(ch);
} char ntohex(int num)
{
if (num < || num > ) {
return '\0';
}
if (num < ) {
return ''+num;
}
switch (num) {
case :
return 'A';
case :
return 'B';
case :
return 'C';
case :
return 'D';
case :
return 'E';
case :
return 'F';
}
} char* trimr(char* string)
{
if(string == '\0' || string[] == '\0')
return '\0'; int i = ;
i = strlen(string);
for(i--; i >= ; i--){
if((string[i] == ' ') || (string[i] == '\t')){
string[i] = '\0';
}else{
return string;
}
}
} char* triml(char* string)
{
if(string == '\0' || string[] == '\0')
return '\0'; int i = ;
int j = ;
while((string[i] == ' ') || (string[i] == '\t'))
i++;
while(string[i]){
string[j++] = string[i++];
}
string[j] = '\0';
return string;
} char * trim(char* string)
{
if(string == '\0' || string[] == '\0')
return '\0';
return trimr(triml(string));
}