1、arm串口实验嵌入式系统与微处理器B实验报告 ARM的串行口实验 一、实验目的通过实验了解ARM处理器串行口(UART)的结构,串行通讯的原理。 掌握ARM处理器串行通信的编程方法。 二、实验内容学习串行通讯原理,了解串行通讯控制器,阅读ARM芯片文档,掌握ARM的UART相关寄存器的功能,熟悉ARM系统硬件的UART相关接口。编程实现ARM和计算机实现串行通讯:ARM监视串行口,将接收到的字符再发送给串口(计算机与开发板是通过超级终端通讯的),即按PC键盘通过超级终端发送数据,开发板将接收到的数据再返送给PC,在超级终端上显示。三、实验原理S3C2410自带三个异步串行口控制器每个控制器有1
2、6字节的FIFO(先入先出寄存器)最大波特率115.2K每个UART有7种状态:溢出错误,校验错误,帧错误,暂停态,接收缓冲区准备好,发送缓冲区空,发送移位缓冲器空,这些状态可以由相应的UTRSTATn或UERSTATn寄存器表示,并且与发送接收缓冲区相对应的有错误缓冲区波特率的大小可以通过设置波特率寄存器(UBRDIVn)控制,计算公式如下: 使用PCLK时的计算公式如下: UBRDIVn = (int)PCLK/(波特率16)1 使用UCLK时的计算公式如下: UBRDIVn = (int)UCLK/(波特率16)1 例如:使用PCLK,在40 MHz的情况下,当波特率取115 200 b
3、ps时, UBRDIVn = (int)40000000/(11520016)1 = 20RS232接口电路在本实验中,串口电路如下图所示, 开发板上提供两个串口DB9。其中UART0为主串口,可与PC或MODOM进行串行通迅串行通信接口电路组成可编程的串行接口芯片波特率发生器EIA与TTL电平转换器地址译码电路通信协议:异步协议同步协议开始前,线路处于空闲状态,送出连续“1”。传送开始时首先发一个“0”作为起始位,然后出现在通信线上的是字符的二进制编码数据。每个字符的数据位长可以约定为5位、6位、7位或8位,一般采用ASCII编码。后面是奇偶校验位,根据约定,用奇偶校验位将所传字符中为“1”
4、的位数凑成奇数个或偶数个。也可以约定不要奇偶校验,这样就取消奇偶校验位。最后是表示停止位的“1”信号,这个停止位可以约定持续1 位、1.5 位或2 位的时间宽度。至此一个字符传送完毕,线路又进入空闲,持续为“1”。经过一段随机的时间后,下一个字符开始传送才又发出起始位。每一个数据位的宽度等于传送波特率的倒数。微机异步串行通信中,常用的波特率为110,150,300,600,1200,2400,4800,9600 等。四、实验步骤1.准备实验环境。使用简易JTAG仿真器连接目标板,使用UP2410实验板附带的串口线连接实验板上的UART0和PC机的串口。2.在PC机上运行windows自带的串口
5、通信程序超级终端程序,或者其它串口通信程序(如:串口精灵等。超级终端配置如下图所示)。3.使用EmbestIDE通过Embest仿真器连接实验板,打开实验例程目录下例程,下载并运行它。 4.在PC上观察超级终端程序主窗口;5.通过PC机键盘输入字符,可以看到相应的字符显示在超级终端主窗口,输入回车,所有字符一次性回显出来。 6. 修改程序,要求键盘输入为“0”-“9”时,实验箱通过串口返回“9”-“0”,当输入为“A”-“Z”时,实验箱通过串口返回“a”-“z”,反之亦然。7. 重新编程采用中断方式实现串口驱动。8. 尝试将实验一和实验四结合起来,实现通过键盘输入实现对电机转速、转向的控制,可
6、以通过按键来控制电机的关停和加速及减速。五、程序说明typedef struct /uart用一个结构体定义,因为三个uart口设置差不多 serial_init_func_t init; serial_read_func_t read; serial_write_func_t write; serial_poll_func_t poll;/查询 serial_flush_input_func_t flush_input;/流输入 serial_flush_output_func_t flush_output;/流输出 int nIsr; /中断号 serial_driver_t;int Ua
7、rt_Init(int whichUart, int baud)/初始化串口,选择第几个串口 if(whichUart=NumberOfUartDrv) return FALSE; return serial_drvwhichUart-init(baud);/返回给结构体中,对应的串口int Uart_SendByte(int whichUart,int data) if(whichUart=NumberOfUartDrv) return FALSE; return serial_drvwhichUart-write(data);/发数据,一个字节void Uart_SendString(in
8、t whichUart, char *pt) /发数据流 while(*pt)/将pt指向的数据流发送出来 if(*pt=n) Uart_SendByte(whichUart,r); Uart_SendByte(whichUart,*pt+); void Uart_Printf(int whichUart, char *fmt,.) /在屏幕上打印 va_list ap; static char string256; va_start(ap,fmt); vsprintf(string,fmt,ap); Uart_SendString(whichUart, string); va_end(ap)
9、; char Uart_Getchn(char* Revdata, int Uartnum, int timeout)/接受字符 if(Uartnum=0) while(!(rUTRSTAT0 & 0x1); /Receive data read *Revdata=RdURXH0();/把接受的字符 给 定义的指针字符串 return TRUE; else if(Uartnum=1) while(!(rUTRSTAT1 & 0x1);/Receive data read *Revdata=RdURXH1(); return TRUE; else while(!(rUTRSTAT2 & 0x1)
10、;/Receive data read *Revdata=RdURXH2(); return TRUE; /*void init_MotorPort() rGPBCON=rGPBCON&0x3ffff0|0xa; /Dead Zone=24, PreScalero1=2; rTCFG0=(0=NumberOfUartDrv) return FALSE; if(data =0) /输入 0-9 输出 9-0 if(data 5) data=5-(data-5); else if(data = a & data= A & datawrite(data);重新编程采用中断方式实现串口驱动。void
11、myUart_Init() int i; rGPHCON &= (0xff);/use GPH port as uart0 rGPHCON |= (2)|(22)|(24)|(26); rGPHUP = (0x0f);/the pull up function is disabled rULCON0 |= (30); /normal,no parity,one stop bit,8 bit rUCON0 =0x05;/|=(110)|(16)|(12)|(10;i-);void myUart_int_init() pISR_UART0=(unsigned int)uart0_receive;/
12、串口收中断函数 rINTMOD &=(128);/所用中断都是IRQ rINTMSK &= (128);/bit28 is uart0/开按键和串口的中断 rINTSUBMSK&= (11)|(10);/bit0 is rx_int 开串口收的中断_irq void uart0_receive() /*unsigned char rec2;/定义一个接受区, rec1=0;/后一个存结束符,便于发送。 rec0=rURXH0;/放在第一个 uart0_print(rec);/发送回去 /注意要先清楚子中断源,不然会产生两次中断, /关于原因,请参考我写的关于中断的文章,明天写,稍等啊 Clea
13、rSubPending(BIT_SUB_RXD0); ClearPending(BIT_UART0);/清除中断标志SRCPND uart0_print(alp);*/ /uart0_print(buf_send); rINTMSK |= (128); if(rUTRSTAT0 & 0x01) unsigned char rec2;/定义一个接受区, rec1=0;/后一个存结束符,便于发送。 rec0=rURXH0;/放在第一个 /uart0_print(rec);/发送回去 rUTXH0=rec0; ClearSubPending(BIT_SUB_RXD0); ClearPending(B
14、IT_UART0);/清除中断标志SRCPND rINTMSK &=(128); return ; if(!(rUTRSTAT0 & 0x02) /uart0_print(buf_send); while(!(rUTRSTAT0 & 0x02); /uart0_print(buf_send); ClearSubPending(BIT_SUB_TXD0); ClearPending(BIT_UART0); rINTMSK &=(1= 6500) clock=6500; Uart_Printf(0,now the motor is turning: clockwise); Uart_Printf(
15、0,the standard of the speed is %d !,clock/500); SetPWM(clock);/赋值给 电机,电机根据输入值调整转速 else if(control = -) clock-=500; if(clock =0) turnfl=1; else turnfl=0; clock=(-clock); if(turnfl = 1) Uart_Printf(0,now the motor is turning: anti-clockwise); Uart_Printf(0,the standard of the speed is %d !,clock/500);
16、 else Uart_Printf(0,now the motor is turning: clockwise); Uart_Printf(0,the standard of the speed is %d !,clock/500); SetPWM(clock); else if(control = 2) 按下2的时候 停止 clock=0; Uart_Printf(0,now the motor is stop!); Uart_Printf(0,the standard of the speed is %d !,clock/500); SetPWM(0); /将0值赋值给电机 七、思考题12
17、32串行通讯的数据格式是什么?异步串行通信中的字符传送格式2串行通讯最少需要几根线,分别如何连接? 两根, Rxd-txd txd-rxd3ARM的串行口有几个,相应的寄存器是什么?3个线路控制寄存器ULCONn ,控制寄存器UCONn ,FIFO控制寄存器UFCONn 控制寄存器UMCONn , 状态寄存器UTRSTAT ,错误状态寄存器UERSTAT FIFO状态寄存器UFSTAT ,发送寄存器UTXH和接收寄存器URXH,发送寄存器UTXH接收寄存器URXH,波特率因子寄存器UBRDIV4. 例程中的波特率为多少,如何确定的? 115200 例如:使用PCLK,在50 MHz的情况下,当波特率取115 200 bps时, UBRDIVn = (int)40000000/(11520016)1 = 265. 怎样在本例程的基础上增加错误检测功能? 错误状态寄存器UERSTAT 6.在充分理解程序代码的基础上根据以上的流程图对例程程序进行详细的注释。见五,六
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1