实验3 UART串口实验
DSP实验手册 实验三 异步串口实验
实验三异步串口实验一. 实验目的:1.熟悉CCS的开发环境;2.熟悉SEED-DEC5416的硬件设计;3.掌握SEED-DEC5416的串口电路的设计4.熟悉TL16C752B的通讯原理;5.熟悉DSP对I/O空间的访问;6.熟悉DSP的C语言与汇编数据的共享;二. 实验内容:1. DSP的初始化;2. UART的初始化;3. UART的容错处理;4. UART的发送与接收程序;5. UART的中断的处理。
三. 实验背景知识:TL16C752BPT,它采用3.3V电源供电,因而减少总线驱动。
具有双通道UART,并可兼容Modem接口。
与外部接口可以在RS485/RS422与RS232之间转换。
在RS232接口时,采用4线方式(RXD,TXD,RTS,CTS)。
DSP与URAT采用中断方式进行通讯和数据的传送。
1. UART与DSP的接口UART是一个并口型的外设,故UART占用DSP的I/O空间资源,A与B通路共同占用DSP外部中断1;时钟采用24MHz的外频输入,其最高的波特率可到1.5Mbps。
TL16C752BPT包含了两路相互独立的通路,每个通路的地址映射如下:A路:0x0010~0x0017B路:0x0018~0x001F。
UART的寄存器设置如下表:A2 A1 A0 读方式写方式0 0 0 接收保持寄存器(RHR)发送保持寄器(THR)0 0 1 中断使能寄存器(IER)中断使能寄存器(IER)0 1 0 中断标志寄存器(IIR) FIFO控制寄存器(FCR)0 1 1 线路控制寄存器(LCR)线路控制寄存器(LCR)1 0 0 MODEM控制寄存器(MCR)MODEM控制寄存(MCR)1 0 1 线路状态寄存器(LSR)1 1 0 MODEM状态寄存器(MSR)1 1 1 暂存寄存器(SRP)暂存寄存器(SRP)0 0 0 低位除数寄存器(DLL)低位除数寄存器(DLL)0 0 1 高侠除数寄存器(DLH)高侠除数寄存器(DLH)0 1 0 增强功能寄存器(EFR)增强功能寄存器(EFR)1 0 0 Xon-1 word Xon-1 word1 0 1 Xon-2 word Xon-2 word1 1 0 Xoff-1 word Xoff-1 word1 1 1 Xoff-2 word Xoff-2 word1 1 0 发送控制寄存器(TCR ) 发送控制寄存器(TCR ) 1 1 1 触发等级寄存器(TLR ) 触发等级寄存器(TLR )黑斜体的部分为二次寻址的寄存器。
dsp实验-UART串口通信实验
实验八、UART串口通信实验一、实验目的1. 了解RS232通信接口的基本原理;2. 熟悉通信接口芯片(TL16C550C)在DSP I/O空间寄存器的地址映射及工作原理;3.了解异步通信中串口模式选择、设置数据传输格式、设置波特率、建立连接、传输数据和断开连接等功能。
二、实验设备1. 集成开发环境CCS2. 实验开发板TMS320VC5402DSK、RS232接口电缆线及附件3.程序“串口调试程序v2.2.exe”三、实验内容及步骤实验操作流程参照前面实验。
1 在汇编环境调试Uart:(实现字符或文件的发送和回发功能)a. 实验代码main.s54、uartasm.cmd和uart_init.s54、dsp_init.s54以及uartasm.h54,c5402_dsk.gel(说明同前)。
b. 串口调试程序“串口调试程序v2.2.exe” , 汇编调试中Buildoption设置情况与CODEC实验中的汇编调试设置及出错情况相同。
c. 程序文件介绍:1)“uart.h54”定义了一些寄存器的地址以及函数类型。
2)“dsp_init.s54”与dsp工作有关的寄存器ST1、PMST、IMR、IFR和SWWSR,并且清除INTM位以及设定时钟模式。
3)“uart_init.s54”先检测UART模块是否工作正常,然后设定UART模块的寄存器,如CNTL1、CNTL2、LCR、MSB&LSB(设定波特率)、FCR、IER 等。
4)“main.s54”主程序查看标志位,检测是否UART存在有效接收数据。
若有,则执行一定的处理,包括亮LED以及将接收的数据从UART回发。
d. 执行程序时,只要发送数据时,可在串口调试程序的接收窗口立即看到回发的数据。
e. 程序中UART工作参数设置如下:1)波特率9600(或更低)、无数据校验、字符长度8比特、停止位1、2 均可;2) 接收区自动清空不选、十六进制显示可选可不选;发送区不能选十六进制发送,可发送字符和文件两种方式;3) IER允许数据就绪中断和线路状态中断;4) FIFO不使能,所以,在用串口程序调试时,只能单个字符发送,如“x”。
(3)UART 发送与接收
{
URX0IF=0;
temp=U0DBUF;
}
改进后代码:
#include "ioCC2530.h"
#include<string.h>
#define uint unsigned int
#define ConversionNum 20
//定义控制灯的端口
*函数功能:初始化ADC*
*入口参数:无*
*返回值:无*
*说明:参考电压AVDD,转换对象是AVDD*
****************************************************************/
void InitialAD(void)
{
P1DIR = 0x03;//P1控制LED
adcdata[1] = (char)(num)%10+48;
adcdata[3] = (char)(num*10)%10+48;
UartTX_Send_String(adcdata,5);
Delay(30000);
led1 = 0; //完成数据处理
Delay(30000);
n=0;
}
}
}
6.更改代码之后的结果:
输出0V和1V。实验成功。
void initUARTO(void)
{
CLKCONCMD &=~0x40;
while(CLKCONSTA & 0x40);
CLKCONCMD &=~0x47;
PERCFG=0x00;
P0SEL=0x3c;
P2DIR&=~0xc0;
CC2530UART串口实验3(UART0串口控制LED开关)
/*变量定义和赋值*******************************/
uchar recdata[3]="000";//初始为关状态,双引号为字符串,单引号为字符
uchar rxtxflag=1;//接收发送标志 1:接收 3:控制LED
uchar temp=0;//无数据接收到时,设为0
//目标板分析收到的信息并控制LED开关.实验使用UART0,波特率为19200
*****************************************/
/*引用********************************************/
#include<iocc2530.h>
#include<string.h>
/*宏定义*****************************************/
#defineuintunsignedint
#defineucharunsignedchar
#definerled P1_0
#definegled P1_1
#defineyled P1_4
uintdatanumber=0;//接收字符串计数
/*主函数*******************************/
voidmain(void)
{
P1DIR=0X13;//初始化LED
rled=0;
gled=0;
yled=0;
inituart0();//初始化串口
U0CSR|=0X40;//USART0 接收使能
}
else
{
rxtxflag=3;//进入发送状态
uart实验报告
uart实验报告
《UART实验报告》
实验目的:通过实验学习串行通信的基本原理,掌握UART通信协议的工作原理和使用方法。
实验设备:单片机开发板、串口调试助手、电脑。
实验原理:UART(Universal Asynchronous Receiver/Transmitter)是一种通用的异步串行通信协议,用于在计算机和外部设备之间进行数据传输。
UART通信协议包括数据位、停止位、奇偶校验位等参数,通过这些参数的设置可以实现不同的通信速率和数据传输方式。
实验步骤:
1. 连接单片机开发板和电脑,打开串口调试助手。
2. 在单片机开发板上编写UART通信程序,设置通信参数。
3. 将单片机开发板通过串口连接到电脑,打开串口调试助手。
4. 在串口调试助手上发送数据,观察单片机开发板接收到的数据。
5. 在单片机开发板上发送数据,观察串口调试助手接收到的数据。
实验结果:
经过实验,我们成功地实现了通过UART通信协议在单片机开发板和电脑之间进行数据传输。
在串口调试助手上发送的数据能够被单片机开发板正确接收,并且在单片机开发板上发送的数据也能够被串口调试助手正确接收。
通过调整通信参数,我们还验证了不同通信速率和数据传输方式对通信效果的影响。
实验总结:
通过本次实验,我们深入了解了UART通信协议的工作原理和使用方法,掌握
了串行通信的基本原理。
在今后的学习和工作中,我们将能够更加熟练地应用UART通信协议进行数据传输,为实际工程应用打下了坚实的基础。
通用异步串行口(UART)实验
班级07电本一班学号2007050352姓名钟发炫同组人
实验日期2010. 06. 01 室温大气压成绩
实验题目:通用异步串行口(UART)实验
一、实验目的
1.掌握异步串行通信协议;
2.掌握2812异步收发器模块的应用。
二、实验设备
1. 一台装有CCS软件的计算机;
2. DSP试验箱的TMS320F2812主控板;
3. DSP硬件仿真器。
三、实验原理
1.异步串行通信协议
在传输数据前,数据线处于高电平状态,这称为表示态。
传输开始后,数据线由高电平转为低电平状态,这称为起始位;起始位后面接着5~8个信息位;信息为后面是校验位;校验位后是停止位“1”。
传输完毕后,可以立即开始下一个字符的传输;否则,数据线再次进入标识态。
上面提到的信息位的位数(5~8位)、停止位的位数(1位、1..5位或2位)、校验的方式(奇偶验、偶校验或不校验)等参数都可以根据不同需要进行设置,但对于同一个传输系统中的首发两端来说,这些参数必须保持一致。
异步串行通信方式中另一个重要的参数是波特率。
在一般的“0”“1”系统中,波特率就是每秒钟传输的位数。
国际上规定了一个标准波特率系列,他们是最常用的波特率。
标准波特率系列为110、300、600、1200、1800、2400、4800、9600和19200。
发送端和接收端必须设置统一的波特率,否则无法正确接收数据。
2.电平转换
RS-232-C标准中规定-5V~-15V位逻辑“1”,+5V~+15V位逻辑“0”,因此要用专门的芯片完成TTL电平与RS-232电平的转换,如MAX3232。
uart串口通信实验报告
串口通信实验报告基本实验:16位的乘法器设计思想:乘法器根据以往学过数电的设计经验,应该是移位相加的方法,设被乘数为[15:0]a,乘数为[15:0]b,则从b的最高位开始算起,c初值为0,为b最高位为1,则c就等于c+a;接下来,若b的次高位为1,则c左移一位加a,若为0则c左移一位就可以了,这样的步骤做到b的最低位那么c的值就是a*b,当然最好c是中间寄存器,这样结果才不会出现中间值。
实验的源码:module muti(clk,rst,ready,a,b,c);input clk;input rst;input [15:0]a;input [15:0]b;output [31:0]c;output ready;reg [31:0]c;reg ready;reg [31:0]temp;reg [5:0]n;always @(posedge clk or posedge rst)beginif(rst)beginc<=0;ready<=1;temp<=0;n<=32;endelseif(ready)begintemp<=0;n<=32;ready<=0;endelseif(n)beginif(b[n-1])begintemp<=(temp<<1)+a;n<=n-1;endbegintemp<=temp<<1;n<=n-1;endendelsebeginc<=temp;n<=32;ready<=1;endendendmodul测试代码:`timescale 1ns/1ns module tb;reg clk;reg [15:0]a;reg [15:0]b;reg rst;wire ready;wire [31:0]c;always #10 clk=~clk; initialbeginrst<=1;clk<=0;a=0;b=0;#10 rst=0;#21 a=21;b=32;#650 a=3;b=4;#700 $stop;endmuti muti_unit(.a(a),.b(b),.rst(rst),.clk(clk),.ready(ready),.c(c));endmodule这边a被乘数,b是乘数,当rst为高时,则将c置0,ready置一,ready信号为高表示此时空闲可以计算,rst为低时则开始计算,21*32为672,3*4为12,在乘法操作时,ready信号为低电平表示在工作中不能再输入进行计算,当计算结束则变为高电平。
实验三 串口调试 直接返回数据
实验三串口调试直接返回数据一、实验目的:1、了解单片机串行口的结构、使用方法,学习串行口应用程序的编写方法。
2、熟悉单片机串行口接收和发送数据的实现方法。
3、熟悉单片机串行通信的格式规定。
4、掌握μVision环境中调试串行口应用程序的方法。
二、实验设备:51/AVR实验板、USB连接线、电脑软件:Keil μVision、串口调试助手v2.2、STC-ISP-V480三、实验原理:通信是人们传递信息的方式。
计算机通信是将计算机技术和通信技术相结合,完成计算机与外部设备或计算机与计算机之间的信息交换。
这种信息交换可以分为两大类:并行通信与串行通信。
并行通信通常是将数据字节的各位用多条数据线同时进行传送,如图所示:由图可见,并行通信除了数据线外还有通信联络控制线。
数据发送方在发送数据前,要询问数据接收方是否“准备就绪”。
数据接收方收到数据后,要向数据发送方回送数据已经接收到的“应答”信号。
并行通信的特点是:控制简单,传输速度快。
由于传输线较多,长距离传送时成本高且接收方的各位同时接收存在困难。
串行通信是将数据字节分成一位一位的形式在一条传输线上逐个地传送,串行通信时,数据发送设备先将数据代码由并行形式转换成串行形式,然后一位一位地放在传输线上进行传送。
数据接收设备将接收到的串行形式数据转换成并行形式进行存储或处理。
串行通信的特点是:传输线少,长距离传送时成本低,且可以利用电话网等现成的设备。
但数据的传送控制比并行通信复杂。
异步通信是指通信的发送与接收设备使用各自的时钟控制数据的发送和接收过程。
为使双方的收发协调,要求发送和接收设备的时钟尽可能一致。
为了实现异步传输字符的同步,采用的办法是使传送的每一个字符都以起始位“0”开始,以停止位“1”结束。
这样,传送的每一个字符都用起始位来进行收发双方的同步。
停止位和间隙作为时钟频率偏差的缓冲,即使双方时钟频率略有偏差,总的数据流也不会因偏差的积累而导致数据错位。
串口通信实验
院系电子信息工程学院班级姓名学号实验名称实验三串口通信实验实验日期
串口寄存器的配置
四、实验步骤
1.设计电路原理图
院系电子信息工程学院班级姓名学号实验名称实验三串口通信实验实验日期
2.在proteus中实现电路原理图
3.根据原理图在keil中编写代码,将代码编译生成hex文件
U1: #include<reg51.h>
unsigned char a=0;
void isr_int0();
void isr_uart();
void main()
{
TMOD=0x20;
TH1=0xE8;
TL1=0xE8;
SCON=0x40;
PCON=0;
TR1=1;IT0=1;
EA=1;ES=1;EX0=1;
SBUF=a;
while(1);
}
苏州市职业大学实验报告
苏州市职业大学实验报告
院系电子信息工程学院班级姓名学号实验名称实验三串口通信实验实验日期
3.运行程序
5.调试程序。
串口UART3实验
3.利用串口下载程序:loadb 20008000;文件传输成功,输入“go 20008000”
4.将串口接到UART3口,实验结果为在超级终端中输入“a”,回显的内容为“a”
5.修改程序,实现输入“a”,显示“b”。
{
GPD0CON &=~(0xF << 0);
MP0_4CON = 0x00000000;
clock_init();
uart_init();
while(1)
{
while (!(UFSTAT3 & 0xFF)==0)
{
UTXH3= URXH3; //将接收的数据发送
}
}
}
5
1.准备好实验环境,将串口UART2连接好。给开发板上电,使Bootloader停在菜单处。
ULCON3= 0x3;//数据位8,无校验,停止位1
UCON3= 0x5; //时钟为PCLK,禁止中断,使能UART收发
UBRDIV3= 35;//设置波特率(667000000/(1152000*16) )–1=36.1-1=35.1
UDIVSLOT3= 0x1;// n/16=0.1
}
void main(void)
实验相应寄存器
用的相关寄存器:
实验程序
#define ULCON3(*(volatile unsigned long *)0xE2900C00)
#define UCON3(*(volatile unsigned long *)0xE2900C04)
#define UFCON3(*(volatile unsigned long *)0xE2900C08)
实验三 串口实验
实验三串口实验一.实验目的学习使用串口实现与PC机的通讯。
正确配置CC2530的串口来实现串口通信的功能。
二.实验环境硬件:PC机,EBDCC2530节点板,USB接口仿真器,6Pin串口线,交叉串口线。
软件:Windows98/2000/NT/XP,IAR集成开发环境,串口调试助手。
三.实验原理下面我们来介绍串口实验所学习到的主要寄存器。
CLKCONCMD:时钟频率控制寄存器。
D7 D6 D5~D3 D2~D032KHZ 时间振荡器选择系统时钟选择定时器输出标记系统主时钟选择D7位为32KHZ时间振荡器选择,0为32KRC震荡,1为32K晶振。
默认设置为1。
D6位为系统时钟选择。
0为32M晶振,1为16MRC震荡。
当D7位为0时D6必须为1。
D5~D3为定时器输出标记。
000为32MHZ,001为16MHZ,010为8MHZ,011为4MHZ,100为2MHZ,101为1MHZ,110为500KHZ,111为250KHZ。
默认为001。
需要注意的是:当D6为1时,定时器最高可采用频率为16MHZ。
D2~D0:系统主时钟选择:000为32MHZ,001为16MHZ,010为8MHZ,011为4MHZ,100为2MHZ,101为1MHZ,110为500KHZ,111为250KHZ。
当D6为1时,系统主时钟可采用的最高频率为16MHZ。
CLKCONSTA:时间频率状态寄存器。
D7 D6 D5~D3 D2~D032KHZ 时间振荡器选择当前系统时钟当前定时器输出标记当前系统主时钟D7位为当前32KHZ时间振荡器频率。
0为32KRC震荡,1为32K晶振。
D6位为当前系统时钟选择。
0为32M晶振,1为16MRC震荡。
D5~D3为当前定时器输出标记。
000为32MHZ,001为16MHZ,010为8MHZ,011为4MHZ,100为2MHZ,101为1MHZ,110为500KHZ,111为250KHZ。
《嵌入式系统原理与应用》实验报告03-UART通信实验
1.实验效果截图
2.源程序
#include "config.h"
#define UART_BPS 115200
void UART0_Ini(void)
{
uint16 chen;
PINSEL0=0x00000005;//set P0.0,P0.1 tobe UART0 port
U0LCR=0x83;
{uint8 temp;
const uint8 input[]="Please input your name:";
UART0_Ini();
UART0_Sendstring(input);
while(1)
{
temp=UART0_RcvByte();
UART0_Sehen=(Fpclk/16)/115200;
U0DLM=chen/256;//高八位
U0DLL=chen%256;//低八位
U0LCR=0x03;
}
void UART0_SendByte(uint8 data)
{
U0THR=data;
while((U0LSR&0x40)==0);
}
void UART0_Sendstring(const uint8 *str)
{
while(1)
{if(*str=='\0')break;
UART0_SendByte(*str++);}
}
uint8 UART0_RcvByte(void)
{
uint8 data;
while((U0LSR&0x01)==0);
data=U0RBR;
uart实验报告
uart实验报告
1. 实验目的
本次实验的目的是验证串口通信协议UART的功能,通过USB-UART转换器控制开发板的板载LED的状态,以及通过调试软件UART通信观察调试台的信息输出。
2. 实验内容
本次实验环境是Espruino开发板,首先通过USB线将开发板连接至PC,使用一款USB-UART转换器将开发板连接至调试软件 PuTTY上,去UART连接口设置为9200,然后打开Espruino IDE软件,在终端上编写代码,不断编译及执行代码,以实现LED灯的转换状态。
具体实现步骤如下:
(1)安装Espruino IDE软件,建立编程环境,编写具体编程代码。
(3)将编写好的代码上传到Espruino,在调试软件 PuTTY 上可以看到板载 LED有明暗转换的视觉效果,从而验证Uart功能正常。
进阶项目(3)UART串口通信程序设计讲解
进阶项⽬(3)UART串⼝通信程序设计讲解写在前⾯的话UART串⾏接⼝简称串⼝,是我们各类芯⽚最常⽤的⼀种异步通信接⼝,通过串⼝我们就可以建⽴起计算机和我们实验板之间的通信和控制关系,也就是我们通常所说的上下位机通信。
串⼝可以说是不同平台互相通信、控制的⼀个最基本的接⼝。
项⽬需求设计⼀个UART控制器,当控制器从上位机接收到数据以后,马上将数据输出,发送回上位机,完成“回环测试”。
UART的原理分析要实现UART通信,⾸先我们需要⽤到⼀个外部的电平转换芯⽚MAX232,其具体配置电路如下:注解:MAX232芯⽚是美信(MAXIM)公司专为RS_232标准串⼝设计的单电源电平转换芯⽚,使⽤+5V单电源供电主要特点:符合所有的RS_232技术标准只需要单⼀+5V电源供电⽚载电荷泵具有升压、电源极性翻转能⼒,能够产⽣+10V和-10V电压功耗低,典型供电电流5MA内部集成2个RS_232驱动器⾼集成度,⽚外最低只需四个电容即可⼯作由原理图可以看出,最终我们FPGA需要控制的其实也就是两条信号线:RXD和TXD,分别为数据接收线和数据发送线。
那么接下来,问题就变得简单了,既然只有两条线,那么我们只需要关注其数据收发时序即可,时序图如下:UART数据格式:说明:在此实验中,⽆奇偶校验位,则⼀帧数据为⼗位。
(奇偶校验是⼀种校验代码正确性的。
根据被传输的⼀组⼆进制代码的数位中“1”的个数是奇数或偶数来进⾏校验。
采⽤的称为奇校验,反之,称为偶校验。
采⽤何种校验是事先规定好的。
通常专门设置⼀个奇偶校验位,⽤它使这组中“1”的个数为奇数或偶数。
若⽤奇校验,则当接收端收到这组代码时,校验“1”的个数是否为奇数,从⽽确定传输代码的正确性。
)在UART接收时,采集⼀帧数据的中间8位有效位,忽略开始位与停⽌位;在UART发送时,将发送的并⾏8位数据转为串⾏数据,并添加开始位与停⽌位。
UART中的⼀帧数据为10位,空闲时均为⾼电平,在检测到开始位(低电平)之后,开始采集8位有效数据位(低位在前),再将停⽌位置为⾼电平即可。
UART串口通信实验报告
实验四UART串口通信学院:研究生院学号:1400030034姓名:张秋明一、实验目的及要求设计一个UART串口通信协议,实现“串<-->并”转换功能的电路,也就是“通用异步收发器”。
二、实验原理UART是一种通用串行数据总线,用于异步通信。
该总线双向通信,可以实现全双工传输和接收。
在嵌入式设计中,UART用来主机与辅助设备通信,如汽车音响与外接AP之间的通信,与PC机通信包括与监控调试器和其它器件,如EEPROM通信。
UART作为异步串口通信协议的一种,工作原理是将传输数据的每个字符一位接一位地传输。
其中各位的意义如下:起始位:先发出一个逻辑”0”的信号,表示传输字符的开始。
资料位:紧接着起始位之后。
资料位的个数可以是4、5、6、7、8等,构成一个字符。
通常采用ASCII码。
从最低位开始传送,靠时钟定位。
奇偶校验位:资料位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验资料传送的正确性。
停止位:它是一个字符数据的结束标志。
可以是1位、1.5位、2位的高电平。
由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。
因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。
适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。
空闲位:处于逻辑“1”状态,表示当前线路上没有资料传送。
波特率:是衡量资料传送速率的指标。
表示每秒钟传送的符号数(symbol)。
一个符号代表的信息量(比特数)与符号的阶数有关。
例如资料传送速率为120字符/秒,传输使用256阶符号,每个符号代表8bit,则波特率就是120baud,比特率是120*8=960bit/s。
这两者的概念很容易搞错。
三、实现程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity uart isport(clk : in std_logic; --系统时钟rst_n: in std_logic; --复位信号rs232_rx: in std_logic; --RS232接收数据信号;rs232_tx: out std_logic --RS232发送数据信号;); end uart;architecture behav of uart iscomponent uart_rx port(clk : in std_logic; --系统时钟rst_n: in std_logic; --复位信号rs232_rx: in std_logic; --RS232接收数据信号clk_bps: in std_logic; --此时clk_bps的高电平为接收数据的采样点bps_start:out std_logic;--接收到数据后,波特率时钟启动置位rx_data: out std_logic_vector(7 downto 0); --接收数据寄存器,保存直至下一个数据来到rx_int: out std_logic --接收数据中断信号,接收数据期间时钟为高电平,传送给串口发送);end component;component speed_select port(clk : in std_logic; --系统时钟rst_n: in std_logic; --复位信号clk_bps: out std_logic; --此时clk_bps 的高电平为接收或者发送数据位的中间采样点bps_start:in std_logic --接收数据后,波特率时钟启动信号置位);end component;component uart_tx port(clk : in std_logic; --系统时钟rst_n: in std_logic; --复位信号rs232_tx: out std_logic; --RS232接收数据信号clk_bps: in std_logic; --此时clk_bps 的高电平为接收数据的采样点bps_start:out std_logic;--接收到数据后,波特率时钟启动置位rx_data: in std_logic_vector(7 downto 0); --接收数据寄存器,保存直至下一个数据来到rx_int: in std_logic --接收数据中断信号,接收数据期间时钟为高电平,传送给串口发送模块,使得串口正在进行接收数据的时候,发送模块不工作,避免了一个完整的数据(1位起始位、8位数据位、1位停止位)还没有接收完全时,发送模块就已经将不正确的数据传输出去);end component;signal bps_start_1:std_logic;signal bps_start_2:std_logic;signal clk_bps_1:std_logic;signal clk_bps_2:std_logic;signal rx_data:std_logic_vector(7 downto 0);signal rx_int:std_logic;beginRX_TOP: uart_rx port map(clk=>clk,rst_n=>rst_n,rs232_rx=>rs232_rx,clk_bps=>clk_bps_1,bps_start=>bps_start_1,rx_data=>rx_data,rx_int=>rx_int);SPEED_TOP_RX: speed_select port map(clk=>clk,rst_n=>rst_n,clk_bps=>clk_bps_1,bps_start=>bps_start_1);TX_TOP:uart_tx port map(clk=>clk, --系统时钟rst_n=>rst_n, --复位信号rs232_tx=>rs232_tx, --RS232发送数据信号clk_bps=>clk_bps_2, --此时clk_bps 的高电平为发送数据的采样点bps_start=>bps_start_2,--接收到数据后,波特率时钟启动置位rx_data=>rx_data, --接收数据寄存器,保存直至下一个数据来到rx_int=>rx_int --接收数据中断信号,接收数据期间时钟为高电平,传送给串口发送模块,使得串口正在进行接收数据的时候,发送模块不工作,避免了一个完整的数据(1位起始位、8位数据位、1位停止位)还没有接收完全时,发送模块就已经将不正确的数据传输出去);SPEED_TOP_TX: speed_select port map(clk=>clk,rst_n=>rst_n,clk_bps=>clk_bps_2,bps_start=>bps_start_2);end behav;-----------------------------------------------------------------------------------------------------------------------3个子模块------------------------------------------------------------------------------异步接收模块-------------------------------------------library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity uart_rx isport(clk : in std_logic; --系统时钟rst_n: in std_logic; --复位信号rs232_rx: in std_logic; --RS232接收数据信号clk_bps: in std_logic; --此时clk_bps的高电平为接收数据的采样点bps_start:out std_logic;--接收到数据后,波特率时钟启动置位rx_data: out std_logic_vector(7 downto 0); --接收数据寄存器,保存直至下一个数据来到rx_int: out std_logic --接收数据中断信号,接收数据期间时钟为高电平,传送给串口发送模块,使得串口正在进行接收数据的时候,发送模块不工作,避免了一个完整的数据(1位起始位、8位数据位、1位停止位)还没有接收完全时,发送模块就已经将不正确的数据传输出去); end uart_rx;architecture behav of uart_rx issignal rs232_rx0: std_logic;signal rs232_rx1: std_logic;signal rs232_rx2: std_logic;signal rs232_rx3: std_logic;signal neg_rs232_rx:std_logic;signal bps_start_r:std_logic;signal num:integer;signal rx_data_r:std_logic_vector(7 downto 0); --串口接收数据寄存器,保存直至下一个数据到来beginprocess(clk,rst_n)beginif (rst_n='0')thenrs232_rx0<='0';rs232_rx1<='0';rs232_rx2<='0';rs232_rx3<='0';elseif (rising_edge(clk)) thenrs232_rx0<=rs232_rx;rs232_rx1<=rs232_rx0;rs232_rx2<=rs232_rx1;rs232_rx3<=rs232_rx2;end if;end if;neg_rs232_rx <=rs232_rx3 and rs232_rx2 and not(rs232_rx1)and not(rs232_rx0);end process;process(clk,rst_n)beginif (rst_n='0')thenbps_start_r<='0';rx_int<='0';elseif (rising_edge(clk)) thenif(neg_rs232_rx='1') then--接收到串口数据线rs232_rx 的下降沿标志信号bps_start_r<='1'; --启动串口准备数据接收rx_int<='1';--接收数据中断信号使能else if((num= 15) and (clk_bps='1')) then --接收完有用数据信息bps_start_r<='0'; --数据接收完毕,释放波特率启动信号rx_int<='0';--接收数据中断信号关闭end if;end if;end if;end if;bps_start<=bps_start_r;end process;process(clk,rst_n)beginif (rst_n='0')thenrx_data_r<="00000000";rx_data<="00000000";num<=0;elseif (rising_edge(clk)) thenif(clk_bps='1')thennum<=num+1;case num iswhen 1=>rx_data_r(0)<=rs232_rx;--锁存第0bitwhen 2=>rx_data_r(1)<=rs232_rx;--锁存第0bitwhen 3=>rx_data_r(2)<=rs232_rx;--锁存第0bitwhen 4=>rx_data_r(3)<=rs232_rx;--锁存第0bitwhen 5=>rx_data_r(4)<=rs232_rx;--锁存第0bitwhen 6=>rx_data_r(5)<=rs232_rx;--锁存第0bitwhen 7=>rx_data_r(6)<=rs232_rx;--锁存第0bitwhen 8=>rx_data_r(7)<=rs232_rx;--锁存第0bitwhen 10=>rx_data<=rx_data_r;when 11=>num<=15;when others=>null;end case;if(num=15) thennum<=0;end if;end if;end if;end if;end process;end behav;---------------------------------波特率控制模块-----------------------------------------library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity speed_select isport(clk : in std_logic; --系统时钟rst_n: in std_logic; --复位信号clk_bps: out std_logic; --此时clk_bps的高电平为接收或者发送数据位的中间采样点bps_start:in std_logic--接收数据后,波特率时钟启动信号置位或者开始发送数据时,波特率时钟启动信号置位);end speed_select;architecture behav of speed_select issignal cnt:std_logic_vector(12 downto 0);signal clk_bps_r:std_logic;constant BPS_PARA:integer:=5207;constant BPS_PARA_2:integer:=2603;beginprocess(clk,rst_n)beginif (rst_n='0')thencnt<="0000000000000";elseif (rising_edge(clk)) thenif((cnt=BPS_PARA)or(bps_start='0')) thencnt<="0000000000000"; --波特率计数器清零elsecnt<=cnt+'1';--波特率时钟计数启动end if;end if;end if;end process;process(clk,rst_n)beginif (rst_n='0')thenclk_bps_r<='0';elseif (rising_edge(clk)) thenif(cnt=BPS_PARA_2) thenclk_bps_r<='1'; --clk_bps_r高电平为接收数据位的中间采样点,同时也作为发送数据的数据改变点elseclk_bps_r<='0'; --波特率计数器清零end if;end if;end if;clk_bps<=clk_bps_r;end process;end behav;---------------------------------异步发送模块-------------------------------------------library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity uart_tx isport(clk : in std_logic; --系统时钟rst_n: in std_logic; --复位信号rs232_tx: out std_logic; --RS232接收数据信号clk_bps: in std_logic; --此时clk_bps的高电平为接收数据的采样点bps_start:out std_logic;--接收到数据后,波特率时钟启动置位rx_data: in std_logic_vector(7 downto 0); --接收数据寄存器,保存直至下一个数据来到rx_int: in std_logic --接收数据中断信号,接收数据期间时钟为高电平,传送给串口发送模块,使得串口正在进行接收数据的时候,发送模块不工作,避免了一个完整的数据(1位起始位、8位数据位、1位停止位)还没有接收完全时,发送模块就已经将不正确的数据传输出去); end uart_tx;architecture behav of uart_tx issignal rx_int0: std_logic;signal rx_int1: std_logic;signal rx_int2: std_logic;signal neg_rx_int:std_logic;signal bps_start_r:std_logic;signal num:integer;signal tx_data:std_logic_vector(7 downto 0); --串口接收数据寄存器,保存直至下一个数据到来beginprocess(clk,rst_n)beginif (rst_n='0')thenrx_int0<='0';rx_int1<='0';rx_int2<='0';elseif (rising_edge(clk)) thenrx_int0<=rx_int;rx_int1<=rx_int0;rx_int2<=rx_int1;end if;end if;neg_rx_int <=not(rx_int1)and (rx_int2);end process;process(clk,rst_n)beginif (rst_n='0')thenbps_start_r<='0';tx_data<="00000000";elseif (rising_edge(clk)) thenif(neg_rx_int='1') then--接收到串口数据线rs232_rx的下降沿标志信号bps_start_r<='1'; --启动串口准备数据接收tx_data<=rx_data;--接收数据中断信号使能else if((num= 15) and (clk_bps='1')) then --接收完有用数据信息bps_start_r<='0'; --数据接收完毕,释放波特率启动信号end if;end if;end if;end if;bps_start<=bps_start_r;end process;process(clk,rst_n)beginif (rst_n='0')thenrs232_tx<='1';num<=0;elseif (rising_edge(clk)) thenif(clk_bps='1')thennum<=num+1;case num iswhen 1=>rs232_tx<='0';when 2=>rs232_tx<=tx_data(0);--发送第1bitwhen 3=>rs232_tx<=tx_data(1);--发送第2bitwhen 4=>rs232_tx<=tx_data(2);--发送第3bitwhen 5=>rs232_tx<=tx_data(3);--发送第4bitwhen 6=>rs232_tx<=tx_data(4);--发送第5bitwhen 7=>rs232_tx<=tx_data(5);--发送第6bitwhen 8=>rs232_tx<=tx_data(6);--发送第7bitwhen 9=>rs232_tx<=tx_data(7);--发送第8bitwhen 10=>rs232_tx<='1';when 11=>num<=15;when others=>null;end case;if(num=15) thennum<=0;end if;end if;end if;end if;end process;end behav;四、实验步骤1、建立新工程UART,选择芯片,型号为cyclone ii EP2C35F484C8。
S3C2410的UART串口通信实验
S3C2410的UART串口通信实验实验7 S3C2410 的UART串口通信实验一、实验目的掌握S3C2410 UART串口的工作原理和编程方法,掌握和UART 串口有关寄存器UCONX、ULCONX、UFCONX、UMCONX、UBRDIVX的格式和使用方法,会用C语言对UART串口进行初始化编程和读写操作,重点理解UART串口通信波特率和波特率除数寄存器初值设置的关系,熟练掌握串口调试助手的用法。
二、实验内容PC机向S3C2410发送数据,S3C2410接到数据后有马上将所接到的数据没有变化的发送给PC,要求用串口调试助手看到调试结果。
三、UART串口相关知识初始化串口的过程为:UFCON0和UMCON0(地址为0x5000000C)置为0,表示不使用FIFO,不使用流控制;ULCON0置为0x03,表示有1位停止位,8位数据位,无校验位;UCON0置为0x05,表示串口工作方式为中断方式或询问方式;UBRDIV0置为0x270,表示波特率为4800 bps(1 bps=1 bit/s,计算方法为:PCLK(48MHz)/16/波特率–1= 0x270;如果设置为0x19,则波特率为115200 bps。
串口读写方式有两种,即轮询方式和中断方式。
轮询方式下,在死循环中进行串口的读写过程,中断方式下,当串口收到数据后或发送数据前将产生中断。
串口0的收发占用了GPH3和GPH2,需要配置这两个管脚为串口通信功能。
四、参考程序(1)UART初始化程序段41 void initUART0()42 {43 UFCON0 = 0x00;44 UMCON0 = 0x00;45 ULCON0 = 0x03; // One Stop, no parity, 8-bit46 UCON0 = 0x05;47 UBRDIV0 = 0x270; // 4800bps48 // PCLK=48MHz, Baudrate:4800bps, 0x270;49 // 115200bps, 0x1950 }(2)查询方式主要程序段29 // After received, Transfer it30 while(UTRSTAT0 & 0x01) // have data31 {32 uart0Ch[0] = URXH0; // Recieve33 while(UTRSTAT0 & 0x02)// Tras ready34 {35 UTXH0 = uart0Ch[0];36 }37 }(3)中断方式主要程序段67 void openUART0(void)68 {69 INTMOD = 0x0;70 INTMSK &= ~((1<<28) | (1<<9));// open dog and UART071 // Priority lower than watchdog72 INTSUBMSK =0x7FE; //&= ~(1<<0);// INT_RXD0 locates at73 PRIORITY = 0x7F;74 }7576 __irq void c_UART0_ISR()77 {7879 int iReg=0;80 if(SRCPND | (1<<28))81 SRCPND |= (1<<28);82 if(INTPND | (1<<28))83 INTPND |= (1<<28);84 if(SUBSRCPND | (1<<0))85 SUBSRCPND |= (1<<0);86 //if(SUBSRCPND | (1<<1))87 // SUBSRCPND |= (1<<1);88 chUart0[0] = URXH0;89 //while(0);90 while(UTRSTAT0 & 0x02) // Tras ready91 {92 UTXH0 = chUart0[0];93 }五、实验结果自己作答六、实验心得体会。
实验三 串口控制实验
实验三串口控制实验1.实验目的通过实验,掌握UART各个控制寄存器的设置,并能使用串口向PC机发送数据。
2.实验设备硬件:PC机一台,EasyARM2200教学实验平台一套软件:Windows98/2000/XP系统,ADS1.2集成开发环境,EasyARM软件3.实验内容使用UART0想PC机发送字符串“HelloWorld!”。
UART0设置:通信波特率115200,8位数据位,1位停止位,无奇偶校验。
4.实验预习要求(1)仔细阅读教材中,关于UART0的说明。
(2)阅读SP3232E芯片数据,了解此芯片的作用,参考“SP3222E_3232E_cn.pdf”。
5.实验步骤(1)启动ADS1.2IDE集成开发环境,选择File→New,使用ARMExecutableImageforlpc22xx 工程模板建立一个工程,工程名为SendStr_c。
(2)建立源文件SendStr.c,编写实验程序,然后添加到工程的user组中。
(3)选择DebugInExram生成目标,然后编译链接工程。
(4)将EasyARM2200教学实验平台上的JP9跳线短接,JP4跳线断开,JP6跳线设置为Bank0-RAM和Bank1-FLASH。
(5)使用串口延长线吧EasyARM2200教学实验平台的CZ2(UART0)与PC机的COM1连接。
PC机运行EasyARM软件,设置串口为COM1,波特率为115200,然后选择“设置”→“发送数据”,在弹出窗口中单击“高级”,即可打开接收窗口查看接受情况。
如图3.1。
(6)选择“Project”→“Debug”,启动AXD进行JTAG仿真调试。
(7)PC机上的EasyARM软件会不断的显示“HelloWorld!”。
如图3.2。
图3.1打开EasyARM软件程序清单SendStr.c*文件名:SENDSTR.C*功能:向串口发送数据。
*说明:使用外部11.0592MHz晶振,根据CONFIG.H文件配置,Fpclk=11.0592MHz;*通讯波特率115200,8位数据位,1位停止位,无奇偶校验。
第三次实验 串口实验
第三次实验串口实验一、实验报告内容:1、实验目的和内容;要求:通过串口0从PC机接收数据,再发给PC机显示出来,再结合流水灯显示。
2、自己编写的程序;3、实验现象记录和相关截图;4、实验中出现问题和调试分析。
二、实验任务:1.看懂原理图的接口连接;2.端口初始化函数Port_Init(),找到和串口相关的初始化语句,解释;3.串口初始化函数Uart_Init(0,115200),对其记录(截图,截和自己实验相关的串口),并进行注释;计算出波特率;4.函数Uart_Select(0)是什么?解释清楚;5.编写接收一个字节的函数aa= Uart_Getch();对其进行详细的记录和解释;6.完成:如何发送一个字符?7.画接收过程的流程图。
三、实验步骤1.新建工程文件。
2.定义与UART 有关的各个寄存器地址和一些特殊的位命令,加以解释。
3.编写串口驱动函数:4.在主函数中实现将从串口0 接收到的数据发送到串口0(Main.c):实验参考程序:#include "def.h"#include "option.h"#include "2440addr.h"#include "2440lib.h"#include "2440slib.h"#include <string.h>#include <stdio.h>//================================#define rUTRSTAT0 (*(volatile unsigned *)0x50000010)#define rUTRSTAT1 (*(volatile unsigned *)0x50004010)#define WrUTXH0(ch) (*(volatile unsigned char *)0x50000020)=(unsigned char)(ch)#define WrUTXH1(ch) (*(volatile unsigned char *)0x50004020)=(unsigned char)(ch)#define RdURXH0() (*(volatile unsigned char *)0x50000024) #define RdURXH1() (*(volatile unsigned char *)0x50004024)void Uart_Init(int mclk,int baud);void Uart_Select(int ch);void Uart_TxEmpty(int ch);char Uart_Getch(void);char Uart_GetKey(void);void Uart_GetString(char *string);int Uart_GetIntNum(void);void Uart_SendByte(int data);void Uart_SendString(char *pt);void Uart_Printf(char *fmt,...);void dely(U32 tt){U32 i;for(;tt>0;tt--){for(i=0;i<10000;i++){}}}int Main(int argc, char **argv){char c1[1];char err;U8 aa;ChangeMPllValue(68,1,1);Port_Init();Uart_Select(0);Uart_Init(0,115200);MMU_DisableICache();MMU_DisableDCache();while(1){aa= Uart_Getch();Uart_SendByte(aa );Uart_SendByte(10);switch(aa){case 'a':Uart_Printf("\nYou Pressed 'a'");点流水灯break;case 'b':Uart_Printf("\nYou Pressed 'b'");点流水灯break;case 'c':Uart_Printf("\nYou Pressed 'c'");点流水灯break;default :break;}}return 0;}//*************************[ MPLL ]******************************* void ChangeMPllValue(int mdiv,int pdiv,int sdiv){rMPLLCON = (mdiv<<12) | (pdiv<<4) | sdiv; // 计算PCLK的大小?}在下面的函数中那条语句完成了对串口用到的端口的初始化?void Port_Init(void){rGPACON = 0x7fffff;rGPBCON = 0x015550;rGPBUP = 0x7ff;rGPCCON = 0xaaa956aa;rGPCUP = 0xffff;rGPDCON = 0xaaaaaaaa;rGPDUP = 0xffff;rGPECON = 0xa02aa800;rGPEUP = 0xffff;rGPFCON = 0x55aa;rGPFUP = 0xff;rGPGCON = 0x00a2aaaa;rGPGUP = 0xffff;rGPHCON = 0x00faaa;rGPHUP = 0x7ff;rGPJCON = 0x02aaaaaa;rGPJUP = 0x1fff;//External interrupt will be falling edge triggered.rEXTINT0 = 0x22222222;rEXTINT1 = 0x22222222;rEXTINT2 = 0x22222222;}void Uart_Select(int ch){whichUart = ch;}逐条注释语句void Uart_Init(int pclk,int baud){int i;if(pclk == 0)pclk = 38000000;// pclk = PCLK;rUFCON0 = 0x0;rUFCON1 = 0x0;rUFCON2 = 0x0;rUMCON0 = 0x0;rUMCON1 = 0x0;//UART0rULCON0 = 0x3;rUCON0 = 0x245;rUBRDIV0=( (int)(pclk/16./baud+0.5) -1 ); //UART1rULCON1 = 0x3;rUCON1 = 0x245;rUBRDIV1=( (int)(pclk/16./baud+0.5) -1 ); //UART2rULCON2 = 0x3;rUCON2 = 0x245;rUBRDIV2=( (int)(pclk/16./baud+0.5) -1 );for(i=0;i<100;i++);}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
串行通信的传输格式
串行通信时微计算机之间一种常见的近距离通信手段,因使用方 便,编程简单而广泛使用,几乎所有的微控制器,PC 都提供串行通信 接口。 (1) 开始前,线路处于空闲状态,送出连续“1”。传送开始时 首先发一个“0”作为起始位。 (2) 然后出现在通信线上的是字符的二进制编码数据。每个字 符的数据位长可以约定为:5 位、6 位、7 位或8 位,一般 采用ASCII 编码。 (3) 奇偶校验位,根据约定,用奇偶校验位将所传的字符中 为“1”的位数凑成奇数个或偶数个。也可以约定不要奇偶 校验,这样就取消奇偶校验位。 (4) 最后是表示停止位的“1”信号,这个停止位可以约定连续 1 位、1.5 位或2 位的时间宽度。 (5) 至此一个字符传送完毕,线路又进入空闲,持续为“1”。 经过一段随机的时间后,下一个字符开始传送。
接收数据主函数
void myUart_receive(char *string) { char *string2 = string; char c; myUart_Init(0,115200); while((c = myUart_ReceiveByte())!='\r') { if(c=='\b') { if( (int)string2 < (int)string ) { printf("\b \b"); string--; } } else { *string++ = c; myUart_SendByte(c); } } *string='\0'; myUart_SendByte('\n'); }
接收数据
while(rUTRSTAT0&0x1) //检查状态寄存器,是否有数据到来,启动接收过程 data=rURXH0; //将数据写到数据端口
发送数据
while(rUTRSTAT0&0x2); //等待发送缓存区为空
rURXH0=data;//发送数据
发送数据主函数
void myUart_Send (char *str) { myUart_Init(0,115200); while (*str) myUart_SendByte(*str++); }
(1)RTS 与CTS 互联:只要请求发送,立即得到允许 (2)DTR 与DSR 互联:只要本端准备好,认为本端立即可以接收 (DSR、数传机准 备好)
5、S3C2410A 的UART 介绍
S3C2410A 的UART(通用异步串行接口)单元提供了三个独立的 异步串行I/O 端口,每个都可以在中断和DMA 两种模式下进行,他们支 持的最高波特率是115.2Kbps。每个UART 通道包含2 个16 字节的FIFO 分别提供接收和发送。 S3C2410A 的UART 可以进行以下参数的设置:可编程的波特率, 红外收/发模式,1 或2 个停止位,5 位、6 位、7 位或8 位数据宽度和奇 偶校验。 每个UART 包含波特率发生器、接收器,发送器和控制单元。波特 率发生器以MCLK为时钟源。发送器和接收器包含16 字节FIFO 寄存器 和数据移位寄存器,当发送数据的时候,数据先写道FIFO,然后拷贝到 发送移位寄存器,然后从数据输出端口(TxDn)依次被移位输出。被 接收的数据也同样从接收端口(RxDn)移位输入到移位寄存器,然后 拷贝到FIFO 中。
最简单的串口通信
当通信距离较近时,只需使用少数几根信号线就可实现数据通信。 最简单的情况只需三根线(发送线、接收线、信号地线)便可实现全双 工异步串行通信。 无 Modem 时,最大通信距离按如下方式计算:RS-232C 标准规 定,当误码率小于4%时,要求导线的电容值应小于2500PF。对于普通 导线,其电容值约为170PF/M。则允许距离L=2500PF/(170PF/M) =15M。 这一距离的计算,是偏于保守的,实际应用中,当使用9600bps, 普通双绞屏蔽线时,距离可达30~35 米。 零 Modem 的最简单连线(3 线制) 下图是零 MODEM 方式的最简单连接(即三线连接),图中的2 号线与3 号线交叉连接是因为在直连方式时,把通信双方都当作数据终 端设备看待,双方都可发也可收。在这种方式下,通信双方的任何一 方,只要请求发送RTS 有效和数据终端准备好DTR 有效就能开始发送 和接收。
数据接收操作
与数据发送一样,数据接收的帧也是可以编程的,它包含一个开始 位,5 到8 个数据,一个可选的奇偶位和一位到两位停止位,他们是通 过线性控制器(ULCONn)来设置的。接收器能够检测溢出错误,奇偶 检验错误,帧错误和中止状况,每种情况下都将会产生一个错误标志置 位。
波特率发生器
每个 UART 的波特率发生器为传输提供了串行移位时钟。波特率 产生器的时钟源可以从S3C2410A 的内部系统时钟或UCLK 中来选择。 波特率由时钟源(PCLK 或UCLK)16分频和UART 波特率除数寄存器 (UBRDIn)指定的16 位除数决定。UBRDIn 的值可以按照下式确定: UBRDIn=(int)(PCLK/(bps*16))-1 除数的范围为 1 到(16**2-1)。例如,如果波特率为115200bps 且PCLK 或UCLK 为50MHz,则UBRDIn 为: UBRDIn =(int)(50000000/(115200×16))-1 =(int)(27.1)-1 =26
6、UART 应用编程示例
在本实验中,采用串口0.
串口初始化
rUFCON0=0xf7; //设置串口的FIFO 属性,并清除FIFO 中的内容 rUMCON0=0x0; //关闭控制流功能 rULCON0=0x3; //设置8 位数据,1 位停止位,无奇偶校验位串口模式 rUCON0=0x345; //设置收发的中断模式位电平触发关闭超时功能 rUBRDIV0=(int)(PCLK/(bps*16))-1; //设置波特率,pclk 为ARM 时钟频率,baud 为 传//输波特 率
4、实验原理
串行通信接口标准经过使用和发展,目前已经有几种。但都是 在RS-232 标准的基础上经过改进而形成的。所以,以RS-232C 为主来 讨论。RS-323C 标准是美国EIA(电子工业联合会)与BELL 等公司一起 开发的1969 年公布的通信协议。它适合于数据传输速率在0~20000b/s 范围内的通信。这个标准对串行通信接口的有关问题,如信号线功能、 电器特性都作了明确规定。由于通行设备厂商都生产与RS-232C 制式兼 容的通信设备,因此,它作为一种标准,目前已在微机通信接口中广泛 采用。 在讨论 RS-232C 接口标准的内容之前,先说明两点: 首先,RS-232-C 标准最初是远程通信连接数据终端设备DTE(Data Terminal Equipment)与数据通信设备DCE(Data Communication Equipment)而制定的。因此这个标准的制定,并未考虑计算机系统的应 用要求。但目前它又广泛地被借来用于计算机(更准确的说,是计算机 接口)与终端或外设之间的近端连接标准。显然,这个标准的有些规定 及和计算机系统是不一致的,甚至是相矛盾的。有了对这种背景的了 解,我们对RS-232C 标准与计算机不兼容的地方就不难理解了。 其次,RS-232C 标准中所提到的"发送"和"接收",都是站在DTE 立 场上,而不是站在DCE 的立场来定义的。由于在计算机系统中,往往 是CPU 和I/O 设备之间传送信息,两者都是DTE,因此双方都能发送掌握 ARM 中串行口通信原理 学习编程实现 S3C2410A 的UART 通信
2、实验内容
实现查寻方式串口的收发功能,接收来自串口的字符,并将接收 到的字符发送到超 级终端。
3、实验设备
GEC2410 开发板 ADS1.2 集成开发环境,ARM 仿真器 串口连接线
7、实验步骤
1. 将串口线一端接到 PC 机,另一端接到GEC2410 的UART0 接口(即P1 口);打开串口超级终端dnw.exe,设置串口 Baud Rate 为115200,选择COM1。 2. 打开 ADS CodeWarrior,在ADS CodeWarrior 中打开实验工 程GEC_RS232.mcp;并对工程进行编译。 3. 打开dnw.exe 超级终端,选择“Serial Port”中 的“connect” 4. 重启GEC2410,开发板会执行flash 中的BIOS 程序,输 入“1”,选择“UART download file”。
数据发送操作
数据发送帧的格式是可编程的,它包含一个开始位,5 到8 个数据 位,一个可选的奇偶位和一个或两个停止位,这些可以通过线性控制器 (UCONn)来设置。发送器也能够产生发送中止条件。中止条件迫使
串口输出保持在逻辑0 状态,这种状态保持一个传输帧的时间长度。通 常在一帧传输数据完整地传输完之后,在通过这个全0 的状态将中止信 号发送给对方。中止信号发送之后,传送数据连续放到FIFO 中(在不 使用FIFO 模式下,将被放到输出保持寄存器)。
9、实验结果
程序运行时,首先向串口打印字符串,然后等待用户输入,并把用 户输入的字符显示在超级终端上。
5. 点击“Serial Port” “Transmit”选择GEC_RS232 目录下 的可执行映象文件GEC_RS232.bin,将该文件下载 到SDRAM。 6. 下载结束后,会提示是否要立即运行,这时输入“Y”,执 行GEC_RS232.bin。 7. 在 dnw 中输入字符串,并观察串口打印字符串。 代码及执行结果截图: 8. 修改程序,实现菜单控制操作: ------------------menu------------------1:all turn out 2:all turn off 3:tickers Please enter your choice: 代码及执行结果截图: