UART实验报告,UART串口实验报告心得
本作品内容为UART实验报告,格式为 doc ,大小 56599 KB ,页数为 10页
('实验四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,比特率是1208=960bit/s。这两者的概念很容易搞错。三、实现程序libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;entityuartisport(clk:instd_logic;--系统时钟rst_n:instd_logic;--复位信号rs232_rx:instd_logic;--rs232接收数据信号;rs232_tx:outstd_logic--rs232发送数据信号;);enduart;architecturebehavofuartisrs232_rx:instd_logic;--rs232接收数据信号clk_bps:instd_logic;--此时clk_bps的高电平为接收数据的采样点bps_start:outstd_logic;--接收到数据后,波特率时钟启动置位rx_data:outstd_logic_vector(7downto0);--接收数据寄存器,保存直至下一个数据来到rx_int:outstd_logic--接收数据中断信号,接收数据期间时钟为高电平,传送给串口发送);bps_start:instd_logic--接收数据后,波特率时钟启动信号置位);bps_start:outstd_logic;--接收到数据后,波特率时钟启动置位rx_data:instd_logic_vector(7downto0);--接收数据寄存器,保存直至下一个数据来到rx_int:instd_logic--接收数据中断信号,接收数据期间时钟为高电平,传送给串口发送模块,使得串口正在进行接收数据的时候,发送模块不工作,避免了一个完整的数据(1位起始位、8位数据位、1位停止位)还没有接收完全时,发送模块就已经将不正确的数据传输出去);signalbps_start_1:std_logic;signalbps_start_2:std_logic;signalclk_bps_1:std_logic;signalclk_bps_2:std_logic;signalrx_data:std_logic_vector(7downto0);signalrx_int:std_logic;beginrx_top:uart_rxportmap(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_selectportmap(clk=>clk,rst_n=>rst_n,clk_bps=>clk_bps_1,bps_start=>bps_start_1);tx_top:uart_txportmap(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_selectportmap(clk=>clk,rst_n=>rst_n,clk_bps=>clk_bps_2,bps_start=>bps_start_2);endbehav;-----------------------------------------------------------------------------------------------------------------------3个子模块------------------------------------------------------------------------------异步接收模块-------------------------------------------libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityuart_rxisport(clk:instd_logic;--系统时钟rst_n:instd_logic;--复位信号rs232_rx:instd_logic;--rs232接收数据信号clk_bps:instd_logic;--此时clk_bps的高电平为接收数据的采样点bps_start:outstd_logic;--接收到数据后,波特率时钟启动置位rx_data:outstd_logic_vector(7downto0);--接收数据寄存器,保存直至下一个数据来到rx_int:outstd_logic--接收数据中断信号,接收数据期间时钟为高电平,传送给串口发送模块,使得串口正在进行接收数据的时候,发送模块不工作,避免了一个完整的数据(1位起始位、8位数据位、1位停止位)还没有接收完全时,发送模块就已经将不正确的数据传输出去);enduart_rx;architecturebehavofuart_rxissignalrs232_rx0:std_logic;signalrs232_rx1:std_logic;signalrs232_rx2:std_logic;signalrs232_rx3:std_logic;signalneg_rs232_rx:std_logic;signalbps_start_r:std_logic;signalnum:integer;signalrx_data_r:std_logic_vector(7downto0);--串口接收数据寄存器,保存直至下一个数据到来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;endif;endif;neg_rs232_rx<=rs232_rx3andrs232_rx2andnot(rs232_rx1)andnot(rs232_rx0);endprocess;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;--接收数据中断信号使能elseif((num=15)and(clk_bps=1))then--接收完有用数据信息bps_start_r<=0;--数据接收完毕,释放波特率启动信号rx_int<=0;--接收数据中断信号关闭endif;endif;endif;endif;bps_start<=bps_start_r;endprocess;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;casenumis篇二:armuart实验报告题目:一.实验目的通过实验,掌握uart查询1方式程序的设计二.实验设备?硬件:pc机一台?lpc2131教学实验开发平台一套?软件:windows98/xp/2000系统,ads1.2集成开发环境。?easyarm工具软件。三.实验内容四.实验步骤启动ads1.2,使用armexecutableimageforlpc2131工程模板建立一个工程dataret_c。②在user组中的main.c中编写主程序代码,在项目中的config.h文件中加入#include<stdio.h>。③选用debuginram生成目标,然后编译连接工程。④将easyarm2131开发板上的jp6跳线分别选择txd0和rxd0端时,方可进行uart0通信实验。⑥选择【project】->【debug】,启动axd进行jtag仿真调试。⑦全速运行程序,在pc机上的easyarm软件发送如“helloeasyarm2131!”字样的字符串,easyarm2131开发板接收到数据后,并将接收到的数据回发给pc机五.程序#include“config.h”#defineuart_bps115200/名称:delayns()功能:长软件延时入口参数:dly出口参数:无/voiddelayns(uint32dly){uint32i;for(;dly>0;dly--)for(i=0;i<5000;i++);}/函数名称:uart0_init()函数功能:串口初始化,设置为8位数据位,1位停止位,无奇偶校验,波特率为115200入口参数:无出口参数:无/voiduart0_init(void){}u0lcr=0x83;u0dlm=fdiv/256;u0dll=fdiv%256;u0lcr=0x03;//dlab=1,允许设置波特率//设置波特率fdiv=(fpclk/16)/uart_bps;uint16fdiv;延时参数,值越大,延时越久//串口通信波特率/函数名称:uart0_getbyte()函数功能:从串口接收1字节数据,使用查询方式接收入口参数:无出口参数:接收到的数据/uint8uart0_getbyte(void){}/函数名称:uart0_getstr()函数功能:从串口接收入口参数:sn出口参数:无/voiduart0_getstr(uint8s,uint32n){}/函数名称:uart0_sendbyte()函数功能:向串口发送字节数据入口参数:dat出口参数:无/voiduart0_sendbyte(uint8dat){}/函数名称:uart0_sendstr()函数功能:向串口发送一字符串入口参数:str要发送的字符串的指针u0thr=dat;//写入数据//等待数据发送完毕while((u0lsr&0x40)==0);要发送的数据for(;n>0;n--)s++=uart0_getbyte();指向接收数据数组的指针接收的个数uint8rcv_dat;while((u0lsr%0x01)==0);rcv_dat=u0rbr;return(rcv_dat);//等待接收标志置位出口参数:无/voiduart0_sendstr(uint8conststr){}/名称:main()功能:从串口uart0接收字符串“helloeasyarm2131!”,并发送回上位机显示说明:需要pc串口显示终端软件,如easyarm.exe。/intmain(void){uint8snd[32];pinsel0=0x00000005;}while(1);return(0);uart0_init();uart0_getstr(snd,18);delayns(10);uart0_sendstr(snd);delayns(10);//向串口发送字符串//从串口接收字符串//设置i/o连接到uart0//串口初始化while(1){}if(str==?\\0?)break;//遇到结束符,退出uart0_sendbyte(str++);//发送数据六.实验心得体会通过本次实验对lpc2131的uart有了进一步的认识和了解,在使用ads的编程过程中对j-tag调试中出现的一些错误积累了一些经验,对于串口编程和通信的实践操作有了很大的提高,总之实验使我收获很大,感谢学校给我这样的实验环境!篇三:uart实验报告嵌入式实验四实验报告3.4基于uart的加法器的实现一、实验目的学习lm3s9b92的串口通信学习应用超级终端调试串口学会应用uart有关的库函数二、实验设备计算机、lm3s9b92开发板、usba型公口转minib型5pin数据线1条三、实验原理stellaris系列arm的uart具有完全可编程、16c550型串行接口的特性。stellaris系列arm含有2至3个uart模块。四、实验要求采用超级终端作为外部输入与输出的接口,实现多位数的相加。即通过uart串口分别输入需要相加的多位数a与b,最后把a和b两个多位数相加的过程和结果,回显给用户。具体实现方法:既可以采用轮询的方式也可以应用中断。五、实验步骤1、连接实验设备:使用usbminib线缆的mini端与开发板icdi口相连,另一端接到pc机的usb插口上。2、根据实验要求编写、调试、运行程序。并要求在代码上附上相关的注释。#include<string.h>#includeinc/hw_ints.h#includeinc/hw_memmap.h#includeinc/hw_types.h#includedriverlib/debug.h#includedriverlib/gpio.h#includedriverlib/interrupt.h#includedriverlib/sysctl.h#includedriverlib/uart.h#includegrlib/grlib.h#includedrivers/kitronix320x240x16_ssd2119_8bit.h#includedrivers/set_pinout.h#includesysteminit.hvoiduartinit(void){sysctlperienable(sysctl_periph_uart0);//使能uart模块sysctlperienable(sysctl_periph_gpioa);//使能rx/tx所在的gpio端口gpiopintypeuart(gpio_porta_base,//配置rx/tx所在管脚为gpio_pin_0gpio_pin_1);//uart收发功能uartconfigset(uart0_base,//配置uart端口9600,//波特率:9600uart_config_wlen_8//数据位:8uart_config_stop_one//停止位:1uart_config_par_none);//校验位:无uartenable(uart0_base);//使能uart端口}voiduartputs(constchars){while(s!=\\0){uartcharput(uart0_base,(s++));}}main(void){charc,a[12];intsum=0,num=0,i;//jtagwait();//防止jtag失效,重要!clockinit();//时钟初始化:晶振,6mhzuartinit();//uart初始化uartputs(输入格式m+n=\\n);for(;;){c=uartcharget(uart0_base);//等待接收字符if(c>=0&&c<=9)//判断收到的是否为字符{num=num10+c-0;//将收到的字符转换为整形储存}elseif(c==+){//接收第二个数sum=sum+num;num=0;}elseif(c===)//输出{sum=sum+num;num=0;for(i=0;sum!=0;i++){a[i]=sum%10;sum=(sum-a[i])/10;}for(i--;i>=0;i--){uartcharput(uart0_base,a[i]+0);}uartcharput(uart0_base,\\n);}if(c==\\r)//如果遇到回车<cr>{uartcharput(uart0_base,\\n);//多回显一个换行<lf>}}}3、书写实验报告,要求附上程序流程图。六、实验心得比较轮询方式与中断方式篇四:uart串口通信实验报告串口通信实验报告基本实验:16位的乘法器设计思想:乘法器根据以往学过数电的设计经验,应该是移位相加的方法,设被乘数为[15:0]a,乘数为[15:0]b,则从b的最高位开始算起,c初值为0,为b最高位为1,则c就等于c+a;接下来,若b的次高位为1,则c左移一位加a,若为0则c左移一位就可以了,这样的步骤做到b的最低位那么c的值就是ab,当然最好c是中间寄存器,这样结果才不会出现中间值。实验的源码:modulemuti(clk,rst,ready,a,b,c);inputclk;inputrst;input[15:0]a;input[15:0]b;output[31:0]c;outputready;reg[31:0]c;regready;reg[31:0]temp;reg[5:0]n;always@(posedgeclkorposedgerst)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;endelsebegintemp<=temp<<1;n<=n-1;endendelsebeginc<=temp;n<=32;ready<=1;endendendmodul测试代码:`timescale1ns/1nsmoduletb;regclk;reg[15:0]a;reg[15:0]b;regrst;wireready;wire[31:0]c;always#10clk=~clk;initialbeginrst<=1;clk<=0;a=0;b=0;#10rst=0;#21a=21;b=32;#650a=3;b=4;#700$stop;endmutimuti_unit(.a(a),.b(b),.rst(rst),.clk(clk),.ready(ready),.c(c));endmodule仿真结果:这边a被乘数,b是乘数,当rst为高时,则将c置0,ready置一,ready信号为高表示此时空闲可以计算,rst为低时则开始计算,2132为672,34为12,在乘法操作时,ready信号为低电平表示在工作中不能再输入进行计算,当计算结束则变为高电平。乘法功能得以实现。进阶实验:串口通信实验基本要求:了解uart串口通信协议设计思想:主要是分成3个模块,一个是波特率产生模块,一个是发送模块,一个是接收模块,波特率产生模块产生一个9600hz的采样脉冲,由于开发板上的固有频率为50mhz,所以我需要分频为50000000/9600=5208.3,即从0记到5207,当记到2503时产生一个时钟周期的高电平即可。发送模块受到接受模块的控制,接收模块的输出rxd连发送的txd,rxd为高表示正在接收不能发送数据,发送时采用并转串发送,接收时为串转并接收。实验代码:1.top文件moduletop(f50m,rst,datain,dataout,seg);inputf50m;/////50mhz的时钟信号inputrst;///////////////复位信号input[7:0]datain;///////////输入数据output[7:0]dataout;////////////////输出数据output[3:0]seg;/////////////////板子上面选一个ledwirebps_start1;/////////////////当正在发送时为高电平wirebps_start2;///////////////正在接收时为高电平wirecaiyang1;//////////////////////采样的波特率信号wirecaiyang2;wirerxd_txd;wiredataout;wirerx232_tx;///////////////////////中间的串行通信线brate1brate1(.f50m(f50m),.rst(rst),.bps_start1(bps_start1),.caiyang1(caiyang1));brate2brate2(.f50m(f50m),.rst(rst),.bps_start2(bps_start2),.caiyang2(caiyang2));revrev_u(.f50m(f50m),.rx232_tx(rx232_tx),.rst(rst),.caiyang2(caiyang2),.rxd(rxd_txd),.dataout(dataout),.bps_start2(bps_start2));sendsend_u(.f50m(f50m),.datain(datain),.rst(rst),.caiyang1(caiyang1),.txd(rxd_txd),.bps_start1(bps_start1),.rx232_tx(rx232_tx));segseg_u(.f50m(f50m),.seg(seg));endmodule波特率产生模块:a.发送波特率产生模块:modulebrate1(f50m,rst,bps_start1,caiyang1);inputf50m;inputrst;inputbps_start1;outputcaiyang1;reg[12:0]n;//50mhz/9600hz=5208,ncountregcaiyang1;//a9600boundratesignalways@(posedgef50mornegedgerst)beginif(!rst)begin0to5207n<=0;caiyang1<=0;endelseif((n==5207)!bps_start1)////////////如果记满5207或者发送数据结束就将caiyang2清0beginn<=0;caiyang1<=0;endelseif(n==2603)//////////////////////////////计数满2603就产生一个时钟周期的高电平beginn<=n+1;caiyang1<=1;endelsebeginn<=n+1;caiyang1<=0;endendendmoduleb.接收波特率产生模块modulebrate2(f50m,rst,bps_start2,caiyang2);inputf50m;inputrst;inputbps_start2;outputcaiyang2;reg[12:0]n;//50mhz/9600hz=5208,ncount0to5207regcaiyang2;//a9600boundratesignalways@(posedgef50mornegedgerst)beginif(!rst)beginn<=0;caiyang2<=0;endelseif((n==5207)!bps_start2)////////////如果记满5207或者发送数据结束就将caiyang2清0beginn<=0;篇五:实验报告3_uart电子科技大学中山学院学生实验报告(1)根据提供代码1,将uart0初始化为通讯波特率9600,8位数据位,1位停止位,偶校验。请给出这一部分初始化代码。(2)根据提供代码2,如果需要每接收到一个字节数据就产生接收中断,应如何设计程序?请给出重点实现代码。二、提高实验(3)请设计一个简单远程控制系统,当pc发送’a’、‘1’时,led闪一下;发送’a’、‘2’时led闪两下。你认为这里’a’可以起什么作用,不要可以吗?请说明理由。‘a’起同步、抗干扰作用。干扰难产生‘a’的信号而容易产生‘1’的信号。当所接受的第一个字符为‘a’时,基于这个条件下,再继续判断第二个字符可以减小因干扰而产生的影响。fromwenku.baidu.comsign20220427200810',)
提供UART实验报告,UART串口实验报告心得会员下载,编号:1700774165,格式为 docx,文件大小为10页,请使用软件:wps,office word 进行编辑,PPT模板中文字,图片,动画效果均可修改,PPT模板下载后图片无水印,更多精品PPT素材下载尽在某某PPT网。所有作品均是用户自行上传分享并拥有版权或使用权,仅供网友学习交流,未经上传用户书面授权,请勿作他用。若您的权利被侵害,请联系963098962@qq.com进行删除处理。