-
UART
串口编程
首先明确一点:我们学习的串口是异步串口。在传输时,他们
各自有各自的时钟。就是我们说的波特
率。
我们学习的
RS232
与
UART
的区别是,<
/p>
UART
使用标准的
TTL/COMS<
/p>
电平
进过一个芯片使它的高低电平
p>
从
TTL
中
0
p>
与
3.3V
变成了
低电平
5v
到
15v
高电平
-3v
到
-12v
。
首先说一下串口的数据帧格式。它
由一个开始位,数据位,校验位和停止位组成。
平时数据处于
1
状态。
当要开始发送时,
从
UART
改变
TxD
数据变成
0
状态
1
个位的时间,
在接受端到<
/p>
0
之后的
1.5
位的时间,
接收端开始接受数据。
数据位分为
5
,
6
,
7
,
8
。四种类型的数据位。之后就是校验位站
1
位,可以设置也可以不设置。最后
的是停止位。可以是<
/p>
1
位,
1.5
位
,
2
位。这个是高电平
1
。
UAR
T
可以用中断或
DMA
来工作。它有<
/p>
3
个单独的通道。它由
4
部分组成,发送器,接收器,波特率发
生器,控制逻辑组成。
< br>
这些部分的设置都是通过寄存器来实现的。
发送的过程是这样的,
UART
只能通过
shifter
一位一位的来发数据。它先把要发的数据放到它的缓存
FIFO
里,当然缓存也可以取消。然后放入
shifter
里
面来发出去。接受也是一样的。通过缓存来接受,然
后再通过接受的
shifter
来接。
具体继电器的设置主要由以下几个:
ULCON
逻辑数据桢格式控制器
UCON
串口的控制继电器
UFCON
FIFO
控制寄存器
UMCON
串口
< br>MODEN
控制器
(可以控制
AFC
自动流控制)
以下是状态寄存器,用来确定状态的,比如说
shifter
发送器的状态,接收器的状态。
UTRSTAT
接受发送控制器
UERSTAT
错误状态寄存器
UFSTAT
FIFO
状态寄存器
最后一个单独的设置寄存器,它用来设置波特率
UBRDIV
波特率发生器
以下来写个简单的串口例子。
它不使用
FIFO
中断
而直接用
shifter
收发,采用轮询的方式来检测数据是否发送或被接受。然后通
过
minicom
向开发板发送
1
表示亮灯,发送
2
表示熄灯
。
文件
总共是
7
个
一个
efile
crt0.s
是关闭
watchdog
并跳转到
mian
之后用个
deadloop
。
.text
.globl _start
_start
:
ldr
r0
,
=0x53000000 @ WATCHDOG
close
mov
r1
,
#0x0
str
r1
,
[
r0
]
ldrsp
,
=1024*4
@set stack
,
but the capitcy
of cache is only 4k
bl main
halt_loop
:
bhalt_loop
第
2
p>
个是
addr.h
用来写寄存器的宏定义。
#ifndef ADDR_H
#define ADDR_H
#define GPECON
(
*
(
volatile unsigned int *
)
0x56000040
)
#define
GPEDAT
(
*
(
volatile unsigned int *
)
0x56000044
)
#define GPE12_out
(
1
《《(
12*2
))
#define GPE13_out
(
1
《《(
13*2
))
#define
GPHCON
(
*
(
volatile unsigned int *
)
0x56000070
)
#define GPHUP
(<
/p>
*
(
volatile
unsigned int *
)
0x56000074
)
#define ULCON0
(
*
(
volatile unsigned int *
)
0x50000000
)
#define
UCON0
(
*
(
< br>volatile unsigned int *
)
0
x50000004
)
#define UFCON0
(
*
(
volatile
unsigned int *
)
0x50000008
)
#define UMCON0
(
*
(
volatile unsigned int *
)
0x5000000C
)
#define
UTRSTAT0
(
*
(
volatile unsigned int *
)
0x50000010
)
#define UFSTAT0
(
*
(
volatile
unsigned int *
)
0x50000018
)
#define UTXH0
(
*<
/p>
(
volatile unsigned int *
)
0x50000020
)
#define URXH0
(
*
(
vol
atile unsigned int *
)
0x50000
024
)
#define UBRDIV0
(
*
(
volatile unsigned int *
)
0x50000028
)
< br>
#endif
第
3
p>
个文件来写
uart.h
,这是个我们的功
能
#ifndef UART_H
#define UART_H
void uart_init
()
;
//
初始化继电器
void
uart_write
(
char
*a
)
;
//
串口写一行
void
uart_read
(
char
*a
,
int
n
)
; //
串口读
< br>n
个字
void
uart_read_line
(
char
*a
)
;
//
读一行
void
led_on
()
;
//
开灯
void led_off
()
;
//
关灯
#endif
< br>第
4
个文件具体来写
uart.
C
#include“uart.h”
#include“addr.h”
#define
UART_CLK 50000000
//
我们用的是
PCLK 50MHz
#define
UART_BAUD_RATE 115200
//
比特率是
115200
#define UART_BRD
(
int
)(
UART_CLK/<
/p>
(
UART_BAUD_RATE
*16
))
-1
//
计算公式的宏
void
uart_init
()
{
GPHCON |=0xa0; //
这个是
< br>TXD0
与
RXD0
的设置,他
们用的是
GPH2
和
3
复用的特殊
GPHUP = 0x0c;
//
功能,所以还要在这设置上拉电阻,以区别高低电平的。
ULCON0 = 0x3; /
/
桢格式的设置
8
个数据位,无校验<
/p>
UCON0 = 0x5;
//
选择的是中断与轮询模式
UFCON0 = 0;
//
不设
FIFO
UMCON0 = 0;
//
不设
AFC
UBRDIV0 = UART_BRD;
//
设置波特率