/**************************************************************************
* 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. c++ 二分法查找(binary_search)

    #include <iostream> // cout #include <algorithm> // binary_search, sort #include <vec ...

  2. resource not found :rgbd_launch

    放到src下,再次编译catkin_make git https://github.com/ros-drivers/rgbd_launch.git

  3. Unix网络编程_卷1卷2

    1. UNIX 网络编程(第2版)第1卷:套接口API和X/Open 传输接口API PDFhttp://www.linuxidc.com/Linux/2014-04/100155.htm UNIX网 ...

  4. DDD领域模型和充血对象

    DDD领域模型 官方说法 领域驱动设计,它是对面向对象的的分析和设计(OOAD,Object Orient Analysis Design)的一个补充,对技术框架进行了分层规划,同时对每个类进行了策略 ...

  5. Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks论文理解

    一.创新点和解决的问题 创新点 设计Region Proposal Networks[RPN],利用CNN卷积操作后的特征图生成region proposals,代替了Selective Search ...

  6. js 事件相关 事件处理 封装 事件封装 DOM 0 2 3 级事件

    1.绑定 function(element, type, handler){        if (element.addEventListener) {            element.add ...

  7. Oracle 起诉 Google 事件

    最近,Google 和 Oracle 纠缠多年的“Java 侵权案”又有了新的判决结果.Google 在此次对决中败诉,并可能需要支付高达88亿美元的赔偿金.这个案件还引发关于 API(应用程序编程接 ...

  8. sgu 116 Index of super-prime

    题意:用最少的super-prime组成n; 找出所有的super-prime数,只有202个.用完全背包记录能取到n值的最少数量.再找出7要哪些元素. #include <iostream&g ...

  9. Confluence 6 设置公共访问备注

    你不能为匿名用户赋予空间管理员或者限制权限. 你可以让用户自行注册你的 Confluence 站点,同时也可以选择其他的用户注册选项,比如邀请用户注册等.请查看:Add and Invite User ...

  10. Weird journey CodeForces - 788B (路径计数)

    大意:$n$结点$m$条边无向图, 满足 $(1)$经过$m-2$条边$2$次 $(2)$经过其余$2$条边$1$次 的路径为好路径, 求所有好路径数 相当于边加倍后再删除两条边, 求欧拉路条数 首先 ...