UART通信实验(查询方式)
时间:2023-01-30 00:00:00
一、实验目的:
理解ARM的UART掌握工作原理UART数据发送与接收及其应用开发方法。
二、实验内容与要求:
1:熟悉基于ARM 的UART模块;
2:用C语言编写程序,通过查询实现UART数据收发功能;
3.记录相应的现象和结果,总结分析,完成实验报告。
三、实验过程:
3.1实验步骤
①需要准备本实验CPU板和串口。
将实验源代码下的实验项目(实验四环境)整个文件夹复制到C盘根目录,将文件夹修改为可读属性,删除*_Data使用文件夹ADS软件打开工程文件(*.mcp)。
②将计算机的当前时间改为正确的时间。
③用并口JTAG调试线连接目标板和PC机器,连接电源线,与之前的实验略有不同,也需要再公母头直接连接电缆连接实验箱 CPU 板的串口和 PC 机串口。
④在线插入目标板,打开桌面H-JTAG探测目标的软件CPU编译程序是否正常,用JLink配合AXD选择Debug单步调试也可以直接选择run来运行。
⑤根据数据手册搜索UART通信,找到配置寄存器和数据寄存器的物理地址。编写C语言程序,然后编译、调试、操作,观察寄存器内容的变化。
⑥打开硬件设备开关,全速运行,打开串口调试助手,调整波特率(要求为4800)和校验方法(要求为奇校验)。
⑦输入正确的学号和错误的学号,看看会发生什么,记得拍照截图,记录相应的现象和结果。
3.2 实验现象
1.实验采用波特率4800,奇校验法, Uart_Init()函数的第二个参数和secureCRT的Baud rate选项均为4800,采用奇校验,rULCON0寄存器赋值为0x23。
检查实验4源代码是否正确。
2.将波特率(4800)调整到串口调试助助手的位置(odd),打开串口,操作代码,看到55连续循环输出。
3.修改代码,输入错误的学号一次,输出No, it is not your id.”
4.一次输入正确的学号,输出Yes.”
3.3 实验数据
本实验包括数据发送和数据接收。
数据发送:
可编程的数据发送帧格式。它包含一个开始位,5到8个数据位,一个可选的奇偶位和1到2个停止位,可以通过线控制寄存器(UCONn)来设置。发送机还能产生发送中止条件。中止条件迫使串口输出保持逻辑 0 该状态保持超过传输帧的时间长度。通常,在一帧传输数据完全传输后,中止信号通过这个全0状态发送给对方。中止信号发送后,传输数据将继续放入输出 FIFO 中(在不使用 FIFO 在模式下,将被放置在输出保持寄存器中)。
数据接收:
与发送一样,接收到的数据帧格式也是可编程的。它包括一个起始位,5 到 8 数据位,可选奇偶校准位和 1 到 2 通过线控制寄存器,可以控制一个停止位(UCONn)设置。接收器还可以检测溢出错误、奇偶校验错误、帧错误和中止情况,并在每种情况下定位错误标志。
例如,寄存器名称中的n表示0~1,ULCONn对应串口0为 ULCON0, 对应串口1为ULCON1。
UART主要用于规定传输帧格式的线控寄存器。3-5位置是奇偶校验模式。
注意:
Uart_GetString(char *string) 函数,即串口得到字符串的函数。
void Uart_GetString(char *string,char port) { char *string2 = string; char c; while ((c = Uart_Getch(port)) != '\r') { if (c == '\b') { if ((int)string2 < (int)string) { Uart_Printf(port,"\b \b"); string--; } } else { *string =c; Uart_SendByte(c,port); } } &nbs; *string='\0';
Uart_SendByte('\n',port);
}
'\r' 表示换行回车,但是在传输的过程中,会把\n一起传送过来,也会发到CPU的接受寄存器中,而\n是不可打印字符,是看不见的。可以将其修改成等号,以他作为结束标志即可实现。
程序流程图
程序代码
#include "..\inc\config.h"
unsigned char data;
extern void Uart_GetString();
void Main(void)
{
Target_Init(); //目标板初始化,在target.c中定义
Delay(10);
data = 0x55;
while(1)
{
char *studentid;
char *mystudentid="201813040136";
Uart_GetString(studentid,0);
if(strcmp(studentid,mystudentid)==0){
Uart_Printf(0,"Yes");
}
else{
Uart_Printf(0,"No,it is not your id.");
}
Delay(10); //串口0输出
}
}
将波特率配置为4800
void Target_Init(void)
{
Port_Init();
Uart_Init(0,4800,0);
Exep_S3cINT_Init();
Cache_Init();
StartInterrupt(); //开中断,在此之前都是关中断状态,在44binit.s中定义
}
将寄存器配置为奇校验
void Uart_Init(int mclk,int baud,char port)
{
int i;
if (mclk == 0)
{
mclk = MCLK;
}
i = mclk / (baud * 16); // 圆整 (int)((mclk/16.)/baud + 0.5) -1;
if (port == 0)
{ //UART0 配置各控制寄存器
rUFCON0 = 0x0; // 禁用 FIFO
rUMCON0 = 0x0;
rULCON0=0x23; //正常模式,有奇偶校验,一个停止位,8个数据位
//rULCON0=0x7; //正常模式,无奇偶校验,两个停止位,8个数据位
rUCON0=0x245; //RX边沿触发,TX电平触发,禁用延时中断,使用RX 错误中断,正常操作模式,中断请求或表决模式
rUBRDIV0 = i; //( (int)(mclk/16/baud + 0.5) -1 );
}
else if (port == 1)
{ //UART0 配置各控制寄存器
rUFCON1 = 0x0; // 禁用 FIFO
rUMCON1 = 0x0;
rULCON1 = 0x3; //正常模式,无奇偶校验,一个停止位,8个数据位
//rULCON1 = 0x7; //正常模式,无奇偶校验,两个停止位,8个数据位
rUCON1 = 0x245; //RX边沿触发,TX电平触发,禁用延时中断,使用RX 错误中断,正常操作模式,中断请求或表决模式
rUBRDIV1 = i; //( (int)(mclk/16./baud + 0.5) -1 );
}
for(i=0;i<100;i++);
}