华北电力大学科技学院ARM课内实验四_第1页
华北电力大学科技学院ARM课内实验四_第2页
华北电力大学科技学院ARM课内实验四_第3页
华北电力大学科技学院ARM课内实验四_第4页
华北电力大学科技学院ARM课内实验四_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、科 技 学 院课程设计报告( 2015 - 2016年度第 二 学期)名 称:ARM试验UART 题 目: 院 系: 科 技 学 院 班 级: 13k2 学 号:31 学生姓名: 指导教师: 张老师 设计周数: 成 绩: 日期:2016年 5月 10 日实验四:(1)UART0-4一:实验现象1. 本次实验是使用LPC178/177x系列Cortex-M3中的通用异步收发器UART0-4,短接P0.2和TXD0、P0.3和RXD0,通过串口0-4发送缓冲器中的数据,通过串口调试软件可以观察到发送的数据(16进制格式)。由于UART中的uart.c文件已经对UART0-4的管脚接口都已设置好,所

2、以我们无需在对其进行设置,只需用杜邦线连接各管脚和TXD0、RXD0,就可观察现象。所以这里只写出UART0的,其余的和UART0的一样。2. 现象如下图所示:UART0UART1:总共有64个数据。(由BUFSIZE的值可得出)。二:实验代码分析(1)uart.c文件部分此部分为UART的设置部分,因此所有的UART实验都有,所以后面实验就不在给出解释。首先我们要知道UART的基本设置流程。下面几张图说明:代码如下:#include ./LPC177x_8x/LPC177x_8x.h#include ./LPC177x_8x/type.h#include uart.hvolatile uin

3、t32_t UART0Status, UART1Status;volatile uint32_t UART2Status, UART3Status;volatile uint32_t UART4Status;volatile uint8_t UART0TxEmpty = 1, UART1TxEmpty = 1;volatile uint8_t UART2TxEmpty = 1, UART3TxEmpty = 1;volatile uint8_t UART4TxEmpty = 1;volatile uint8_t UART0BufferBUFSIZE, UART1BufferBUFSIZE;vo

4、latile uint8_t UART2BufferBUFSIZE, UART3BufferBUFSIZE;volatile uint8_t UART4BufferBUFSIZE;volatile uint32_t UART0Count = 0, UART1Count = 0;volatile uint32_t UART2Count = 0, UART3Count = 0;volatile uint32_t UART4Count = 0;UART0-4的中断处理函数(以UART0为例,1-4只需改变0为对应的数字即可)void UART0_IRQHandler (void) uint8_t u

5、iIIRValue = 0, uiLSRValue = 0; uint8_t uiDummy = uiDummy; uiIIRValue = LPC_UART0-IIR; uiIIRValue = 1; /中断标志寄存器值右移1位 uiIIRValue &= 0x07; if ( uiIIRValue = IIR_RLS ) /接收线状态中断 uiLSRValue = LPC_UART0-LSR; / 读取接收线状态寄存器 溢出中断、奇偶中断、帧中断、UART RBR中包含错误数据和帧间隔中断处理 if ( uiLSRValue & (LSR_OE|LSR_PE|LSR_FE|LSR_RXFE

6、|LSR_BI) ) UART0Status = uiLSRValue; uiDummy = LPC_UART0-RBR; return; if ( uiLSRValue & LSR_RDR ) /接收FIFO不为空中断 UART0BufferUART0Count = LPC_UART0-RBR; UART0Count+; if ( UART0Count = BUFSIZE ) UART0Count = 0; else if ( uiIIRValue = IIR_RDA ) /接收数据可用中断 UART0BufferUART0Count = LPC_UART0-RBR; UART0Count+

7、; if ( UART0Count = BUFSIZE ) UART0Count = 0; else if ( uiIIRValue = IIR_CTI ) /字符超时中断 UART0Status |= 0x100; else if ( uiIIRValue = IIR_THRE ) /发送保持寄存器空中断 uiLSRValue = LPC_UART0-LSR; if ( uiLSRValue & LSR_THRE ) UART0TxEmpty = 1; else UART0TxEmpty = 0; UART0-4端口引脚初始化函数uint32_t UARTInit( uint32_t Por

8、tNum) if ( PortNum = 0 ) LPC_SC-PCONP |= 0x00000008; #if 0 LPC_IOCON-P0_0 &= 0x07; LPC_IOCON-P0_0 |= 4; /P0.0为U0_TXD LPC_IOCON-P0_1 &= 0x07; LPC_IOCON-P0_1 |= 4; /P0.1为U0_RXD #endif #if 1 LPC_IOCON-P0_2 &= 0x07; LPC_IOCON-P0_2 |= 1; / P0.2为U0_TXD LPC_IOCON-P0_3 &= 0x07; LPC_IOCON-P0_3 |= 1; / P0.3为U

9、0_RXD #endif使能接收FIFO不为空中断、发送保持寄存器空中断、接收线状态中断 LPC_UART0-IER = IER_RBR | IER_THRE | IER_RLS;8为数据位,无奇偶检验位,1位停止位 LPC_UART0-LCR = 0x83; /锁定除数访问 LPC_UART0-FCR = 0x07; /使能并复位FIFO NVIC_EnableIRQ(UART0_IRQn); return (TRUE); else if ( PortNum = 1 ) LPC_SC-PCONP |= 0x00000010; #if 0 LPC_IOCON-P0_15 &= 0x07; LP

10、C_IOCON-P0_15 |= 1; /P0.15为U1_TXD LPC_IOCON-P0_16 &= 0x07; LPC_IOCON-P0_16 |= 1; / P0.16为U1_RXD #endif #if 1 LPC_IOCON-P3_16 &= 0x07; LPC_IOCON-P3_16 |= 3; /P3.16为U1_TXD LPC_IOCON-P3_17 &= 0x07; LPC_IOCON-P3_17 |= 3; /P3.17为U1_RXD #endif #if 0 LPC_IOCON-P2_0 &= 0x07; LPC_IOCON-P2_0 |= 2; /P2.0为U1_TX

11、D LPC_IOCON-P2_1 &= 0x07; LPC_IOCON-P2_1 |= 2; /P2.1为U1_TXD #endif 使能接收FIFO不为空中断、发送保持寄存器空中断、接收线状态中断 LPC_UART1-IER = IER_RBR | IER_THRE | IER_RLS; 8为数据位,无奇偶检验位,1位停止位 LPC_UART1-LCR = 0x83; LPC_UART1-FCR = 0x07; /使能并复位FIFO NVIC_EnableIRQ(UART1_IRQn); return (TRUE); else if ( PortNum = 2 ) LPC_SC-PCONP

12、|= 0x01000000; #if 1 LPC_IOCON-P0_10 &= 0x07; LPC_IOCON-P0_10 |= 1; /P0.10为U2_TXD LPC_IOCON-P0_11 &= 0x07; LPC_IOCON-P0_11 |= 1; /P0.11为U2_RXD #endif #if 0 LPC_IOCON-P4_22 &= 0x07; LPC_IOCON-P4_22 |= 2; /P4.22为U2_TXD LPC_IOCON-P4_23 &= 0x07; LPC_IOCON-P4_23 |= 2; /P4.23为U2_RXD #endif #if 0 LPC_IOCON

13、-P2_8 &= 0x07; LPC_IOCON-P2_8 |= 2; / P2.8为U2_TXD LPC_IOCON-P2_9 &= 0x07; LPC_IOCON-P2_9 |= 2; /P2.9为U2_RXD #endif 使能接收FIFO不为空中断、发送保持寄存器空中断、接收线状态中断 LPC_UART2-IER = IER_RBR | IER_THRE | IER_RLS; 8为数据位,无奇偶检验位,1位停止位 LPC_UART2-LCR = 0x83; LPC_UART2-FCR = 0x07; /使能并复位FIFO NVIC_EnableIRQ(UART2_IRQn); retu

14、rn (TRUE); else if ( PortNum = 3 ) LPC_SC-PCONP |= 0x02000000; #if 0 LPC_IOCON-P0_25 &= 0x07; LPC_IOCON-P0_25 |= 3; / P0.25为U3_TXD LPC_IOCON-P0_26 &= 0x07; LPC_IOCON-P0_26 |= 3; /P0.26为U3_RXD #endif #if 0 LPC_IOCON-P0_0 &= 0x07; LPC_IOCON-P0_0 |= 2; /P0.0为U3_TXD LPC_IOCON-P0_1 &= 0x07; LPC_IOCON-P0_

15、1 |= 2; /P0.1为U3_RXD #endif #if 1 LPC_IOCON-P4_28 &= 0x07; LPC_IOCON-P4_28 |= 2; /P4.28为U3_TXD LPC_IOCON-P4_29 &= 0x07; LPC_IOCON-P4_29 |= 2; / P4.29为U3_RXD #endif #if 0 LPC_IOCON-P0_2 &= 0x07; LPC_IOCON-P0_2 |= 2; /P0.2为U3_TXD LPC_IOCON-P0_3 &= 0x07; LPC_IOCON-P0_3 |= 2; / P0.3为U3_RXD #endif 使能接收FI

16、FO不为空中断、发送保持寄存器空中断、接收线状态中断 LPC_UART3-IER = IER_RBR | IER_THRE | IER_RLS; 8为数据位,无奇偶检验位,1位停止位 LPC_UART3-LCR = 0x83; LPC_UART3-FCR = 0x07; /使能并复位FIFO NVIC_EnableIRQ(UART3_IRQn); return (TRUE); else if ( PortNum = 4 ) LPC_SC-PCONP |= 0x00000100; #if 0 LPC_IOCON-P0_22 &= 0x07; LPC_IOCON-P0_22 |= 3; /P0.2

17、2为U4_TXD LPC_IOCON-P2_9 &= 0x07; LPC_IOCON-P2_9 |= 3; /P2.9为U4_RXD #endif #if 1 LPC_IOCON-P1_29 &= 0x07; LPC_IOCON-P1_29 |= 5; /P1.29为U4_TXD LPC_IOCON-P2_9 &= 0x07; LPC_IOCON-P2_9 |= 3; /P2.9为U4_RXD #endif #if 0 LPC_IOCON-P5_4 &= 0x07; LPC_IOCON-P5_4 |= 4; / P5.4为U4_TXD LPC_IOCON-P5_3 &= 0x07; LPC_I

18、OCON-P5_3 |= 4; /P5.3为U4_RXD #endif 使能接收FIFO不为空中断、发送保持寄存器空中断、接收线状态中断 LPC_UART4-IER = IER_RBR | IER_THRE | IER_RLS; 8为数据位,无奇偶检验位,1位停止位 LPC_UART4-LCR = 0x83; LPC_UART4-FCR = 0x07; /* 使能并复位FIFO */ NVIC_EnableIRQ(UART4_IRQn); return (TRUE); return( FALSE );UART0-4串口发送数据初始化void UARTSend( uint32_t portNum

19、, uint8_t *BufferPtr, uint32_t Length ) if ( portNum = 0 ) while ( Length != 0 ) while ( !(UART0TxEmpty & 0x01) ); / 等待发送标志为1 LPC_UART0-THR = *BufferPtr; /发送标志清0 BufferPtr+; / 指针后移 Length-; /发送数目减1 else if ( portNum = 1 ) while ( Length != 0 ) while ( !(UART1TxEmpty & 0x01) ); /等待发送标志为1 LPC_UART1-TH

20、R = *BufferPtr; /发送数据 UART1TxEmpty = 0; /发送标志清0 BufferPtr+; /指针后移 Length-; /发送数目减1 else if ( portNum = 2 ) while ( Length != 0 ) while ( !(UART2TxEmpty & 0x01) ); /等待发送标志为1 LPC_UART2-THR = *BufferPtr; /发送数据 UART2TxEmpty = 0; /发送标志清0 BufferPtr+; /指针后移 Length-; /发送数目减1 else if ( portNum = 3 ) while (

21、Length != 0 ) while ( !(UART3TxEmpty & 0x01) ); / 等待发送标志为1 LPC_UART3-THR = *BufferPtr; /发送数据 UART3TxEmpty = 0; /发送标志清0 BufferPtr+; /指针后移 Length-; /发送数目减1 else if ( portNum = 4 ) while ( Length != 0 ) while ( !(UART4TxEmpty & 0x01) ); /等待发送标志为1 LPC_UART4-THR = *BufferPtr; /发送数据 UART4TxEmpty = 0; /发送标

