《UART实验报告.pdf》由会员分享,可在线阅读,更多相关《UART实验报告.pdf(14页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、实验四 uart 串口通信 学院:研究生院 学号:1400030034 姓名:张秋明 一、实验目的及要求 设计一个 uart 串口通信协议,实现“串<->并”转换功能的电路,也就是“通用异步收发器”。二、实验原理 uart 是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输和接收。在嵌入式设计中,uart 用来主机与辅助设备通信,如汽车音响与外接 ap 之间的通信,与 pc 机通信包括与监控调试器和其它器件,如 eeprom 通信。uart 作为异步串口通信协议的一种,工作原理是将传输数据的每个字符一位接一位地传输。其中各位的意义如下:起始位:先发出一个逻辑”
2、0”的信号,表示传输字符的开始。资料位:紧接着起始位之后。资料位的个数可以是 4、5、6、7、8 等,构成一个字符。通常采用 ascii 码。从最低位开始传送,靠时钟定位。奇偶校验位:资料位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验资料传送的正确性。停止位:它是一个字符数据的结束标志。可以是 1 位、1.5 位、2 位的高电平。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率
3、同时也越慢。空闲位:处于逻辑“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
4、 uart is port(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 is rs232_rx:in std_logic;-rs232 接收数据信号 clk_bps:in std_logic;-此时 clk_bps 的高电平为接收数据的采样点 bps_start:out std_logic;-接收到数据后,波特率时钟启动置位
5、 rx_data:out std_logic_vector(7 downto 0);-接收数据寄存器,保存直至下一个数据来到 rx_int:out std_logic -接收数据中断信号,接收数据期间时钟为高电平,传送给串口发送);bps_start:in std_logic -接收数据后,波特率时钟启动信号置位);bps_start:out std_logic;-接收到数据后,波特率时钟启动置位 rx_data:in std_logic_vector(7 downto 0);-接收数据寄存器,保存直至下一个数据来到 rx_int:in std_logic -接收数据中断信号,接收数据期间时钟
6、为高电平,传送给串口发送模块,使得串口正在进行接收数据的时候,发送模块不工作,避免了一个完整的数据(1 位起始位、8 位数据位、1 位停止位)还没有接收完全时,发送模块就已经将不正确的数据传输出去);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;begin rx_top:uart_rx
7、 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,-系统
8、时钟 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 位停止位)还没
9、有接收完全时,发送模块就已经将不正确的数据传输出去);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 is port(clk:in std_logic;-系统时钟 rst_n:in std_logi
10、c;-复位信号 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
11、位停止位)还没有接收完全时,发送模块就已经将不正确的数据传输出去);end uart_rx;architecture behav of uart_rx is signal 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
12、 downto 0);-串口接收数据寄存器,保存直至下一个数据到来 begin process(clk,rst_n)begin if(rst_n=0)then rs232_rx0<=0;rs232_rx1<=0;rs232_rx2<=0;rs232_rx3<=0;else if(rising_edge(clk)then rs232_rx0<=rs232_rx;rs232_rx1<=rs232_rx0;rs232_rx2<=rs232_rx1;rs232_rx3<=rs232_rx2;end if;end if;neg_rs232_rx<=r
13、s232_rx3 and rs232_rx2 and not(rs232_rx1)and not(rs232_rx0);end process;process(clk,rst_n)begin if(rst_n=0)then bps_start_r<=0;rx_int<=0;else if(rising_edge(clk)then if(neg_rs232_rx=1)then -接收到串口数据线 rs232_rx 的下降沿标志信号 bps_start_r<=1;-启动串口准备数据接收 rx_int<=1;-接收数据中断信号使能 else if(num=15)and(clk
14、_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)begin if(rst_n=0)then rx_data_r<=00000000;rx_data<=00000000;num<=0;else if(rising_edge(clk)then if(clk_bps=1)then num<=nu
15、m+1;case num is 篇二:arm uart 实验报告 题 目:一.实验目的 通过实验,掌握 uart 查询 1 方式程序的设计 二.实验设备 硬件:pc 机 一台 lpc2131 教学实验开发平台 一套 软件:windows98/xp/2000 系统,ads 1.2 集成开发环境。?easyarm 工具软件。三实验内容 四实验步骤 启动ads 1.2,使用arm executable image for lpc2131工程模板建立一个工程dataret_c。在 user 组中的 main.c 中编写主程序代码,在项目中的 config.h 文件中加入#include<stdi
16、o.h>。选用 debuginram 生成目标,然后编译连接工程。将 easyarm2131 开发板上的 jp6 跳线分别选择 txd0 和 rxd0 端时,方可进行 uart0通信实验。选择【project】->【debug】,启动 axd 进行 jtag 仿真调试。全速运行程序,在 pc 机上的 easyarm 软件发送如“hello easyarm2131!”字样的字符串,easyarm2131 开发板接收到数据后,并将接收到的数据回发给 pc 机 五程序#include“config.h”#define uart_bps 115200 /*名 称:delayns()*功 能
17、:长软件延时 *入口参数:dly *出口参数:无 */void delayns(uint32 dly)uint32 i;for(;dly>0;dly-)for(i=0;i<5000;i+);/*函数名称:uart0_init()*函数功能:串口初始化,设置为 8 位数据位,1 位停止位,无奇偶校验,波特率为 115200 *入口参数:无 *出口参数:无 */void uart0_init(void)u0lcr=0 x83;u0dlm=fdiv/256;u0dll=fdiv%256;u0lcr=0 x03;/dlab=1,允许设置波特率/设置波特率 fdiv=(fpclk/16)/u
18、art_bps;uint16 fdiv;延时参数,值越大,延时越久 /串口通信波特率 /*函数名称:uart0_getbyte()*函数功能:从串口接收 1 字节数据,使用查询方式接收 *入口参数:无 *出口参数:接收到的数据 */uint8 uart0_getbyte(void)/*函数名称:uart0_getstr()*函数功能:从串口接收 *入口参数:s n *出口参数:无 */void uart0_getstr(uint8*s,uint32 n)/*函数名称:uart0_sendbyte()*函数功能:向串口发送字节数据 *入口参数:dat *出口参数:无 */void uart0_s
19、endbyte(uint8 dat)/*函数名称:uart0_sendstr()*函数功能:向串口发送一字符串 *入口参数:str 要发送的字符串的指针 u0thr=dat;/写入数据 /等待数据发送完毕 while(u0lsr&0 x40)=0);要发送的数据 for(;n>0;n-)*s+=uart0_getbyte();指向接收数据数组的指针 接收的个数 uint8 rcv_dat;while(u0lsr%0 x01)=0);rcv_dat=u0rbr;return(rcv_dat);/等待接收标志置位 *出口参数:无 */void uart0_sendstr(uint8
20、const*str)/*名 称:main()*功 能:从串口 uart0 接收字符串“hello easyarm2131!”,并发送回上位机显示 *说 明:需要 pc 串口显示终端软件,如 easyarm.exe。*/int main(void)uint8 snd32;pinsel0=0 x00000005;while(1);return(0);uart0_init();uart0_getstr(snd,18);delayns(10);uart0_sendstr(snd);delayns(10);/向串口发送字符串/从串口接收字符串 /设置 i/o 连接到 uart0/串口初始化 while(
21、1)if(*str=?0?)break;/遇到结束符,退出 uart0_sendbyte(*str+);/发送数据 六实验心得体会 通过本次实验对 lpc2131 的 uart 有了进一步的认识和了解,在使用 ads 的编程过程中对 j-tag 调试中出现的一些错误积累了一些经验,对于串口编程和通信的实践操作有了很大的提高,总之实验使我收获很大,感谢学校给我这样的实验环境!篇三:uart 实验报告 嵌入式实验四实验报告 3.4 基于 uart 的加法器的实现 一、实验目的 学习 lm3s9b92 的串口通信 学习应用超级终端调试串口 学会应用 uart 有关的库函数 二、实验设备 计算机、lm
22、3s9b92 开发板、usb a 型公口转 mini b 型 5pin 数据线 1 条 三、实验原理 stellaris 系列 arm 的 uart 具有完全可编程、16c550 型串行接口的特性。stellaris 系列 arm 含有 2 至 3 个 uart 模块。四、实验要求 采用超级终端作为外部输入与输出的接口,实现多位数的相加。即通过 uart 串口分别输入需要相加的多位数 a 与 b,最后把 a 和 b 两个多位数相加的过程和结果,回显给用户。具体实现方法:既可以采用轮询的方式也可以应用中断。五、实验步骤 1、连接实验设备:使用 usb mini b 线缆的 mini 端与开发板
23、icdi 口相连,另一端接到pc 机的 usb 插口上。2、根据实验要求编写、调试、运行程序。并要求在代码上附上相关的注释。#include<string.h>#include inc/hw_ints.h#include inc/hw_memmap.h#include inc/hw_types.h#include driverlib/debug.h#include driverlib/gpio.h#include driverlib/interrupt.h#include driverlib/sysctl.h#include driverlib/uart.h#include grl
24、ib/grlib.h#include drivers/kitronix320 x240 x16_ssd2119_8bit.h#include drivers/set_pinout.h#include systeminit.h void uartinit(void)sysctlperienable(sysctl_periph_uart0);/使能 uart 模块 sysctlperienable(sysctl_periph_gpioa);/使 能rx/tx所 在 的gpio端 口 gpiopintypeuart(gpio_porta_base,/配置 rx/tx 所在管脚为 gpio_pin_0
25、|gpio_pin_1);/uart 收发功能 uartconfigset(uart0_base,/配置 uart 端口 9600,/波特率:9600 uart_config_wlen_8|/数据位:8 uart_config_stop_one|/停止位:1 uart_config_par_none);/校验位:无 uartenable(uart0_base);/使能 uart 端口 void uartputs(const char*s)while(*s!=0)uartcharput(uart0_base,*(s+);main(void)char c,a12;int sum=0,num=0,i
26、;/jtagwait();/防止 jtag 失效,重要!clockinit();/时钟初始化:晶振,6mhz uartinit();/uart 初始化 uartputs(输入格式 m+n=n);for(;)c=uartcharget(uart0_base);/等待接收字符 if(c>=0&&c<=9)/判断收到的是否为字符 num=num*10+c-0;/将收到的字符转换为整形储存 else if(c=+)/接收第二个数 sum=sum+num;num=0;else if(c=)/输出 sum=sum+num;num=0;for(i=0;sum!=0;i+)ai=s
27、um%10;sum=(sum-ai)/10;for(i-;i>=0;i-)uartcharput(uart0_base,ai+0);uartcharput(uart0_base,n);if(c=r)/如果遇到回车<cr>uartcharput(uart0_base,n);/多回显一个换行<lf>3、书写实验报告,要求附上程序流程图。六、实验心得 比较轮询方式与中断方式 篇四:uart 串口通信实验报告 串口通信实验报告 基本实验:16 位的乘法器 设计思想:乘法器根据以往学过数电的设计经验,应该是移位相加的方法,设被乘数为15:0a,乘数为15:0b,则从 b 的
28、最高位开始算起,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:0a;input 15:0b;output 31:0c;output ready;reg 31:0c;reg ready;reg 31:0temp;reg 5:0n;always(po
29、sedge clk or posedge rst)begin if(rst)begin c<=0;ready<=1;temp<=0;n<=32;end else if(ready)begin temp<=0;n<=32;ready<=0;end else if(n)begin if(bn-1)begin temp<=(temp<<1)+a;n<=n-1;end else begin temp<=temp<<1;n<=n-1;end end else begin c<=temp;n<=32;re
30、ady<=1;end end endmodul 测试代码:timescale 1ns/1ns module tb;reg clk;reg 15:0a;reg 15:0b;reg rst;wire ready;wire 31:0c;always#10 clk=clk;initial begin rst<=1;clk<=0;a=0;b=0;#10 rst=0;#21 a=21;b=32;#650 a=3;b=4;#700$stop;end muti muti_unit(.a(a),.b(b),.rst(rst),.clk(clk),.ready(ready),.c(c);endm
31、odule 仿真结果:这边 a 被乘数,b 是乘数,当 rst 为高时,则将 c 置 0,ready 置一,ready 信号为高表示此时空闲可以计算,rst 为低时则开始计算,21*32 为 672,3*4 为 12,在乘法操作时,ready信号为低电平表示在工作中不能再输入进行计算,当 计算结束则变为高电平。乘法功能得以实现。进阶实验:串口通信实验 基本要求:了解 uart 串口通信协议 设计思想:主要是分成 3 个模块,一个是波特率产生模块,一个是发送模块,一个是接收模块,波特率产生模块产生一个 9600hz 的采样脉冲,由于开发板上的固有频率为 50mhz,所以我需要分频为 500000
32、00/9600=5208.3,即从 0 记到 5207,当记到 2503 时产生一个时钟周期的高电平即可。发送模块受到接受模块的控制,接收模块的输出 rxd 连发送的 txd,rxd为高表示正在接收不能发送数据,发送时采用并转串发送,接收时为串转并接收。实验代码:1.top 文件 module top(f50m,rst,datain,dataout,seg);input f50m;/50mhz 的时钟信号 input rst;/复位信号 input 7:0datain;/输入数据 output 7:0dataout;/输出数据 output 3:0seg;/板子上面选一个 led wire b
33、ps_start1;/当正在发送时为高电平 wire bps_start2;/正在接收时为高电平 wire caiyang1;/采样的波特率信号 wire caiyang2;wire rxd_txd;wire dataout;wire rx232_tx;/中间的串行通信线 brate1 brate1(.f50m(f50m),.rst(rst),.bps_start1(bps_start1),.caiyang1(caiyang1);brate2 brate2(.f50m(f50m),.rst(rst),.bps_start2(bps_start2),.caiyang2(caiyang2);rev
34、 rev_u(.f50m(f50m),.rx232_tx(rx232_tx),.rst(rst),.caiyang2(caiyang2),.rxd(rxd_txd),.dataout(dataout),.bps_start2(bps_start2);send send_u(.f50m(f50m),.datain(datain),.rst(rst),.caiyang1(caiyang1),.txd(rxd_txd),.bps_start1(bps_start1),.rx232_tx(rx232_tx);seg seg_u(.f50m(f50m),.seg(seg);endmodule 波特率产生
35、模块:a发送波特率产生模块:module brate1(f50m,rst,bps_start1,caiyang1);input f50m;input rst;input bps_start1;output caiyang1;reg 12:0n;/50mhz/9600hz=5208,n count reg caiyang1;/a 9600 bound rate sign always(posedge f50m or negedge rst)begin if(!rst)begin 0 to 5207 n<=0;caiyang1<=0;end else if(n=5207)|!bps_s
36、tart1)/如果记满 5207 或者发送数据结束就将caiyang2 清 0 begin n<=0;caiyang1<=0;end else if(n=2603)/计数满 2603 就产生一个时钟周期的高电平 begin n<=n+1;caiyang1<=1;end else begin n<=n+1;caiyang1<=0;end end endmodule b接收波特率产生模块 module brate2(f50m,rst,bps_start2,caiyang2);input f50m;input rst;input bps_start2;output
37、 caiyang2;reg 12:0n;/50mhz/9600hz=5208,n count 0 to 5207 reg caiyang2;/a 9600 bound rate sign always(posedge f50m or negedge rst)begin if(!rst)begin n<=0;caiyang2<=0;end else if(n=5207)|!bps_start2)/如果记满 5207 或者发送数据结束就将caiyang2 清 0 begin n<=0;篇五:实验报告 3_uart 电子科技大学中山学院 学生实验报告 (1)根据提供代码 1,将 uart0 初始化为通讯波特率 9600,8 位数据位,1 位停止位,偶校验。请给出这一部分初始化代码。(2)根据提供代码 2,如果需要每接收到一个字节数据就产生接收中断,应如何设计程序?请给出重点实现代码。二、提高实验 (3)请设计一个简单远程控制系统,当 pc 发送a、1时,led 闪一下;发送a、2时 led 闪两下。你认为这里a可以起什么作用,不要可以吗?请说明理由。a起同步、抗干扰作用。干扰难产生a的信号而容易产生1的信号。当所接受的第一个字符为a时,基于这个条件下,再继续判断第二个字符可以减小因干扰而产生的影响。