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));
}
tiny4412 UART for C printf Demo的更多相关文章
- 使用SWO代替UART,实现Printf打印功能
JTAG接口中,有个SWO引脚,一直没有在意,也没有去研究过是干嘛用的.直到发现ST-LINK V2-1上也有个SWO引脚,于是去研究学习它的作用,用起来相比UART方得便多. 本文内容已经整理成PD ...
- STM32.printf
printf("\r\n this is a usart printf demo \r\n"); Use Micro LIB 需要勾选这个库 将串口定义成 printf 函数 #i ...
- 第50章 读写内部FLASH—零死角玩转STM32-F429系列
第50章 读写内部FLASH 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fire ...
- 20145212&20145204信息安全系统实验四报告
一.实验内容与步骤 1.本次实验建立在掌握嵌入式开发平台使用方法和配置方法的基础上,要求使用windows xp,linux(red hat),arm三个系统(即NFS方式): 2.在linux系统中 ...
- SAM4E单片机之旅——18、通过AFEC(ADC)获取输入的电压
很多时候,一个电压不仅仅需要定性(高电平或者低电平),而且要定量(了解具体电压的数值).这个时候就可以用到模数转换器(ADC)了.这次的内容是测量开发板搭载的滑动变阻器(VR1)的电压,然后把ADC转 ...
- 信息安全系统设计基础实验四:外设驱动程序设计 20135211李行之&20135216刘蔚然
北京电子科技学院(BESTI) 实 验 报 告 封面 课程:信息安全系统设计基础 班级:1352 ...
- 信息安全系统设计基础exp_4
北京电子科技学院(BESTI) 实 验 报 告 课程:信息安全系统设计基础 班级:1353 姓名:郑伟.吴子怡 学号:20135322.20135313 指导教师: 娄嘉鹏 实验 ...
- C/C++控制Windows关机/注销/重启的正确姿势
简介 说到代码控制Windows关机/注销/重启的方式,有很多种,最简单的不过就是控制命令行,使用system("pause")函数执行一个shutdown -s -t 0,关机就 ...
- C++解析(4):引用的本质
0.目录 1.引用的意义 2.特殊的引用 3.引用的本质 4.函数返回引用 5.小结 1.引用的意义 引用作为变量別名而存在,因此在一些场合可以代替指针 引用相对于指针来说具有更好的可读性和实用性 注 ...
随机推荐
- 禁用表单元素 && 禁止选中
一.禁用表单元素 1.dom设置属性 disabled="disabled" || disabled=true 2.css样式(高版本浏览器) pointer-events:non ...
- 一个很棒的Flutter学习资源列表
目录 文章 一开始 HOWTO文档 网站/博客 高级 视频 组件 演示 UI 材料设计 图片 地图 图表 导航 验证 文字和富文本 分析.流量统计 自动构建 风格样式 媒体 音频 视频 语音 存储 获 ...
- python - 面向对象编程(初级篇)
写了这么多python 代码,也常用的类和对象,这里准备系统的对python的面向对象编程做以下介绍. 面向对象编程(Object Oriented Programming,OOP,面向对象程序设计) ...
- Interactive Reporting , SQL*Net not loaded successfully 问题的解决。
.bashrc 什么的,早就把 TNS_ADMIN , 和 LD_LIBRARY_PATH 加进去了,可就是不好使. 终极方法还是在 workspace 的 R&A -> Service ...
- LeetCode--027--移除元素
问题描述: 给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间 ...
- memcached客户端连接建立过程笔记
memcached在启动过程初始化server_sockets时,根据启动参数决定系统是进行tcp监听还是udp监听,这里暂时只关注tcp的情况. server_socket在初始化时会向系统申请监听 ...
- Java中/r和/n的区别
/n换行符,效果是新换一行,光标在原有位置下一行 /r回车符,效果是光标来到下一行行首
- 关于最短路的想法&&问题
今天本想水几道floyd却被坑了:注意考虑<重边>!!!!!!!!!!!!!!! 小心图里出现的重边,如果不处理的话,必然WA!构图时一定要仔细!
- create view
create view View_count as SELECT spkfk.spid, pf_ckmx.rq, pf_ckmx.spid AS Expr1, pf_ckmx.shl, spk ...
- Import Data from *.xlsx file to DB Table through OAF page(转)
Use Poi.jar Import Data from *.xlsx file to DB Table through OAF page Use Jxl.jar Import Data from ...