22、志清0 BufferPtr+; /指针后移 Length-; /发送数目减1 return;(2)主函数部分#include ./LPC177x_8x/LPC177x_8x.h#include ./LPC177x_8x/type.h#include ./UART/uart.hextern volatile uint32_t UART0Count;extern volatile uint8_t UART0BufferBUFSIZE;extern volatile uint32_t UART1Count;extern volatile uint8_t UART1BufferBUFSIZE;exte

23、rn volatile uint32_t UART2Count;extern volatile uint8_t UART2BufferBUFSIZE;extern volatile uint32_t UART3Count;extern volatile uint8_t UART3BufferBUFSIZE;extern volatile uint32_t UART4Count;extern volatile uint8_t UART4BufferBUFSIZE;void dataInit (uint32_t uiLocation) /UART0-4发送数据初始化子函数 uint32_t i =

24、 0; switch (uiLocation) case 0: for (i = 0; i BUFSIZE; i+) UART0Bufferi = i; UART0Count+; break; case 1: for (i = 0; i BUFSIZE; i+) UART1Bufferi = i; UART1Count+; break; case 2: for (i = 0; i BUFSIZE; i+) UART2Bufferi = i; UART2Count+; break; case 3: for (i = 0; i BUFSIZE; i+) UART3Bufferi = i; UART

25、3Count+; break; case 4: for (i = 0; i IER = IER_THRE | IER_RLS; UARTSend( 0, (uint8_t *)UART0Buffer, UART0Count ); LPC_UART0-IER = IER_THRE | IER_RLS | IER_RBR; break; case 1: LPC_UART1-IER = IER_THRE | IER_RLS; UARTSend( 1, (uint8_t *)UART1Buffer, UART1Count ); LPC_UART1-IER = IER_THRE | IER_RLS |

26、IER_RBR; break; case 2: LPC_UART2-IER = IER_THRE | IER_RLS; UARTSend( 2, (uint8_t *)UART2Buffer, UART2Count ); LPC_UART2-IER = IER_THRE | IER_RLS | IER_RBR; break; case 3: LPC_UART3-IER = IER_THRE | IER_RLS; UARTSend( 3, (uint8_t *)UART3Buffer, UART3Count ); LPC_UART3-IER = IER_THRE | IER_RLS | IER_

27、RBR; break; case 4: LPC_UART4-IER = IER_THRE | IER_RLS; UARTSend( 4, (uint8_t *)UART4Buffer, UART4Count ); LPC_UART4-IER = IER_THRE | IER_RLS | IER_RBR; break; while (1) int main (void) SystemInit(); UARTInit(0, 9600); /初始化串口0 dataInit(0); /初始化串口0的发送数据 dataSend(0); /通过串口0发送数据 三:通过修改某些语句从而使得串口信息发生变化U

28、ART0-4的试验现象都是只发送一次数据,所以在串口调试助手里只能看到一次数据,所以可以修改主函数中的某些语句就可使得数据循环发送,但是在实验验证修改是否正确时,不知道为什么还是只发送一次,但理论上是可以循环发送的。(2)UART自动波特率一:实验现象1. 本次实验是使用LPC178/177x系列Cortex-M3中的通用异步收发器中的自动波特率的设置,短接TXD0和P0.2、RXD0和P0.3,通过串口调试助手发送字符a或A,ARM将自动测到波特率,并将波特率发送到串口调试软件中,也就是ARM先自动匹配出波特率的值,并将匹配的值在发送到串口调试助手窗口中显示,注意:如果误差较大,可调节锁相环

29、倍频值和外设分频值。2. 现象如下图所示:二:实验代码分析#include ./LPC177x_8x/LPC177x_8x.h#include ./LPC177x_8x/type.h#include ./UART/uart.h#include stdio.h#include string.hvoid AutoBaud(void) char cStr64; uint32_t uiBand = 0; uint16_t uiDlm = 0; uint16_t uiDll = uiDll = 0; LPC_UART0-ACR = 0x01; /允许自动波特率 while (LPC_UART0-ACR & 0x01) != 0x0); /等待自动波特率测量完成 测量结束 LPC_UART0-ACR |= 0x01 IER &= (0x01 LCR = 0x83; /DLAB=1 uiDlm = (uint16_t)LPC_UART0-DLM; uiDll = (u

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论