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.引用的意义 引用作为变量別名而存在,因此在一些场合可以代替指针 引用相对于指针来说具有更好的可读性和实用性 注 ...
随机推荐
- sublime text3 (Mac) 快捷键
符号说明 符号 说明 ⌘ command ⌃ control ⌥ option ⇧ shift ↩ enter ⌫ delete 打开/关闭/前往 快捷键 功能 ⌘⇧N 打开一个新的sublime窗口 ...
- CKEditor5 基本使用
1.引入 <script type="text/javascript" src="/plugin/ckeditor5/ckeditor.js">&l ...
- map/multimap_01
标准的关联式容器 键值对序列 基于key的快速检索能力 key按序排列,按序插入 红黑树变体的平衡二叉树 对key来说支持 mapT[key] 和 mapT.at(key) multimap 不支持 ...
- BN层
论文名字:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift 论 ...
- python调用虹软2.0第三版
这一版,对虹软的功能进行了一些封装,添加了人脸特征比对,比对结果保存到文件,和从文件提取特征进行比对,大体功能基本都已经实现,可以进行下一步的应用开发了 face_class.py from ctyp ...
- 算法笔记--STL中的各种遍历及查找(待增)
算法笔记 map: map<string,int> m; map<string,int>::iterator it;//auto it it = m.begin(); whil ...
- Java 常用对象-String类
2017-11-02 20:02:06 String:代表字符串.Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现. 字符串是常量:它们的值在创建之后不能 ...
- 『cs231n』循环神经网络RNN
循环神经网络 循环神经网络介绍摘抄自莫凡博士的教程 序列数据 我们想象现在有一组序列数据 data 0,1,2,3. 在当预测 result0 的时候,我们基于的是 data0, 同样在预测其他数据的 ...
- python-day33--Process类中的方法及属性
p.daemon = True -->守护进程,守护进程不可以再有子进程,并且主进程死守护进程就死,要写在p.start()之前 p.join() ---> 主进程等子进程执行完 之后再结 ...
- python-day21--time模块
一.三种表示方法 1.时间戳(timestamp): time.time( ) #得到的是float类型 2.格式化(Format String): time.strftime('%Y/% ...