UARTO通信实验 联系客服

发布时间 : 星期日 文章UARTO通信实验更新完毕开始阅读a39036c80508763231121228

实 验 报 告

班 级 学号 姓 名 同组人 实验日期 室温 大气压 成 绩

实验题目: UARTO通信实验 一、实验目的 1,了解串行口UART0的特性和用法。 2,熟悉EasyARM2131软件的参数设置及其发送、接收操作。 3,锻炼学生自己的设计、创造和综合性。 二、实验仪器 微型电子计算机(含软件H-JTAG V0.3.1和ADSv1_2)、Easy ARM2131开发板、UART0接口线、USB接口电源线和JTAG接口线以及部分跳线。 三、实验原理 特性: 管脚描述: 四、 实验内容 实验程序如下: #include \const uint32 LED1 = (1 << 18); // P1.18控制LED1,低电平点亮 /* 定义串口模式设置数据结构 */ typedef struct UartMode { uint8 datab; // 字长度,5/6/7/8可选 uint8 stopb; // 停止位,1/2可选 uint8 parity; // 奇偶校验位,0-无校验,1-奇校验,2-偶校验 }UARTMODE; uint8 rcv_buf[20]; // UART0数据接收缓冲区 volatile uint8 rcv_new; // 接收新数据标志 /* ********************************************************************************************************* ** 函数名称 :IRQ_UART0() ** 函数功能 :串口0接收中断服务程序 ** 入口参数 :无 ** 出口参数 :无 ********************************************************************************************************* void __irq IRQ_UART0 (void) { uint8 i; if ((U0IIR & 0x0F) == 0x04) rcv_new = 1; // 设置接收到新的数据标志 for (i=0; i<13; i++) { rcv_buf[i] = U0RBR; // 读取FIFO的数据,并清除中断 } VICVectAddr = 0x00; // 中断处理结束 } void DelayNS (uint32 dly) { uint32 i; for ( ; dly>0; dly--) for (i=0; i<50000; i++); } ******************************************************************************* ** 函数名称 :UART0_SendByte() ** 函数功能 :向串口0发送1字节数据 ** 入口参数 :dat 要发送的数据 ** 出口参数 :无 ******************************************************************************* void UART0_SendByte (uint8 dat) { U0THR = dat; // 要发送的数据 } ******************************************************************************* ** 函数名称 :UART0_SendBuf() ** 函数功能 :向串口发送8字节数据 ** 入口参数 :无 ** 出口参数 :无 ******************************************************************************* void UART0_SendBuf (void) { uint8 i; for (i=0; i<13; i++) UART0_SendByte(rcv_buf[i]); while ((U0LSR & 0x20) == 0); // 等待数据发送完毕 } ******************************************************************************* ** 函数名称 :UART0_Init() ** 函数功能 :串口初始化,设置工作模式和波特率。 ** 入口参数 :baud 波特率 ** set 模式设置(UARTMODE数据结构) ** 出口参数 :1-初始化成功, 0-初始化失败 ******************************************************************************* int8 UART0_Init (uint32 baud, UARTMODE set) { uint32 bak; /* 设置串口波特率 */ U0LCR = 0x80; // DLAB = 1 bak = (Fpclk >> 4) / baud; U0DLM = bak >> 8; U0DLL = bak & 0xFF; U0LCR = 0x03; return (1); } /****************************************************************************** ** 函数名称 :main() ** 函数功能 :从串口UART0接收字符串\,并发送回上位机显示。 ** 调试说明 :需要PC串口显示终端软件如EasyARM.exe。 ******************************************************************************* int main (void) { UARTMODE set; PINSEL2 = PINSEL2 & (~0x08); // P1[25:16]连接GPIO IO1DIR = LED1; // 设置LED1控制口为输出 rcv_new = 0; PINSEL0 = 0x00000005; // 设置I/O连接到UART0 UART0_Init(115200, set); // 串口初始化 U0FCR = 0x0b1; // 使能FIFO,并设置触发点为13字节 U0IER = 0x01; // 允许RBR中断,即接收中断 IRQEnable(); // 使能IRQ中断 /* 使能UART0中断 */ VICIntSelect = 0x00000000; // 设置所有的通道为IRQ中断 VICVectCntl0 = 0x20 | 0x06; // UART0分配到IRQ slot0,即最高优先级 VICVectAddr0 = (uint32)IRQ_UART0; // 设置UART0向量地址 VICIntEnable = 1 << 0x06; // 使能UART0中断 while (1) { if (rcv_new == 1) { rcv_new =0; UART0_SendBuf(); if((U0LSR & 0x20) == 0x20) //判断是否数据发送完毕 {IO1CLR = LED1; // LED1点亮 DelayNS (20);} } else IO1SET = LED1; // LED1熄灭 } return 0; } 本次实验程序中可以把用于参数过滤的部分程序删除,把一系列用于设置字长,停止位,奇偶校验的程序直接用U0LCR = 0x03就行,效果一个样,都是设置成字长为8、停止位为1、无奇偶校验位。实验中要把发送接收14个字符长度,只要把中断触发点的字符长度改为13个字节即可,如U0FCR = 0x0c1;。当改为13字节长度时,相信的循环数,数组容量也要改。本实验还附加了显示成功接收发送数据时的标志,即LED1灯会亮。 五、 实验结果 本次的实验的结果是:当运行程序时,在EasyARM软件的发送窗口输入如: “xiewenbing168”的13个字符,然后点击发送,会在接收窗口收到一样的数据,并且在接收窗口成功显示数据时,LED1灯会亮一小段时间,然后熄灭。 六、 实验心得 本次实验让我基本掌握了串行口UART0的特性和用法,更加了解上位机的显示等功能,对EasyARM2131软件的参数设置及其发送、接收操作有所了解。 通过本次实验还让我明白了,在编程的时候要细心,不能粗心大意。就比如此次实验时改成接收发送13字节的时候,由于一开始所定义的数组容量没有改,仍然为8,所以导致实验结果出不来,浪费了很多时间。经过了此次,以后一定会更加的细心。