第11课.串口(UART)的使用

1.UART连线图

S3C2440有3个独立通道的UART

2.数据传输流程

1.平时数据线处于“空闲”状态(1状态)
2.当要发送数据时,UART改变TxD数据线的状态(变为0状态),并维持1位的时间,这样接收方检测到开始位后,在等待1.5位的时间就开始一位一位的检测数据线的状态得到所传输的数据
3.UART一帧中可以有5,6,7或8位的数据,发送方一位一位的改变数据线的状态将它们发送出去。首先发送最低位
4.如果使用校验功能,UART在发送完数据位后,还要发送1个校验位。有两种校验方法:奇校验,偶校验——数据位连同校验位,“1”的数目等于奇数或偶数
5.最后,发送停止位。数据线恢复到“空闲”状态(1状态)。停止位的长度有3种:1位,1.5位,2位

3.S3C2440中UART的工作过程

S3C2440UART的FIFO深度为64。发送数据时,CPU先将数据写入发送FIFO中,然后UART会自动将FIFO中的数据复制到“发送移位器”中,发送移位器将数据一位一位的发送到TxDn数据线上(根据设定的格式,插入开始位,校验位和停止位)。接收数据时,“接收移位器”将RxDn数据线上的数据一位一位接收进来,然后复制到接收FIFO中,CPU即可从中读取数据。

4.寄存器讲解

UBRDIVn寄存器:设置波特率

UBRDIVn = (int)(UART时钟 / (波特率 * 16)) - 1
eg:
    UBRDIVn = (int)(50000000 / (115200 * 16)) - 1
            = 26

ULCONn寄存器:设置传输格式

UCONn寄存器:选择时钟源,设置UART的中断方式等。


UFCONn寄存器

UFCONn寄存器用于设置是否使用FIFO,设置各FIFO的触触发阈值,即发送FIFO中有多少个数据时产生中断,接收FIFO中有多少个数据时产生中断。并可以通过设置UFCONn寄存器来复位各个FIFO

UFSTATn寄存器

读取UFSTAT寄存器可以知道各个FIFO是否已经满,其中有多少个数据。
不使用FIFO时,可以认为FIFO的深度为1,使用FIFO时S3C2440的深度为64

UTRSTATn寄存器

UTRSTATn寄存器用来表示数据是否已经发送完毕,是否已经接受到数据。

UERSTATn寄存器

用来表示各种错误是否发生,位[0]~[3]为1时分别表示溢出错误,校验错误,帧错误,检测到“break”信号,读取这个寄存器时,他会自动清0

UTXHn

CPU将数据写入这个寄存器,UART即会将它保存到缓冲区去,并自动发出

URXHn

当UART接收到数据时,CPU读取这个寄存器,即可获得数据

UMCONn寄存器和UMSTATn寄存器

这两类寄存器用于流量控制,这里不介绍

5.硬件接线图

6.代码编写

uart.h

#ifndef _UART_H
#define _UART_H

void uart0_init();
int putchar(int c);
int getchar(void);
int puts(const char *s);

#endif

uart.c

#include "s3c2440_soc.h"

/*  115200, 8n1
 *  8: 数据位
 *  n: 没有校验位
 *  1: 停止位
 */
void uart0_init()
{
    /*  设置引脚    */
    GPHCON &= ~((3<<4) | (3<<6));
    GPHCON |= ((2<<4) | (2<<6));

    /*  设置上拉
     *  因为uart传输协议要求开始空闲为高电平
     */
    GPHUP &= ((1<<2) | (1<<3));

    /*  设置波特率   */
    /*  UBRDIVn = (int)( UART clock / ( buad rate x 16) ) –1
     *  UART clock = 50M
     *  UBRDIVn = (int)( 50000000 / ( 115200 x 16) ) –1 = 26
     */
    UCON0 = 0x00000005;     /*  PCLK,中断/查询模式    */
    UBRDIV0 = 26;

    /*  设置数据格式  */
    ULCON0 = 0x00000003;
}

int putchar(int c)
{
    while(!(UTRSTAT0 & (1<<2)));
    UTXH0 = (unsigned char)c;
}

int getchar(void)
{
    while(!(UTRSTAT0 & (1<<0)));
    return URXH0;
}

int puts(const char *s)
{
    while(*s)
    {
        putchar(*s);
        s++;
    }
}

main.c

#include "s3c2440_soc.h"
#include "uart.h"

main(int argc, char **argv)
{
    unsigned char c;
    uart0_init();
    puts("Hello world\n\r");

    while(1)
    {
        c = getchar();
        if(c == '\r')
        {
            putchar('\n');
        }
        if(c == '\n')
        {
            putchar('\r');
        }

        putchar(c);
    }

    return 0;
}

原文地址:https://www.cnblogs.com/huangdengtao/p/12103149.html

时间: 2024-11-18 01:53:43

第11课.串口(UART)的使用的相关文章

