ATIME

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

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引脚功能和设置串口的帧结构和串口波特率。
串口的读写数据都有专用的寄存器负责,使用很简单,从代码中可以看出。
/*
 * 初始化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;
}




点赞