1、在本实验中,串口电路如下图所示, 开发板上提供两个串口DB9。其中UART0为主串口,可与PC或MODOM进行串行通迅串行通信接口电路组成可编程的串行接口芯片波特率发生器EIA与TTL电平转换器地址译码电路通信协议:异步协议同步协议开始前,线路处于空闲状态,送出连续“1”。传送开始时首先发一个“0”作为起始位,然后出现在通信线上的是字符的二进制编码数据。每个字符的数据位长可以约定为5位、6位、7位或8位,一般采用ASCII编码。后面是奇偶校验位,根据约定,用奇偶校验位将所传字符中为“1”的位数凑成奇数个或偶数个。也可以约定不要奇偶校验,这样就取消奇偶校验位。最后是表示停止位的“1”信号,这个停
2、止位可以约定持续1 位、1.5 位或2 位的时间宽度。至此一个字符传送完毕,线路又进入空闲,持续为“1”。经过一段随机的时间后,下一个字符开始传送才又发出起始位。每一个数据位的宽度等于传送波特率的倒数。微机异步串行通信中,常用的波特率为110,150,300,600,1200,2400,4800,9600 等。四、实验步骤1.准备实验环境。使用简易JTAG仿真器连接目标板,使用UP2410实验板附带的串口线连接实验板上的UART0和PC机的串口。2.在PC机上运行windows自带的串口通信程序超级终端程序,或者其它串口通信程序(如:串口精灵等。超级终端配置如下图所示)。3.使用EmbestI
3、DE通过Embest仿真器连接实验板,打开实验例程目录下例程,下载并运行它。4.在PC上观察超级终端程序主窗口;5.通过PC机键盘输入字符,可以看到相应的字符显示在超级终端主窗口,输入回车,所有字符一次性回显出来。6. 修改程序,要求键盘输入为“0”-“9”时,实验箱通过串口返回“9”-“0”,当输入为“A”-“Z”时,实验箱通过串口返回“a”-“z”,反之亦然。7. 重新编程采用中断方式实现串口驱动。8. 尝试将实验一和实验四结合起来,实现通过键盘输入实现对电机转速、转向的控制,可以通过按键来控制电机的关停和加速及减速。五、程序说明typedef struct /uart用一个结构体定义,因
4、为三个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 Uart_Init(int whichUart, int baud)/初始化串口,选择第几个串口 if(whichU
5、art=NumberOfUartDrv) return FALSE; return serial_drvwhichUart-init(baud);/返回给结构体中,对应的串口int Uart_SendByte(int whichUart,int data)write(data);/发数据,一个字节void Uart_SendString(int whichUart, char *pt) /发数据流 while(*pt)/将pt指向的数据流发送出来 if(*pt=n) Uart_SendByte(whichUart,r); Uart_SendByte(whichUart,*pt+); void
6、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); char Uart_Getchn(char* Revdata, int Uartnum, int timeout)/接受字符 if(Uartnum=0) while(!(rUTRSTAT0 & 0x1); /Receive data read *Rev
7、data=RdURXH0();/把接受的字符 给 定义的指针字符串 return TRUE; else if(Uartnum=1)(rUTRSTAT1 &/Receive data read *Revdata=RdURXH1(); else while(!(rUTRSTAT2 & *Revdata=RdURXH2(); /*void init_MotorPort() rGPBCON=rGPBCON&0x3ffff0|0xa; /Dead Zone=24, PreScalero1=2; rTCFG0=(0 if(data 0 /输入 0-9 输出 9-0 if(data 5) data=-(da
8、ta- else if(data = a dataz data=data-32;AZ data=data+32;重新编程采用中断方式实现串口驱动。void 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
9、)|(12)|(10;i-);void myUart_int_init() pISR_UART0=(unsigned int)uart0_receive;/串口收中断函数 rINTMOD &=(128);/所用中断都是IRQ rINTMSK &= (1/bit28 is uart0/开按键和串口的中断 rINTSUBMSK&= (11)|(10);/bit0 is rx_int 开串口收的中断_irq void uart0_receive() /*unsigned char rec2;/定义一个接受区, rec1=0/后一个存结束符,便于发送。 rec0=rURXH0;/放在第一个 uart0
10、_print(rec);/发送回去 /注意要先清楚子中断源,不然会产生两次中断, /关于原因,请参考我写的关于中断的文章,明天写,稍等啊 ClearSubPending(BIT_SUB_RXD0); ClearPending(BIT_UART0);/清除中断标志SRCPND uart0_print(alp);*/ /uart0_print(buf_send); rINTMSK |= (1= 6500) clock=6500;now the motor is turning: clockwisethe standard of the speed is %d !,clock/500); SetPW
11、M(clock);/赋值给 电机,电机根据输入值调整转速 else if(control = - clock-=500; if(clock =0) turnfl=1; else turnfl=0; clock=(-clock); if(turnfl = 1) else 2 按下2的时候 停止 clock=0;now the motor is stop! SetPWM(0); /将0值赋值给电机七、思考题1232串行通讯的数据格式是什么?异步串行通信中的字符传送格式2串行通讯最少需要几根线,分别如何连接? 两根, Rxd-txd txd-rxd3ARM的串行口有几个,相应的寄存器是什么?3个线路
12、控制寄存器ULCONn ,控制寄存器UCONn ,FIFO控制寄存器UFCONn 控制寄存器UMCONn , 状态寄存器UTRSTAT ,错误状态寄存器UERSTAT FIFO状态寄存器UFSTAT ,发送寄存器UTXH和接收寄存器URXH,发送寄存器UTXH接收寄存器URXH,波特率因子寄存器UBRDIV4. 例程中的波特率为多少,如何确定的? 115200 使用PCLK,在50 MHz的情况下,当波特率取115 200 bps时,16)1 = 265. 怎样在本例程的基础上增加错误检测功能?错误状态寄存器UERSTAT 6.在充分理解程序代码的基础上根据以上的流程图对例程程序进行详细的注释。见五,六
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1