UART简介:

  UART(Universal Asynchronous Receiver and Transmitter)通用异步收发器(异步串行通信口),是一种通用的数据通信协议,它包括了RS232、RS499、RS423、RS422和RS485等接口标准规范和总线标准规范,即UART是异步串行通信口的总称。而RS232、RS499、RS423、RS422和RS485等,是对应各种异步串行通信口的接口标准和总线标准,它规定了通信口的电气特性、传输速率、连接特性和接口的机械特性等内容,这些东东都是物理层的概念。通信协议,是属于通信网络中的数据链路层的概念。
一、数据传输流程:
  1)平时数据线处于“空闲”状态(1状态)
  2)当腰发送数据时,UART改变TxD数据线状态(0状态)并维持一位的时间,这样接收方检测到开始位后。再等1.5位的时间就开始一位一位的检测数据线状态得到所传输的数据。
  3)UART一帧中可以有5,6,7,或8位的数据,发送方一位一位的改变数据线的状态,将他们发送出去,首先发送最低位。
  4)如果使用校验功能UART在发送完数据后还要发送一校验位,有两种校验方式,奇校验和偶校--数据位连同校验位中,“1”的数目等于奇数或偶数
  5)最后发送停止位,数据线状态恢复到“空闲”状态(1状态)停止位的状态有三种1位,1.5位,2位。

    起始位:先发出一个逻辑”0”信号,表示传输字符的开始。
    数据位:可以是5~8位逻辑”0”或”1”。如ASCII码(7位),扩展BCD码(8位)。小端传输
    校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验)
    停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。
    空闲位:处于逻辑“1”状态,表示当前线路上没有资料传送。
    
二、操作步骤:
  第一步:配置引脚


  通过硬件原理图可以知道使用的是MAX3232SOP芯片 使用的是TX0 和RXD0 对应的配置寄存器是GPA通过数据手册可知GPA的地址及每位所代表的意义。通过数据手册可以知道通过配置GPACON的相应管脚就可以将其设置为UART功能。


  Register       Address
    GPACON   0x7F008000

GPA0  [3:0]        0000 = Input              0001 = Output
                         0010 = UART RXD[0]  0011 = Reserved
                         0100 = Reserved        0101 = Reserved
                         0110 = Reserved        0111 = External Interrupt Group 1 [0]
                            
GPA1  [7:4]        0000 = Input              0001 = Output
                         0010 = UART TXD[0]  0011 = Reserved
                         0100 = Reserved        0101 = Reserved
                         0110 = Reserved        0111 = External Interrupt Group 1 [1]

故只需要将GPACON的第八位赋值成 0x00100010即可将GPA配置成UART

第二步:设置数据格式
  由数据手册可知uart数据帧发送是可编程的。它由一个起始位,5~8 个数据位,一个可选的奇偶位和 1~2
个可由行控制寄存器(ULCONn )指定的停止位组成。发送器也可以产生中断条件,在传输过程中,它通过置位逻辑状态 0
来强制串行输出。当目前的发送完全传输完成后,发送中断信号。然后不断传送数据到发送 FIFO 寄存器(在非 FIFO 的模式下,发送保存寄存器。)

word length = 11,8bit的数据

Number of Stop Bit = 0;1bit的停止位

Parity Mode = 000;无校验位

Intfrared Mode =0;使用普通模式

所以ULCON0 = 0x3;

第三步:UART配置

Receive Mode = 01;使用中断模式或轮询模式、

Transmit Mode = 01;使用中断模式或轮询模式

Send Break Signal = 0;普通传输

loop-back Mode = 0;使用回环方式

Clock Selection = 0;使用PCLK作为UART的工作时钟

所以UCON =0x5;UFCON0 用来使能FIFO,UMCON0用来设置无留控

第三步:设置波特率
  波特率即每秒传输的数据位数,涉及两个寄存器UBRDIV0和UDIVSLOT0

波特率设置相关公式:DIV_VAL = UBRDIVn + (num of 1’s in UDIVSLOTn)/16. Refer to UART Baud Rate Configure Registers.