第011课_串口(UART)的使用

from: 第011课_串口(UART)的使用 第001节_辅线1_硬件知识_UART硬件介绍 1. 串口的硬件介绍 UART的全称是 Universal Asynchronous Receiver and Transmiter ,即异步发送和接收. 串口在嵌入式中用途非常广泛,主要的用途有: 1. 打印调试信息: 2. 外接各种模块:GPS.蓝牙等: 串口因为结构简单.稳定可靠,广受欢迎.通过三根线即可,发送.接收.地线. 通过TxD -> RxD 把ARM开发板要发送的信息发送给PC机.通过

安卓学习第11课——AutoCompleteTextView

...在百度上搜了这么一段.理解了ArrayAdapter的三个参数的用途 1. 这个小例子是要显示一个数组,我们就用ArrayAdapter,数组适配器,数据的数据类型<>是String类型的,数据的数据类型还可以是其他的包括对象类型的 2. ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(ArrayListDemo.this, android.R.layout.simple_list_item

第11课完成:“主主同步”的视频,浪费的时间太不值得

今天晚饭前,终于完成第11课的内容. 其实,如果不是"主主同步"这节视频耽误太多的时间,我是可以做到本周一就结束这1节的.而且,在我初看"L11-17-MySQL主主同步理论介绍及手把手脚本实操讲解w"这节视频时,也浏览到视频的后三分之一.知道oldboy讲到最后,虽然把"主主同步"搭建成功,但是,最后他如何实现的步骤,在这节视频里并没有录制上. 只恨自己的"完美主义"心态,明明知道这节视频里,最关键的部分没有录制上,还是坚持

node.js第11课(HTTPclient)

 一.http模块提供了两个函数http.request和http.get,功能是作为client向HTTPserver发起请求. Ext.Ajax.request({},function(response)) 1.http.request(options,callback)发起HTTP请求,接受两个參数,option是一个类似关联数组的对象, 表示请求的參数,callback是请求的回调函数,option经常使用的參数例如以下 host:请求站点的域名或IP地址 port:请求站点的端口,

单片机第11课:串口通信查询方式---从计算机接受数据

如何用计算机给单片机发送数据,单片机如何接收数据呢? JP3与P0口相连接.从计算机给单片机发送一个十六进制数据,然后看数码管的显示. #include<reg51.h> /* *给单片机发送一个十六进制的数据,用来显示数码管 */ void initSer(); void main() {<span> </span>initSer(); while(1) { //查询RI的值,如果是1,那么接收到了数据,此时应该软件清零,RI = 0 if(RI == 1) { RI

[安卓] 11、串口蓝牙&#183;将软硬结合进行到底

前言 上次我详细介绍了如何用笔记本搜索到蓝牙模块并与之通信:http://www.cnblogs.com/zjutlitao/p/3886826.html,这次将介绍如何让安卓手机的蓝牙和该蓝牙模块进行通信. 简单一步搞定 参看:[只需简单一步,android自带的示例程序 BluetoothChat 变蓝牙串口助手 :http://www.amobbs.com/thread-5426293-1-1.html],只要把Android自带的BluetoothChat例程稍微改一下就能搞定: Blu

11、串口编程

1.串口的介绍     串口的介绍, 串口发送的顺序: 1.空闲位:这里是连续的 1 2.起始位:低电平 3.数据位:对于传输的数据位这里是自己去设定传输位数,可以5.6.7.8位,但是我们一般设置为  8位 串口的数据是从低位开始发送 4.奇偶校验位:保证传输数据位中的 1 的个数是奇数还是偶数.奇校验:保证数据位中的'1'是奇数个,当数据位中的'1'是奇数个的时候,那么校验位填零:当数据位中的'1'是偶数个的时候,则校验位填为'1'. 5.停止位:低电平.持续时间为一个或者 1.5 个字符的

(版本定制)第11课:Spark Streaming源码解读之Driver中的ReceiverTracker彻底研究和思考

本期内容: 1.ReceiverTracker的架构设计 2.消息循环系统 3.ReceiverTracker具体实现 上节课讲到了Receiver是如何不断的接收数据的,并且接收到的数据的元数据会汇报给ReceiverTracker,下面我们看看ReceiverTracker具体的功能及实现. ReceiverTracker主要的功能: 在Executor上启动Receivers. 停止Receivers . 更新Receiver接收数据的速度(也就是限流) 不断的等待Receivers的运行

3.11课&#183;&#183;&#183;&#183;&#183;&#183;&#183;&#183;&#183;异常语句与for循环重复

异常语句try catch finally try//保护执行里面的代码段,若其中一句有错误,直接跳转到catch,不会管下面的内容 { Console.Write("请输入一个整数"); int a = int.Parse(Console.ReadLine()); Console.WriteLine("hello"); } catch //try中发现异常,直接执行,若try中无错,不执行 { Console.WriteLine("输入有误!"