一: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. AndFix使用感想

    AndFix已经使用了一段时间了,但是到AndFix上看了一下,最近2个月都没有更新代码了,有141个issues和3个pull request没人处理,其实AndFix的Contributors就俩 ...

  2. Java 条形码生成(一维条形码)

    utl:http://mianhuaman.iteye.com/blog/1013945 在这里给大家介绍一个java 生成条形码 jbarcode.jar 生成条形码 支持EAN13, EAN8, ...

  3. Erlang cowboy routing 路由

    Erlang cowboy routing 路由 本文译自: http://ninenines.eu/docs/en/cowboy/1.0/guide/routing/ Routing 默认情况下,C ...

  4. 客户全局信用控制&非全局信用控制

    看个简单的例子 客户信用限额 非全局信用控制 非全局信用控制比较简单,我们看一下全局信用控制 设置: 实现结果:全局&非全局对比

  5. 如何在os x或ubuntu下安装最新的ruby

    os x下基本上可以安装到比较新的ruby,首先先安装rvm,然后用rvm list known看当前可供安装的ruby的版本,不过这也不是绝对的,比如在我的os x 10.9上,命令返回如下: # ...

  6. ELF 文件 动态连接 - 延迟绑定(PLT)

    PLT 全称:Procedure Linkage Table ,直译:过程连接表 由于在动态连接中,程序的模块之间包含了大量的函数引用,所以在程序开始执行前,动态链接会耗费较多的时间用于模块之间函数引 ...

  7. 新型USB病毒BadUSB 即使U盘被格式化也无法根除

    这种病毒并不存在于USB设备中的存储文件中,而是根植于USB设备的固件里.这意味着,即使用户对U盘进行全面的格式化清理,仍不能"杀死"它.

  8. access登录窗口校验代码一

    Private Sub login_Click()If IsNull(Me.username) ThenMsgBox "请输入用户名!", vbExclamationElseIf ...

  9. 详解URL的组成

    很久很久以来,我对浏览器地址栏的信息了解的甚少,只知道域名(估计不知道是这么叫).唉...真是很汗颜啊!在软件专业都混了两年了,还是个菜鸟.说真的,有的时候觉得计算机这个领域真的真的有太多的东西要学了 ...

  10. AngularJS:何时应该使用Directive、Controller、Service?

    AngularJS:何时应该使用Directive.Controller.Service? (这篇文章你们一定要看,尤其初学的人,好吗亲?) 大漠穷秋 译 AngularJS是一款非常强大的前端MVC ...