PCLK = 66.5MHZ 波特率bps设置为115200。所以(66.5MHZ、(115200*16))-1 =35.08 =UBRDIVn + (num of 1’s in UDIVSLOTn)/16。故设置UBRDIV0 = 35,UDIVSLOT0 = 0x1;

第四步:编码

 //start.S
// 启动代码
.global _start _start: // 把外设的基地址告诉CPU
ldr r0, =0x70000000
orr r0, r0, #0x13
mcr p15,,r0,c15,c2, // 关看门狗
ldr r0, =0x7E004000
mov r1, #
str r1, [r0] // 设置栈
ldr sp, =0x0C002000 // 开启icaches
#ifdef CONFIG_SYS_ICACHE_OFF
bic r0, r0, #0x00001000 @ clear bit (I) I-cache
#else
orr r0, r0, #0x00001000 @ set bit (I) I-cache
#endif
mcr p15, , r0, c1, c0, // 设置时钟
bl clock_init // 调用C函数点灯
bl main halt:
b halt
//Tiny6410Addr.h
#ifndef _Tiny6410Addr_H
#define _Tiny6410Addr_H
//GPK
#define GPKIO_BASE (0x7F008800)
#define rGPKCON0 (*((volatile unsigned long *)(GPKIO_BASE+0x00)))
#define rGPKDAT (*((volatile unsigned long *)(GPKIO_BASE+0x08))) //CLOCK
#define APLL_LOCK (*((volatile unsigned long *)0x7E00F000))
#define MPLL_LOCK (*((volatile unsigned long *)0x7E00F004))
#define EPLL_LOCK (*((volatile unsigned long *)0x7E00F008))
#define OTHERS (*((volatile unsigned long *)0x7E00F900))
#define CLK_DIV0 (*((volatile unsigned long *)0x7E00F020))
#define APLL_CON (*((volatile unsigned long *)0x7E00F00C))
#define MPLL_CON (*((volatile unsigned long *)0x7F00F010))
#define CLK_SRC (*((volatile unsigned long *)0x7E00F01C)) //GPA /uart
#define ULCON0 (*((volatile unsigned long *)0x7F005000))
#define UCON0 (*((volatile unsigned long *)0x7F005004))
#define UFCON0 (*((volatile unsigned long *)0x7F005008))
#define UMCON0 (*((volatile unsigned long *)0x7F00500C))
#define UTRSTAT0 (*((volatile unsigned long *)0x7F005010))
#define UFSTAT0 (*((volatile unsigned long *)0x7F005018))
#define UTXH0 (*((volatile unsigned char *)0x7F005020))
#define URXH0 (*((volatile unsigned char *)0x7F005024))
#define UBRDIV0 (*((volatile unsigned short *)0x7F005028))
#define UDIVSLOT0 (*((volatile unsigned short *)0x7F00502C))
#define GPACON (*((volatile unsigned long *)0x7F008000)) #endif //uart.c
// 功能:初始化串口
#include "uart.h"
#include "Tiny6410Addr.h" void uart_init(void)
{
/* 1. 配置引脚 */
GPACON &= ~0xff;
GPACON |= 0x22; /* 2. 设置数据格式等 */
ULCON0 = 0x3; // 数据位:8, 无校验, 停止位: 1, 8n1
UCON0 = 0x5; // 时钟:PCLK,禁止中断,使能UART发送、接收
UFCON0 = 0x01; // FIFO ENABLE
UMCON0 = ; // 无流控 /* 3. 设置波特率 */
// DIV_VAL = (PCLK / (bps x 16 ) ) - 1 = (66500000/(115200x16))-1 = 35.08
// DIV_VAL = 35.08 = UBRDIVn + (num of 1’s in UDIVSLOTn)/16
UBRDIV0 = ;
UDIVSLOT0 = 0x1; } /* 接收一个字符 */
char get_char(void)
{
while ((UFSTAT0 & 0x7f) == ); // 如果RX FIFO空,等待
return URXH0; // 取数据
} /* 发送一个字符 */
void put_char(char c)
{
while (UFSTAT0 & (<<)); // 如果TX FIFO满,等待
UTXH0 = c; // 写数据
} //uart.h
char get_char(void);
void put_char(char c);
void init_uart(void); //clock.c
#include "Tiny6410Addr.h"
// 功能:c语言初始化时钟 #define ARM_RATIO 0 // ARMCLK = DOUTAPLL / (ARM_RATIO + 1) = 532/(0+1) = 532 MHz
#define MPLL_RATIO 0 // DOUTMPLL = MOUTMPLL / (MPLL_RATIO + 1) = 532/(0+1) = 532 MHz
#define HCLKX2_RATIO 1 // HCLKX2 = HCLKX2IN / (HCLKX2_RATIO + 1) = 532/(1+1) = 266 MHz
#define HCLK_RATIO 1 // HCLK = HCLKX2 / (HCLK_RATIO + 1) = 266/(1+1) = 133 MHz
#define PCLK_RATIO 3 // PCLK = HCLKX2 / (PCLK_RATIO + 1) = 266/(3+1) = 66.5 MHz #define APLL_CON_VAL ((1<<31) | (266 << 16) | (3 << 8) | (1)) #define MPLL_CON_VAL ((1<<31) | (266 << 16) | (3 << 8) | (1)) void clock_init(void)
{
/* 1. 设置各PLL的LOCK_TIME,使用默认值 */
APLL_LOCK = 0xffff; // APLL_LOCK,供cpu使用
MPLL_LOCK = 0xffff; // MPLL_LOCK,供AHB(存储/中断/lcd等控制器)/APB(看门狗,定时器,SD等)总线上的设备使用
EPLL_LOCK = 0xffff; // EPLL_LOCK,供UART,IIS,IIC使用 /* 2. 设置为异步模式(Asynchronous mode) */
OTHERS &= ~0xc0; //《linux installation for u-boot》3.7中:用MPLL作为HCLK和PCLK的Source是异步(ASYNC)模式,用APLL是同步(SYNC)模式
while ((OTHERS & 0xf00) != ); /* 3. 设置分频系数 */
CLK_DIV0 = (ARM_RATIO) | (MPLL_RATIO << ) | (HCLK_RATIO << ) | (HCLKX2_RATIO << ) | (PCLK_RATIO << ); /* 4. 设置PLL,放大时钟 */
APLL_CON = APLL_CON_VAL;
MPLL_CON = MPLL_CON_VAL; /* 5. 选择PLL的输出作为时钟源 */
CLK_SRC = 0x03;
} //main.c
#include "uart.h"
int main()
{
char c;
uart_init();
while()
{
c= get_char();
put_char(c+);
} return ;
} //Makefile
uart.bin : start.o clock.o main.o uart.o
arm-linux-ld -Ttext 0x50000000 -o uart.elf start.o clock.o main.o uart.o
arm-linux-objcopy -O binary uart.elf uart.bin
arm-linux-objdump -D uart.elf > uart.dis %.o : %.S
arm-linux-gcc -g -c -O2 -o $@ $^ %.o : %.c
arm-linux-gcc -g -c -O2 -o $@ $^
.PHONY:clean
clean:
rm *.o *.elf *.bin *.dis

