zoukankan      html  css  js  c++  java
  • ARM裸编程系列---UART

    S5PV210 UART说明
    通用异步收发器缩写UART,这是UNIVERSAL ASYNCHRONOUS RECEIVER AND TRANSMITTER。它被用来传送串行数据。当发送数据,CPU将并行数据写入UART,UART依照一定的格式在一根电线上串行发出;接收数据 时。UART检測还有一根电线的信号,将串行收集在缓冲区中。CPU就可以读取UART获得这些数据。
    在S5PV210中。UART提供了4对独立的异步串口I/Oport,有4个独立的通道,每个通道能够工作于DMA模式或者中断模式。当中,通道0有 256byte的的发送FIFO和256byte的接收FIFO,通道1有64byte的的发送FIFO和64byte的接收FIFO,而通道2和3仅仅有 16byte的的发送FIFO和16byte的接收FIFO。
    S5PV210的uart结构图例如以下:
    uart结构图

    UART使用标准的TTL/CMCOS逻辑电平来表示数据,为了增强数据抗干扰能力和提高传输长度,通常将TTL/CMOS逻辑电平转换为RS-232逻辑电平,查看原理图可知Mini210S使用的是MAX3232SOP芯片,使用的是TX0和DX0:
    GEC210UART原理图
    搜索“XuTXD0”,可知:
    芯片连接图
    通过设置UART相关寄存器。我们就能够驱动UART工作,达到发送和接收字符的目的。
    样例:

    int main()
    {
    char c;
    uart_init(); // 初始化串口
    while (1)
    {
    c = getc (); // 接收一个字符c
    putc(c+1); // 发送字符c+1
    }
    return 0;
    }

    在main函数中。先会调用uart_init()初始化UART。然后使用getc接收PC发过来的字符,再调用putc()将该字符+1回复给PC。

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

    上述代码共同拥有3个步骤。以下我们来一一解说每个步骤:
    第一步 配置引脚用于RX/TX功能
    參考UART引脚连接图,我们须要设置GPA0CON和GPA1CON寄存器使GPA0和GPA1引脚用于UART功能。
    GPA0CON寄存器图
    GPA1CON寄存器图

    第二步 设置数据格式等
    <1> ULCON0用来设置数据格式,见下图
     ULCON0

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

    <2> 9UCON0是UART的配置寄存器。见下图
    这里写图片描写叙述
    这里写图片描写叙述

    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

    <3> UFCON0和UMCON0
    这两个寄存器比較简单,UFCON0用来使能FIFO,UMCON0用来设置无流控。

    第三步 设置波特率
    波特率即每秒传输的数据位数。涉及两个寄存器:UBRDIV0和UDIVSLOT0
    这里写图片描写叙述
    这里写图片描写叙述

    波特率设置相关公式:UBRDIVn + (num of 1’s in UDIVSLOTn)/16 = (PCLK / (bps x 16)) ?1
    当中,由Maximum Operating Frequency for Each Sub-block图可知。UART工作于PSYS下,所以PCLK即PCLK_PSYS = 66.5MHz,我们的波特率bps设置为115200,所以
    (66.5MHz/(115200 x 16)) – 1 = 35.08 = UBRDIVn + (num of 1’s in UDIVSLOTn)/16,所以我们设置UBRDIV0=35。UDIVSLOT0=0x1
    getc()和putc()的代码例如以下:
    // 接收一个字符
    char getc(void)
    {
    while ((UFSTAT0 & 0xff) == 0); // 假设RX FIFO空,等待
    return URXH0; // 取数据
    }
    // 发送一个字符
    void putc(char c)
    {
    while (UFSTAT0 & (1<<24)); // 假设TX FIFO满,等待
    UTXH0 = c; // 写数据
    }
    UART数据发送寄存器

    UART数据接收寄存器
    发送/接收状态寄存器

    通 过读UTRSTAT0 发送/接收状态寄存器,当Receive buffer data ready= 1时说明接收到数据,读URXH0寄存器能够得到8bit的数据;当Transmitter empty = 1时说明能够发送数据,写8bit的数据到UTXH0。
    完整代码地址:https://github.com/zhouhui321/gec210-nos/tree/master/uart_putchar

    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    FFmpeg之cmdutils.h源码
    iOS文件操作一览
    ffmpeg结构体SpecifierOpt说明文档
    主要流媒体协议介绍
    HTTP Live Streaming直播(iOS直播)技术分析与实现(转)
    XCode快捷键总结
    ALAssetsLibrary获取相册列表
    iOS教程之ASIHttpRequest(源自51CTO.com)
    libxml/tree.h not found(XCode 4.5&5.1解决方案)
    MyBatis——Log4J(日志)
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4945556.html
Copyright © 2011-2022 走看看