嵌入式裸机程序之串口程序

1.串口通信

串行接口是一种可以将接受来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接受的串行数据流转换为并行的数据字符供给CPU的器件。一般完成这种功能的电路,我们称为串行接口电路。在学习单片机时,通常调试程序都需要先将串口程序调试完成,在此基础上,可以在后续调试程序中使用串口打印数据,设置断点。

嵌入式裸机程序的编写过程中,尤其在没有显示屏幕的情况下,需要串口来配合调试.

2.S3C2440 UART控制器

S3C2440 UART控制器,提供了三个独立的异步串行I/O端口,每个端口都可以在中断模式或DMA模式下工作。也就是说,S3C2440的 UART可以生成中断或DMA请求用于CPU和UART之间的数据传输。UART串口挂接在APB总线上,APB总线最高可以达到50MHz工作频率,在使用APB时钟频率时可以达到最高115.2Kbps波特率的通信速度。如果UART串口接收外部设备提供外部时钟,UART可以在更高的速度下工作。每个UART串口在接收装置和发送装置里分别包含一个64Byte的FIFO缓冲区,用于缓存发送数据和接收数据。

3.帧结构

UART在通信之前要在发送端和接收端约定好帧结构,也就是约定好传输数据帧格式。l  开始位:必须包含在数据帧中,表示一个帧的开始。

l  数据位:可选5,6,7,8位,该位长度可由编程人员指定。

l  校验位:如果在开启了数据校验时,该位必须指定。

l  停止位:可选1,2位,该位长度可由编程人员指定。

通信双方约定好帧格式后,指定同一波特率,以保证双方数据传输的同步。

4.核心代码

S3C2440的串口程序核心代码如图所示,最少需要这三个函数:串口初始化,串口发送,串口接收。同单片机一样,串口初始化也就是需要设置IO引脚功能和设置串口的帧结构和串口波特率。

串口的读写数据都有专用的寄存器负责,使用很简单,从代码中可以看出。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
/*
* 初始化UART0
* 115200,8N1,无流控
*/
void uart0_init(void)
{
GPHCON |= 0xa0; // GPH2,GPH3用作TXD0,RXD0
GPHUP = 0x0c; // GPH2,GPH3内部上拉

ULCON0 = 0x03; // 8N1(8个数据位,无较验,1个停止位)
UCON0 = 0x05; // 查询方式,UART时钟源为PCLK
UFCON0 = 0x00; // 不使用FIFO
UMCON0 = 0x00; // 不使用流控
UBRDIV0 = UART_BRD; // 波特率为115200
}

/*
* 发送一个字符
*/
void putc(unsigned char c)
{
/* 等待,直到发送缓冲区中的数据已经全部发送出去 */
while (!(UTRSTAT0 & TXD0READY));

/* 向UTXH0寄存器中写入数据,UART即自动将它发送出去 */
UTXH0 = c;
}

/*
* 接收字符
*/
unsigned char getc(void)
{
/* 等待,直到接收缓冲区中的有数据 */
while (!(UTRSTAT0 & RXD0READY));

/* 直接读取URXH0寄存器,即可获得接收到的数据 */
return URXH0;
}

嵌入式裸机程序之串口程序
http://atime.cc/2017/02/09/嵌入式裸机程序之串口程序/
作者
ATIME
发布于
2017年2月9日
许可协议