/**************************************************************************
* 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));
}

tiny4412 UART for C printf Demo的更多相关文章

  1. 使用SWO代替UART,实现Printf打印功能

    JTAG接口中,有个SWO引脚,一直没有在意,也没有去研究过是干嘛用的.直到发现ST-LINK V2-1上也有个SWO引脚,于是去研究学习它的作用,用起来相比UART方得便多. 本文内容已经整理成PD ...

  2. STM32.printf

    printf("\r\n this is a usart printf demo \r\n"); Use Micro LIB 需要勾选这个库 将串口定义成 printf 函数 #i ...

  3. 第50章 读写内部FLASH—零死角玩转STM32-F429系列

    第50章     读写内部FLASH 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fire ...

  4. 20145212&20145204信息安全系统实验四报告

    一.实验内容与步骤 1.本次实验建立在掌握嵌入式开发平台使用方法和配置方法的基础上,要求使用windows xp,linux(red hat),arm三个系统(即NFS方式): 2.在linux系统中 ...

  5. SAM4E单片机之旅——18、通过AFEC(ADC)获取输入的电压

    很多时候,一个电压不仅仅需要定性(高电平或者低电平),而且要定量(了解具体电压的数值).这个时候就可以用到模数转换器(ADC)了.这次的内容是测量开发板搭载的滑动变阻器(VR1)的电压,然后把ADC转 ...

  6. 信息安全系统设计基础实验四:外设驱动程序设计 20135211李行之&20135216刘蔚然

    北京电子科技学院(BESTI) 实 验 报 告 封面 课程:信息安全系统设计基础                                           班级:1352           ...

  7. 信息安全系统设计基础exp_4

    北京电子科技学院(BESTI) 实     验    报     告 课程:信息安全系统设计基础 班级:1353 姓名:郑伟.吴子怡 学号:20135322.20135313 指导教师: 娄嘉鹏 实验 ...

  8. C/C++控制Windows关机/注销/重启的正确姿势

    简介 说到代码控制Windows关机/注销/重启的方式,有很多种,最简单的不过就是控制命令行,使用system("pause")函数执行一个shutdown -s -t 0,关机就 ...

  9. C++解析(4):引用的本质

    0.目录 1.引用的意义 2.特殊的引用 3.引用的本质 4.函数返回引用 5.小结 1.引用的意义 引用作为变量別名而存在,因此在一些场合可以代替指针 引用相对于指针来说具有更好的可读性和实用性 注 ...

随机推荐

  1. Java中的hashcode方法

    一.hashCode方法的作用 对于包含容器类型的程序设计语言来说,基本上都会涉及到hashCode.在Java中也一样,hashCode方法的主要作用是为了配合基于散列的集合一起正常运行,这样的散列 ...

  2. OpenGL入门程序一:绘制简单的矩形

    #include <GL/glut.h> void MyDisplay(void); int main(int argc, char **argv) { //设置窗口的大小 glutIni ...

  3. 20170709pptVBA递归删除LOGO图片与文字

    Public Sub StartRecursionFolder() Dim Pre As Presentation Dim FolderPath As String Dim pp As String ...

  4. java final修饰变量时的一种情况

    有如下一种场景. 1.在文件PaymentConfig.java中存在如下变量public static final desc="描述" 2.类Test.java中使用了desc变 ...

  5. Android之省市区三级联动

    最近项目要做一个电商APP,选择收货地址的三级联动滚动选择组件, 控件用起来非常简单 ,下面是它的运行效果: 布局 <LinearLayout xmlns:android="http: ...

  6. hdu1686字符串kmp

    The French author Georges Perec (1936–1982) once wrote a book, La disparition, without the letter 'e ...

  7. python-day7-数字类型的内置方法

    #=====>part1:数字类型#掌握:int,float#了解:Long(在python2中才有),complex# num=10# num=int(10)# print(type(num) ...

  8. ubuntu mysql主从库的搭建

    1,首先我们要确定一个从库一个主库,紧记从库只能读取不能有其他的操作,如果操作写那主从就失效了,那就看看我们这么搭建主从吧! 2. 环境:Ubuntu,Mysql (主从的数据库版本必须保持一致) 主 ...

  9. 阿里云ECS服务器自定义端口无法访问问题记录

    记住阿里云ECS服务器有个安全组!!! 购买了阿里云服务器的时候,购买界面那里是可以勾选默认的几个端口是否开启的,服务器默认勾了22端口,使用户能登录服务器. 当我们在服务器里面配置nginx,开启自 ...

  10. 算法笔记_025:字符串的全排列(Java)

    目录 1 问题描述 2 解决方案 2.1 递归实现 2.2 字典序排列实现   1 问题描述 输入一个字符串,打印出该字符串的所有排列.例如,输入字符串”abc”,则输出有字符’a’,’b’,’c’所 ...