• S5PV210 串口配置与实验(轮询方式)


    S5PV210 UART 相关说明

    通用异步收发器简称 UART, 即 UNIVERSAL ASYNCHRONOUS RECEIVER AND TRANSMITTER,它用来传输串行数据。发送数据时, CPU 将并行数据写入 UART,UART 按照一定的格式在一根电线上串行发出;接收数据时, UART 检测另一根电线的信号,将串行收集在缓冲区中, CPU 即可读取 UART 获得这些数据。

    在 S5PV210 中, UART 提供了 4 对独立的异步串口 I/O 端口,有 4 个独立的通道,每个通道可以工作于 DMA 模式或者中断模式。其中,通道 0 有 256byte 的的发送 FIFO 和 256byte 的接收 FIFO,通道 1 有 64byte 的的发送 FIFO 64byte 的接收 FIFO,而通道 2 和 3 只有 16byte 的的发送 FIFO 和 16byte 的接收 FIFO。

    S5PV210 的 UART 结构图如下:

    串口初始化程序

    void uart_init()
    {
        /* 1 配置引脚用于 RX0/TX0 功能 */
        GPA0CON = 0x22;
        
        /* 2 设置数据格式等 */
        UFCON0 = 0x1;   // 使能 FIFO
        UMCON0 = 0x0;   // 无流控
        ULCON0 = 0x3;   // 数据位:8, 无校验, 停止位: 1
        UCON0 = 0x5;    // 时钟: PCLK,禁止中断,使能 UART 发送、接收
        
        /* 3 设置波特率 */
        UBRDIV0 = UART_UBRDIV_VAL;     // 34
        UDIVSLOT0 = UART_UDIVSLOT_VAL; // 0xDFDD
    }
    

    程序分析:

    第一步 配置引脚用于 RX0/TX0 功能

    GPA0CON 寄存器如下图所示:

    配置 GPA0CON = 0x22。

    第二步 设置数据格式

    ULCON0 寄存器如下图所示:

    Word Length = 11,8bit 的数据;
    Number of Stop Bit = 0,1bit 的停止位;
    Parity Mode = 000,无校验;
    Infrared Mode =0,使用普通模式;
    所以 ULCON0 = 0x3。
    

    第三步 配置 UART

    UCON0 寄存器如下图所示:


    Receive Mode = 01 ,使用中断模式或者轮询模式;
    Transmit Mode = 01,使用中断模式或者轮询模式;
    Send Break Signal = 0,普通传输;
    Loop-back Mode = 0,不使用回环方式;
    我们采用轮询的方式接受和发送数据,不使用中断,所以 bit[6-9]均为 0;
    Clock Selection = 0,使用 PCLK 作为 UART 的工作时钟;
    我们不使用 DMA,所以 bit[16]和 bit[20]均为 0;
    所以 UCON0 = 0x5。
    

    第四步 UFCON0 和 UMCON0

    这两个寄存器比较简单, UFCON0 用来使能 FIFO, UMCON0 用来设置无流控。

    第五步 设置波特率

    主要是配置如下两个寄存器:

    波特率设置相关公式:

    UBRDIVn + (num of 1's in UDIVSLOTn)/16 = (PCLK / (bps x 16)) −1
    

    UART 工作于 PSYS 下,所以 PCLK 即 PCLK_PSYS = 66MHz,我们的波特率 bps 设置为 115200,所以

    (66MHz/(115200 x 16)) – 1 = 34.80 = UBRDIVn + (num of 1's in UDIVSLOTn)/16
    

    所以,设置 UBRDIV0 = 34,num of 1's in UDIVSLOTn = 13。

    根据下图得出 UDIVSLOTn 的值(友善的手册中直接用的(num of 1's in UDIVSLOTn)这个值):

    轮询方式接收和发送一个字符

    /* 接收一个字符 */
    char getc(void)
    {
        while ((UFSTAT0 & 0xff) == 0); // 如果 RX FIFO 空,等待
        return URXH0; // 取数据
    }
    /* 发送一个字符 */
    void putc(char c)
    {
        while (UFSTAT0 & (1<<24)); // 如果 TX FIFO 满,等待
        UTXH0 = c; // 写数据
    }
    

    通过读 UFSTAT0 发送/接收状态寄存器,当 Rx FIFO Count 不为 0 时说明接收到数据,读 URXH0 寄存器可以得到 8bit 的数据; 当 Tx FIFO Full = 0 时说明可以发送数据,写 8bit 的数据到 UTXH0。

    UFSTAT0 寄存器如下图所示:

    所做修改

    在《友善之臂210手册》中,讲解的是通过 UTRSTAT0 这个 buffer state reg 来查看当前的状态,因为我们采用的 FIFO模式,并且 UTRSTAT0 与程序所用 Reg 也不符,所以手册中显然是错误的,我们写的分析是修改过的。(可能我参考的手册并不是友善之臂的最新版,没有检察出有此处小错误)

    本篇文章参考:《友善之臂210手册》

  • 相关阅读:
    PHP0002:PHP基础1
    NodeJS_0001:关于install的方式
    JN_0018:运行窗口不显示
    事务、事务操作、事务隔离级别
    MySQL 常见的两种存储引擎
    8:二叉树的下一个节点
    链表
    文件压缩
    MapReduce--Shuffle原理
    volatile关键字
  • 原文地址:https://www.cnblogs.com/GyForever1004/p/8448288.html
Copyright © 2020-2023  润新知