一:tiny4412串口驱动编写

  1、串口通信简介

  串口通信指串口按位(bit)发送和接收字节,串口通信的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线 接收数据。它很简单并且能够实现远距离通信。比如IEEE488定义并行通行状态时,规定设备线总长不得超过20米,并且任意两个设备间的长度不得超过2 米;而对于串口而言,长度可达1200米。

  串口通信所采用的通信协议为RS-232,RS-232通信方式允许简单连接三线:Tx、Rx和地线。但是对于数据传输,双方必须对数据定时采用使用相同的波特率。RS-232(ANSI/EIA-232标准)是IBM-PC及其兼容机上的串行连接标准。可用于许多用途,比如连接鼠标、打印机或者Modem,同时也 可以接工业仪器仪表。用于驱动和连线的改进,实际应用中RS-232的传输长度或者速度常常超过标准的值。RS-232只限于PC串口和设备间点对点的通信。

  2、串口的通信基本模型如下图所示:

TXD:发送数据

RXD:接收数据

GND:地线

串口驱动跟其他外设的驱动配置流程差不多,大概分为如下几步:

(1)查看电路图,配置相应的gpio功能引脚

(2)配置串口控制器的相应寄存器

(3)测试串口接收、发送

今天用的是第一个串口com0,下面是电路图:

找到相应的gpio功能引脚

下面是串口工作的整个模式图:

下面是串口控制器相应的寄存器:

今天我们实验用到的几个主要的寄存器是:

ULCON0:数据格式控制寄存器(配置数据位,停止位,校验位等);

UCON0:串口控制开关

UTXH0:发送数据

URXH0:接收数据

UTRSTAT0:数据收发状态寄存器

UBRDIV0,UFRACVAL0:配置波特率的

下面是uart所需要的工作得时钟频率,以及比特率计算公式:

经过计算uart所采用的SCLK_UART为100M

UBRDIV0=(100000000)/(115200 x16) - 1 = 53.3=53=0x35;

UFRACVAL0= 4;

下面具体测试代码:

 #ifndef __REGS_H
#define __REGS_H #define gpa0base 0x11400000
#define GPA0CON (*(volatile unsigned long *)(gpa0base + 0x0000)) #define uart0base 0x13800000
#define ULCON0 (*(volatile unsigned long *)(uart0base + 0x0000))
#define UCON0 (*(volatile unsigned long *)(uart0base + 0x0004))
#define UFCON0 (*(volatile unsigned long *)(uart0base + 0x0008))
#define UMCON0 (*(volatile unsigned long *)(uart0base + 0x000C))
#define UTRSTAT0 (*(volatile unsigned long *)(uart0base + 0x0010))
#define UERSTAT0 (*(volatile unsigned long *)(uart0base + 0x0014))
#define UFSTAT0 (*(volatile unsigned long *)(uart0base + 0x0018))
#define UMSTAT0 (*(volatile unsigned long *)(uart0base + 0x001C))
#define UTXH0 (*(volatile unsigned char *)(uart0base + 0x0020))
#define URXH0 (*(volatile unsigned char *)(uart0base + 0x0024))
#define UBRDIV0 (*(volatile unsigned long *)(uart0base + 0x0028))
#define UFRACVAL0 (*(volatile unsigned long *)(uart0base + 0x002C))
#define UINTP0 (*(volatile unsigned long *)(uart0base + 0x0030))
#define UINTSP0 (*(volatile unsigned long *)(uart0base + 0x0034))
#define UINTM0 (*(volatile unsigned long *)(uart0base + 0x0038)) #define uart3base 0x13830000
#define ULCON3 (*(volatile unsigned long *)(uart3base + 0x0000))
#define UCON3 (*(volatile unsigned long *)(uart3base + 0x0004))
#define UFCON3 (*(volatile unsigned long *)(uart3base + 0x0008))
#define UMCON3 (*(volatile unsigned long *)(uart3base + 0x000C))
#define UTRSTAT3 (*(volatile unsigned long *)(uart3base + 0x0010))
#define UERSTAT3 (*(volatile unsigned long *)(uart3base + 0x0014))
#define UFSTAT3 (*(volatile unsigned long *)(uart3base + 0x0018))
#define UMSTAT3 (*(volatile unsigned long *)(uart3base + 0x001C))
#define UTXH3 (*(volatile unsigned char *)(uart3base + 0x0020))
#define URXH3 (*(volatile unsigned char *)(uart3base + 0x0024))
#define UBRDIV3 (*(volatile unsigned long *)(uart3base + 0x0028))
#define UFRACVAL3 (*(volatile unsigned long *)(uart3base + 0x002C))
#define UINTP3 (*(volatile unsigned long *)(uart3base + 0x0030))
#define UINTSP3 (*(volatile unsigned long *)(uart3base + 0x0034))
#define UINTM3 (*(volatile unsigned long *)(uart3base + 0x0038)) #endif //__REGS_H
 #ifndef __UART_H
#define __UART_H void uart_init();
void set_gpio();
void show_serial();
void myputc(unsigned char c);
unsigned char mygetc(void);
void myputs(unsigned char *str);
void mygets(unsigned char *str); #endif //__UART_H
 #include "regs.h"
