uart串口发送---那些年我们一起玩mini2440(arm9)裸机
扫描二维码
随时随地手机看文章
Uart工作原理:
数据通信方式为:并行通信与串行通信两种:
§并行通信:利用多条数据线将数据的各位同时传送。
它的特点是:传输速度快,是用于短距离通信;
§串行通信:利用一条数据线将数据一位位地顺序传送。
特点是通信线路简单,利用简单的线缆就实现通信,低成本,是用于远距离通信。
异步通信:
a异步通信:以一个字符为传输单位,通过两个字符间的时间间隔是不固定的,然而同一字符中的两个相邻位之间的时间间隔是固定的。
a通信协议:是指通信双方约定的一些规则。在异步通讯时,对数据格式有如下约定:规定有空闲位、起始位、资料位、奇偶校验位、停止位。
起始位:先发一个逻辑“0”信号,表示传输字符的开始;
数据位:紧接在起始位之后。数据位的个数可以是4、5、6、7、8等,从最低位开始传送,靠时钟定位。
奇偶校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或(奇校验),以此校验数据传送的正确性。
停止位:它是一个字符数据的结束标志。
空闲位:处于逻辑“1”状态,表示当前线路没有数据传送。
波特率:
是衡量数据传送率的指标:记录每秒中传送的二进制位数。例如:数据传送速率为120字符、每秒。而每一个字符为10位,则其传送的波特率为10*120=1200位/秒=1200波特率
UART基本原理
通用异步收发器,简称UART,即“Universal Asynchronous Receiver Transmitter”,它用来传输串行数据;
发送数据时:
CPU将并行数据写入UART,UART按照一定的格式在一根电线上串行发出;
接收数据时:
UART检测另一根电线上的信号,将串行数据放在缓冲区中,CPU可读取UART获得的这些数据。
UART驱动程序设计
UART初始化:1.发送数据;2.接收数据;
UART初始化:1.设置波特率;2.设置数据传输格式;3.选择通道工作模式;
一.设置波特率:(UBRDIV)
在s3c2440中,通过UBRDIV(p352)寄存器可以设定UART的波特率。Uart0、Uart1、Uart2分别对应UBRDIV0,UBRDIV1、UBRDIV2
到底UBRDIV寄存器中的值与波特率有何关系?
UBRDIV=(int)(UART clock/ (buad rate *16))-1
(UART clock:PCLK or FCLK/ n or UEXTCLK)
如波特率为115200bps,UART时钟为40MHZ
UBRDIV =(int) (40MHZ /(115200*16))-1
二.设置数据传输格式(ULCON)
在s3c2440中,通过ULCON(page341),可以设置传输格式(有多少个数据位、是否使用校验位、是奇校验还是偶校验,有多少个停止位、是否使用流量控制)
Uart0、Uart1、Uart2分别对应ULCON0、ULCON1、ULCON2.
三.设置通道工作模式(UCON)
在s3c2440中,通过UCON(page342),可以设置UART通道的工作模式,(中断模式、查询模式、或DMA模式)
Uart0、Uart1、Uart2分别对应UCON0、UCON1、UCON2.
这三步都属于初始化:初始化完成之后à发送或/接收数据
发送数据:
将要发送的数据写UTXHn, UART会将保存到缓冲区中,并自动发出去。
UTXH0、UTXH1、UTXH2
接收数据:
当UART收到数据时(UTRSTATn寄存器bit[0]被置1),CPU读取URXHn寄存器,即可获得数据。
URXH0、URXH1、URXH2寄存器中读取数据
Main.c
#defineGLOBAL_CLK1
#include
#include
#include"def.h"
#include"option.h"
#include"2440addr.h"
#include"2440lib.h"
#include"2440slib.h"
#include"mmu.h"
#include"profile.h"
#include"memtest.h"
staticvoidcal_cpu_bus_clk(void);
voidSet_Clk(void);
/*************************************************
Functionname:delay
Parameter:times
Description:延时函数
Return:void
Argument:void
Autor&date:Daniel
**************************************************/
voiddelay(inttimes)
{
inti,j;
for(i=0;i for(j=0;j<400;j++); } /************************************************* Functionname:Main Parameter:void Description:主功能函数,实现了串口的收发功能 首先想串口发送十次“helloworld”, Return:void Argument:void Autor&date:Daniel **************************************************/ voidMain(void) { inti; intScom=0; Set_Clk(); beep_init(); /*设置波特率、数据位、停止位、校验位*/ Uart_Init(0,115200); Uart_Select(Scom); for(i=0;i<10;i++) Uart_Printf("nHelloWorld!n"); while(1) { while(Uart_GetKey()=='r') { for(i=0;i<10;i++) beep_run(); Uart_Printf("nBeepQuit!n"); } } } /************************************************* Functionname:Set_Clk() Parameter:void Description:设置CPU的时钟频率 Return:void Argument:void Autor&date:Daniel **************************************************/ voidSet_Clk(void) { inti; U8key; U32mpll_val=0; i=2;//don'tuse100M! //boot_params.cpu_clk.val=3; switch(i){ case0://200 key=12; mpll_val=(92<<12)|(4<<4)|(1); break; case1://300 key =