11_UART
文章目录
- 11_UART
- 1、串口连接芯片图
- 2、串口传输一个字节的过程
- 3、发送接收过程
- 4、编写UART函数
- 4.1、初始化函数uart0_init()
- 4.1.1、设置引脚用于串口
- 4.1.2、使能上拉
- 4.1.3、设置波特率
- 4.1.4、设置数据格式
- 4.2、int putchar(int c)函数
-
- 4.3、int getchar(void)函数
-
- 4.4、int puts(const char *s)函数
- 5、UART头文件
- 6、main函数
- 7、编写自己的printf测试函数
串口打印调试信息,外界各种设备
1、串口连接芯片图
2、串口传输一个字节的过程
传输数据时的逻辑电平如下两图:
3、发送接收过程
波特率:115200,8n1
每一位:t = 1/115200
传输1Byte:需要10位(start, Data, Stop)
t = 10 / 115200
1秒能传输:1/t = 115200/10 = 11520 byte
4、编写UART函数
4.1、初始化函数uart0_init()
编写初始化函数:void uart0_init()
4.1.1、设置引脚用于串口
//GPH2,3用于TxD0,RxD0
GPHCON &= ~((3<<4) | (3<<6));
GPHCON |= ((2<<4) | (2<<6));
4.1.2、使能上拉
//使能内部上拉使得引脚在平时为高电平
GPHUP &= ~((1<<2) | (1<<3));
4.1.3、设置波特率
设置UCON0寄存器
UBRDIV0 = (int)( UART clock / ( buad rate x 16) ) –1
UART clock = PCLK = 50MHz
UBRDIV0 = (int)( 50000000 / ( 115200 x 16) ) –1 = 26
UCON0 = 0x00000005;
4.1.4、设置数据格式
ULCON0 = 0x00000003;
4.2、int putchar(int c)函数
4.2.1、判断状态
while (!(UTRSTAT0 & (1<<2)));
此位为0表明上一次的数据还没发送出去,等待。
4.2.2、发送数据
UTXH0 = (unsigned char)c;
寄存器UTXH0定义为unsigned char类型。
4.3、int getchar(void)函数
4.3.1、判断状态
while (!(UTRSTAT0 & (1<<0)));
此位为0表明上一次的数据还没接收,等待。
4.3.2、返回接收到的数据
return URXH0;
4.4、int puts(const char *s)函数
输出字符串函数:
while(*s)
{
putchar(*s);
s++;
}
5、UART头文件
#ifndef _UART_H
#define _UART_H
void uart0_init();
int putchar(int c);
int getchar(void);
int puts(const char *s);
#endif
6、main函数
#include "s3c2440_soc.h"
#include "uart.h"
int main(void)
{
unsigned char c;
uart0_init();
puts("Hello,world!\n\r");
while(1) {
c = getchar();
if (c == '\r') {
putchar('\n');
}
if (c == '\n') {
putchar('\r');
}
putchar(c);
}
return 0;
}
7、编写自己的printf测试函数
Printf中的格式字符:
my_printf测试函数:
#include <stdio.h>
typedef char * va_list;
#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )
#define va_arg(ap,t) (*(t *)(ap = ap +_INTSIZEOF(t),ap -_INTSIZEOF(t)))
#define va_end(ap) ( ap = (va_list)0 )
struct person{
char *name;
int age;
char score;
int id;
};
int push_test(const char *format, ...)
{
int i;
struct person per;
char c;
double d;
va_list p;
printf("arg1: %s\n",format);
va_start(p, format);
i = va_arg(p, int);
printf("arg2: %d\n",i);
per = va_arg(p, struct person);
printf("arg3: .name = %s, .age = %d, .score= %c, .id=%d\n",\
per.name, per.age, per.score, per.id);
c = va_arg(p, int);
printf("arg4: %c\n",c);
d = va_arg(p, double);
va_end( p );
printf("arg5: %f\n",d);
return 0;
}
int main(int argc,char **argv)
{
struct person per={"Zhang Dengyu",23,'A',191040043};
printf("sizeof(char )=%d\n",sizeof(char ));
printf("sizeof(int )=%d\n",sizeof(int ));
printf("sizeof(char *)=%d\n",sizeof(char *));
printf("sizeof(char **)=%d\n",sizeof(char **));
printf("sizeof(struct person)=%d\n",sizeof(struct person));
push_test("HDU_DZ_ZDY",8023,per,'c',3.14);
return 0;
}
代码解析:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)