華北電力大學科技學院ARM課內實驗四_第1頁
華北電力大學科技學院ARM課內實驗四_第2頁
華北電力大學科技學院ARM課內實驗四_第3頁
華北電力大學科技學院ARM課內實驗四_第4頁
華北電力大學科技學院ARM課內實驗四_第5頁
已閱讀5頁,還剩13頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、科 技 學 院課程設計報告( 2015 - 2016年度第 二 學期)名 稱:ARM試驗UART 題 目: 院 系: 科 技 學 院 班 級: 13k2 學 號:31 學生姓名: 指導教師: 張老師 設計周數(shù): 成 績: 日期:2016年 5月 10 日實驗四:(1)UART0-4一:實驗現(xiàn)象1. 本次實驗是使用LPC178/177x系列Cortex-M3中的通用異步收發(fā)器UART0-4,短接P0.2和TXD0、P0.3和RXD0,通過串口0-4發(fā)送緩沖器中的數(shù)據(jù),通過串口調試軟件可以觀察到發(fā)送的數(shù)據(jù)(16進制格式)。由于UART中的uart.c文件已經對UART0-4的管腳接口都已設置好,所

2、以我們無需在對其進行設置,只需用杜邦線連接各管腳和TXD0、RXD0,就可觀察現(xiàn)象。所以這里只寫出UART0的,其余的和UART0的一樣。2. 現(xiàn)象如下圖所示:UART0UART1:總共有64個數(shù)據(jù)。(由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的中斷處理函數(shù)(以UART0為例,1-4只需改變0為對應的數(shù)字即可)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 ) /接收線狀態(tài)中斷 uiLSRValue = LPC_UART0-LSR; / 讀取接收線狀態(tài)寄存器 溢出中斷、奇偶中斷、幀中斷、UART RBR中包含錯誤數(shù)據(jù)和幀間隔中斷處理 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 ) /接收數(shù)據(jù)可用中斷 UART0BufferUART0Count = LPC_UART0-RBR; UART0Count+

7、; if ( UART0Count = BUFSIZE ) UART0Count = 0; else if ( uiIIRValue = IIR_CTI ) /字符超時中斷 UART0Status |= 0x100; else if ( uiIIRValue = IIR_THRE ) /發(fā)送保持寄存器空中斷 uiLSRValue = LPC_UART0-LSR; if ( uiLSRValue & LSR_THRE ) UART0TxEmpty = 1; else UART0TxEmpty = 0; UART0-4端口引腳初始化函數(shù)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不為空中斷、發(fā)送保持寄存器空中斷、接收線狀態(tài)中斷 LPC_UART0-IER = IER_RBR | IER_THRE | IER_RLS;8為數(shù)據(jù)位,無奇偶檢驗位,1位停止位 LPC_UART0-LCR = 0x83; /鎖定除數(shù)訪問 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不為空中斷、發(fā)送保持寄存器空中斷、接收線狀態(tài)中斷 LPC_UART1-IER = IER_RBR | IER_THRE | IER_RLS; 8為數(shù)據(jù)位,無奇偶檢驗位,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不為空中斷、發(fā)送保持寄存器空中斷、接收線狀態(tài)中斷 LPC_UART2-IER = IER_RBR | IER_THRE | IER_RLS; 8為數(shù)據(jù)位,無奇偶檢驗位,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不為空中斷、發(fā)送保持寄存器空中斷、接收線狀態(tài)中斷 LPC_UART3-IER = IER_RBR | IER_THRE | IER_RLS; 8為數(shù)據(jù)位,無奇偶檢驗位,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不為空中斷、發(fā)送保持寄存器空中斷、接收線狀態(tài)中斷 LPC_UART4-IER = IER_RBR | IER_THRE | IER_RLS; 8為數(shù)據(jù)位,無奇偶檢驗位,1位停止位 LPC_UART4-LCR = 0x83; LPC_UART4-FCR = 0x07; /* 使能并復位FIFO */ NVIC_EnableIRQ(UART4_IRQn); return (TRUE); return( FALSE );UART0-4串口發(fā)送數(shù)據(jù)初始化void UARTSend( uint32_t portNum

19、, uint8_t *BufferPtr, uint32_t Length ) if ( portNum = 0 ) while ( Length != 0 ) while ( !(UART0TxEmpty & 0x01) ); / 等待發(fā)送標志為1 LPC_UART0-THR = *BufferPtr; /發(fā)送標志清0 BufferPtr+; / 指針后移 Length-; /發(fā)送數(shù)目減1 else if ( portNum = 1 ) while ( Length != 0 ) while ( !(UART1TxEmpty & 0x01) ); /等待發(fā)送標志為1 LPC_UART1-TH

20、R = *BufferPtr; /發(fā)送數(shù)據(jù) UART1TxEmpty = 0; /發(fā)送標志清0 BufferPtr+; /指針后移 Length-; /發(fā)送數(shù)目減1 else if ( portNum = 2 ) while ( Length != 0 ) while ( !(UART2TxEmpty & 0x01) ); /等待發(fā)送標志為1 LPC_UART2-THR = *BufferPtr; /發(fā)送數(shù)據(jù) UART2TxEmpty = 0; /發(fā)送標志清0 BufferPtr+; /指針后移 Length-; /發(fā)送數(shù)目減1 else if ( portNum = 3 ) while (

21、Length != 0 ) while ( !(UART3TxEmpty & 0x01) ); / 等待發(fā)送標志為1 LPC_UART3-THR = *BufferPtr; /發(fā)送數(shù)據(jù) UART3TxEmpty = 0; /發(fā)送標志清0 BufferPtr+; /指針后移 Length-; /發(fā)送數(shù)目減1 else if ( portNum = 4 ) while ( Length != 0 ) while ( !(UART4TxEmpty & 0x01) ); /等待發(fā)送標志為1 LPC_UART4-THR = *BufferPtr; /發(fā)送數(shù)據(jù) UART4TxEmpty = 0; /發(fā)送標

22、志清0 BufferPtr+; /指針后移 Length-; /發(fā)送數(shù)目減1 return;(2)主函數(shù)部分#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發(fā)送數(shù)據(jù)初始化子函數(shù) 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的發(fā)送數(shù)據(jù) dataSend(0); /通過串口0發(fā)送數(shù)據(jù) 三:通過修改某些語句從而使得串口信息發(fā)生變化U

28、ART0-4的試驗現(xiàn)象都是只發(fā)送一次數(shù)據(jù),所以在串口調試助手里只能看到一次數(shù)據(jù),所以可以修改主函數(shù)中的某些語句就可使得數(shù)據(jù)循環(huán)發(fā)送,但是在實驗驗證修改是否正確時,不知道為什么還是只發(fā)送一次,但理論上是可以循環(huán)發(fā)送的。(2)UART自動波特率一:實驗現(xiàn)象1. 本次實驗是使用LPC178/177x系列Cortex-M3中的通用異步收發(fā)器中的自動波特率的設置,短接TXD0和P0.2、RXD0和P0.3,通過串口調試助手發(fā)送字符a或A,ARM將自動測到波特率,并將波特率發(fā)送到串口調試軟件中,也就是ARM先自動匹配出波特率的值,并將匹配的值在發(fā)送到串口調試助手窗口中顯示,注意:如果誤差較大,可調節(jié)鎖相環(huán)

29、倍頻值和外設分頻值。2. 現(xiàn)象如下圖所示:二:實驗代碼分析#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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論