#include "uart.h" int main()
{
set_gpio();
uart_init();
show_serial();
return ;
} void show_serial()
{
/*循环进行数据收发*/
unsigned char cmd[];
while() {
myputs("[root@dream]#");
mygets(cmd);
myputs(cmd);
myputs("\n");
} } void myputc(unsigned char c)
{
while(!(UTRSTAT0 & ( << )));//等待buffer为空,再发送字符
UTXH0 = c;
}
unsigned char mygetc(void)
{
unsigned char ch;
while(!(UTRSTAT0 & ));//等待buffer不为空
ch = URXH0; return ch;
} void myputs(unsigned char *str)
{
while(*str) {
myputc(*str);
if(*str == '\n')
myputc('\r');
str++;
}
} void mygets(unsigned char *str)
{
unsigned char ch;
while() {
ch = mygetc();//获取字符
myputc(ch);
if(ch == '\r') {
myputc('\n');
break;
}
*str = ch;
str++;
}
*str = ;
} void set_gpio()
{
/*0x2 = UART_0_RXD
*0x2 = UART_0_TXD*/
GPA0CON &= ~0xff;
GPA0CON |= 0x22;
} void uart_init()
{
/*step 1:数据格式控制*/
ULCON0 = ; /*8bit data 1bit stop no parity*/
/*step 2: uart 开关*/
UCON0 = | ( << );
/*step 3: set Baud-rate*/
UBRDIV0 = 0x35;
UFRACVAL0 = 0x4;
/*step 4: 数据收发缓存*/
//UTXH0
//URXH0
/*step 5:数据收发状态寄存器*/
//UTRSTAT0
}

Tiny4412之串口(Uart)驱动编写的更多相关文章

  1. ARM-Linux S5PV210 UART驱动(3)----串口核心层、关键结构体、接口关系

    尽管一个特定的UART设备驱动完全可以按照tty驱动的设计方法来设计,即定义tty_driver并实现tty_operations其中的成员函数,但是Linux已经在文件serial_core.c中实 ...

  2. ARM-Linux S5PV210 UART驱动(4)----串口驱动初始化过程

    对于S5PV210 UART驱动来说,主要关心的就是drivers/serial下的samsung.c和s5pv210.c连个文件. 由drivers/serial/Kconfig: config S ...

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

    from: 第011课_串口(UART)的使用 第001节_辅线1_硬件知识_UART硬件介绍 1. 串口的硬件介绍 UART的全称是 Universal Asynchronous Receiver ...

  4. ARM-Linux S5PV210 UART驱动(转)

    ARM-Linux S5PV210 UART驱动(3)----串口核心层.关键结构体.接口关系 尽管一个特定的UART设备驱动完全可以按照tty驱动的设计方法来设计,即定义tty_driver并实现t ...

  5. UART驱动分析

    在linux用户层上要操作底层串口需要对/dev/ttySxxx操作,这里的ttySx指实际的终端串口. 以下以全志A64为实例,分析UART驱动以及浅谈TTY架构. linux-3.10/drive ...

  6. uart驱动框架分析(二)uart_add_one_port

    作者:lizuobin (百问网论坛答疑助手) 原文: https://blog.csdn.net/lizuobin2/article/details/51801183 (所用开发板:mini2440 ...

  7. tty初探 — uart驱动框架分析

    写在前面: 我们没有讲UART驱动,不过我们认为,只要系统学习了第2期,应该具备分析UART驱动的能力,小编做答疑几年以来,陆陆续续有不少人问到UART驱动怎么写,所以今天就分享一篇深度长文(1700 ...

  8. Linux UART驱动分析

    1. 介绍 8250是IBM PC及兼容机使用的一种串口芯片; 16550是一种带先进先出(FIFO)功能的8250系列串口芯片; 16550A则是16550的升级版本, 修复了FIFO相关BUG, ...

  9. liunx中字符驱动编写的简单模板

    下面是关于字符驱动两个程序,主要是说明驱动编写的思想,理解驱动是怎么一步一步被实现的. 驱动的第一个实现程序,是相对于裸机编程的,主要是体会一下驱动编程思想: cdev.h: 所包含的头文件 #ifn ...

随机推荐

  1. Java学习笔记(二)事件监听器

    Java实现对组件事件(如单击.输入等)的监听和JavaScript类似,都是先添加Listener,再写触发函数,不同的是,Java实现监听前必须使用implements将各个接口添加到类内. 相关 ...

  2. 虚拟机linux挂载光盘显示:mount: you must specify the filesystem type

    虚拟机内 linux 挂载光盘显示:mount: you must specify the filesystem type 今天在虚拟机上挂载镜像文件时提示: 初步断定原因有2: 1.在卸载光盘时使用 ...

  3. Oracle Advanced Pricing White Papers

    Oracle Order Management - Version 11.5.10.0 and later Oracle Advanced Pricing - Version 11.5.10 and ...

  4. Android高级控件(二)——SurfaceView实现GIF动画架包,播放GIF动画,自己实现功能的初体现

    Android高级控件(二)--SurfaceView实现GIF动画架包,播放GIF动画,自己实现功能的初体现 写这个的原因呢,也是因为项目中用到了gif动画,虽然网上有很多的架包可以实现,不过我们还 ...

  5. 【LaTeX排版】LaTeX论文排版<四>

    1.表格的插入     一般的表格插入的代码如下: \begin{table}[H] \centering \begin{tabular}{|c|c|c|} \hline 感知方法&优点&am ...

  6. thrift实现HDFS文件操作

    thrift 文件如下 namespace java com.pera.file.transform struct  File{     1:string path ,     2:string co ...

  7. 两种方法 更改 EBS R12界面LOGO以及内容

    from:metalink more: Note 174219.1 - How To Change The Logo In The Oracle Application Menu Note 84975 ...

  8. DB Query Analyzer 5.05 is released, 65 articles concerned have been published

    DB Query Analyzer 5.05 is released, 65 articles concerned have been published DB Query Analyzer is p ...

  9. java中List对象的操作方法

    List<String> list = new ArrayList<String>(); //增加 list.add("苹果"); list.add(&qu ...

  10. Python3玩转儿 机器学习(5)

    numpy 的使用 numpy.array基础 import numpy numpy.__version__ #查询当前numpy的版本 '1.14.0' import numpy as np np. ...