Tiny6410之UART裸机驱动的更多相关文章

  1. Tiny6410之按键裸机驱动

    操作步骤: 第一步:查看开发板电路原理图 找到LED 和按键的管脚所对应的寄存器 LED:(见Tiny6410之LED裸机驱动) nLED_1 - GPK4 nLED_2 - GPK5 nLED_3 ...

  2. Tiny6410之LED裸机驱动

    操作步骤: 第一步:查看开发板电路原理图 找到LED 的管脚所对应的寄存器 nLED_1 - GPK4 nLED_2 - GPK5 nLED_3 - GPK6 nLED_4 - GPK7 由原理图可知 ...

  3. Tiny6410之控制icache驱动

    什么是cache:    基于程序访问的局限性,在主存和CPU通用寄存器之间设置了一类高速的.容量较小的存储器,把正在执行的指令地址附件的一部分指令或数据从主存调入这类存储器,供CPU 在一段时间内使 ...

  4. linux UART串口驱动开发文档

    转:http://www.360doc.com/content/10/0417/18/829197_23519037.shtml linux UART串口驱动开发文档时间:2010-01-09 14: ...

  5. JZ2440 裸机驱动 第11章 通用异步收发器UART

    本章目标: 了解UART原理: 掌握S3C2410/S3C2440中UART的使用 11.1 UART原理及UART内部使用方法 11.1.1 UART原理说明     UART用于传输串行数据:   ...

  6. Tiny6410之NAND FLASH驱动

    一.NAND FLASH的特点 S3C6410的NAND FLASH控制器有如下特点 1.自导入模式:复位后,引导代码被送入到8KB的STEPPINGSTONE中,引导代码移动完毕,引导代码将在STE ...

  7. Tiny4412之串口(Uart)驱动编写

    一:tiny4412串口驱动编写 1.串口通信简介 串口通信指串口按位(bit)发送和接收字节,串口通信的概念非常简单,串口按位(bit)发送和接收字节.尽管比按字节(byte)的并行通信慢,但是串口 ...

  8. usb 转 uart cp210x 驱动解析

    USB 转 uart (cp210x.c) 驱动解析 * usb_serial_driver 结构体解析 include/linux/usb/serial.h /** 描述一个usb 串口设备驱动 * ...

  9. 一、uart&tty驱动

    一.I.MX6 UART驱动 文件路径:\linux_IMX6_CoreC_3..35_for_Linux\drivers\tty\serial\imx.c .驱动入口函数:imx_serial_in ...

随机推荐

  1. iOS基础 - 手势识别 与 手势说明

    一.使用手势识别的四个步骤 1> 实例化手势识别 - (id)initWithTarget:(id)target action:(SEL)action; 2> 设置手势识别属性 3> ...

  2. 用自己的话表达出来-Servlet

    什么是Servlet Servlet就是工作在服务器端的类,该类可以处理用户传过来的请求,也可以通过响应向用户输送数据. 如何使用Servlet Servlet就是处理用户的HTTP请求,然后回送HT ...

  3. Push Notification总结系列(二)

    Push Notification系列概括: 1.Push Notification简介和证书说明及生成配置 2.Push Notification的iOS处理代码和Provider详解 3.Push ...

  4. 【转】Objective-C并发编程:API和挑战

    并发指的是在同一时间运行多个任务.在单核CPU的情况下,它通过分时的方式实现,如果有多个CPU可用,则是真正意义上的多个任务“并行”执行了. OS X和iOS提供了多个API支持并发编程.每个API都 ...

  5. Java学习笔记——JDBC之PreparedStatement类中“预编译”的综合应用

    预编译 SQL 语句被预编译并存储在 PreparedStatement 对象中.然后可以使用此对象多次高效地执行该语句. 预编译的优点 1.PreparedStatement是预编译的,对于批量处理 ...

  6. 设置控件Enable=false,控件颜色不变

    [System.Runtime.InteropServices.DllImport("user32.dll ")] public static extern int SetWind ...

  7. 文本框文字垂直居中 CSS

    <html> <head> <style type="text/css"> #text { height:20px; vertical-alig ...

  8. No CurrentSessionContext configured 异常解决

    Exception in thread "main" org.hibernate.HibernateException: No CurrentSessionContext conf ...

  9. 常用的模式、JSON与DTO

    表现层的设计(一)——常用的模式.JSON与DTO 上几篇博文介绍了 业务逻辑层和数据访问层,我认为写博文的作用主要是向业界的读者交流一种思想,点到为止,至于学习架构设计,通过几篇博文是讲不清楚的,还 ...

  10. CenOS下安装Eclipse并配置PyDev

    为方便安装,使用SecureCRT来操作CentOS 1. 更改网络配置 虚拟机使用桥接方式上网(默认是NAT方式) 2. 启动后让虚拟机上网 3. 启动终端查看ip地址 4. 使用SecureCRT ...