????????UART 控制器是一個全雙工異步收發控制器, MPSoC 內部包含兩個 UART 控制器, UART0 和 UART1。每一個 UART 控制器支持可編程的波特率發生器、 64 字節的接收 FIFO 和發送 FIFO、產生中斷、 RXD 和TXD 信號的環回模式設置以及可配置的數據位長度、停止位和校驗方式等。UART 控制器的配置以及狀態的獲取由控制(Control)和狀態寄存器(Status Registers完成。另外,UART 控制器不僅可以連接至 MIO,也可以映射到 EMIO,從而使用 PL 的端口來實現串口通信的功能。當 UART 控制器連接到 MIO 時,只有 Tx(發送)和 Rx(接收)兩個引腳;而當連接 EMIO 時,除 Tx 和Rx 引腳外,可選的還有 CTS、 RTS、 DSR、 DCD、 RI、 DTR 等引腳,這些引腳用于串口的流控制,即調制解調器的數據通訊中。UART 控制器采用獨立的接收和發送數據路徑,每個路徑包含一個 64 字節的 FIFO,控制器對發送和接收 FIFO 中的數據進行串并轉換操作。 FIFO 的中斷標志支持輪詢處理或中斷驅動處理兩種方式。 另外,控制器中還有一個模式開關,支持 RXD 和 TXD 信號的各種環回配置。 UART 控制器內部框圖如下圖所示:
main.c
#include "xparameters.h" //器件參數信息
#include "xuartps.h" //包含 PS UART 的函數聲明
#include "xil_printf.h" //包含 print()函數
#include "xscugic.h" //包含中斷的函數聲明
#include "stdio.h" //包含 printf 函數的聲明
#include "xscugic.h" //
#include "uart.h"
#include "intr.h"//定義結構體
XUartPs Uartps ;
XScuGic Intc ;int main(){uart_config(&Uartps);intr_config(&Intc,&Uartps);while(1){}
}
uart.c
#include "xparameters.h" //器件參數信息
#include "xuartps.h" //包含 PS UART 的函數聲明
#include "xil_printf.h" //包含 print()函數
#include "xscugic.h" //包含中斷的函數聲明
#include "stdio.h" //包含 printf 函數的聲明
#include "uart.h"#define UART_DEVICE_ID XPAR_PS7_UART_0_DEVICE_ID //串口設備 IDvoid uart_config(XUartPs *uartps){XUartPs_Config *uart_cfg;//查找配置信息uart_cfg = XUartPs_LookupConfig(UART_DEVICE_ID);//串口初始化XUartPs_CfgInitialize(uartps,uart_cfg,uart_cfg->BaseAddress);//UART參數設置//波特率 115200XUartPs_SetBaudRate(uartps,115200);//模式設置 正常模式XUartPs_SetOperMode(uartps,XUARTPS_OPER_MODE_NORMAL);//設置觸發數量:1XUartPs_SetFifoThreshold(uartps, 1);}
uart.h
#include "xparameters.h" //器件參數信息
#include "xuartps.h" //包含 PS UART 的函數聲明
#include "xil_printf.h" //包含 print()函數
#include "xscugic.h" //包含中斷的函數聲明
#include "stdio.h" //包含 printf 函數的聲明
#include "xscugic.h" //void uart_config(XUartPs *uartps);
init.c
#include "xparameters.h" //器件參數信息
#include "xuartps.h" //包含 PS UART 的函數聲明
#include "xil_printf.h" //包含 print()函數
#include "xscugic.h" //包含中斷的函數聲明
#include "stdio.h" //包含 printf 函數的聲明
#include "intr.h"#define UART_INT_IRQ_ID XPAR_XUARTPS_0_INTR //串口中斷 ID
#define INTC_DEVICE_ID XPAR_SCUGIC_SINGLE_DEVICE_ID //中斷控制器 IDvoid intr_config(XScuGic *Intc,XUartPs *Uartps){SetupInterruptSystem(Intc,Uartps); //設置中斷系統
}void SetupInterruptSystem(XScuGic *Intc, XUartPs *Uartps)
{XScuGic_Config *IntcConfig;//查找GIC配置信息,進行初始化IntcConfig = XScuGic_LookupConfig(INTC_DEVICE_ID);XScuGic_CfgInitialize(Intc, IntcConfig,IntcConfig->CpuBaseAddress);//配置UART中斷XUartPs_SetInterruptMask(Uartps,XUARTPS_IXR_RXOVR);/*********************************************************************************************************************///初始化ARM處理器異常句柄Xil_ExceptionInit();//給IRQ異常注冊處理程序Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,(Xil_ExceptionHandler)XScuGic_InterruptHandler,Intc);//使能處理器中斷Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ);
/*********************************************************************************************************************///關聯IQC異常處理函數XScuGic_Connect(Intc,UART_INT_IRQ_ID,(Xil_ExceptionHandler)IntrHandler,(void *)Uartps);//使能GIC控制器對應ID中斷XScuGic_Enable(Intc, UART_INT_IRQ_ID);}void IntrHandler(void *call_back_ref){u32 int_state;u8 rxdata;XUartPs *uart_ps = (XUartPs *) call_back_ref;//獲取中斷配置信息int_state = XUartPs_GetInterruptMask(uart_ps);//讀取中斷狀態int_state &= XUartPs_ReadReg(uart_ps->Config.BaseAddress,XUARTPS_ISR_OFFSET); //中斷狀態//判斷是否為rxfifo中斷if(int_state & XUARTPS_IXR_RXOVR){ //RXFIFO緩沖區中斷//讀取RXFIFO數據rxdata = XUartPs_RecvByte(uart_ps->Config.BaseAddress);//清除中斷標志XUartPs_WriteReg(uart_ps->Config.BaseAddress,XUARTPS_ISR_OFFSET,1);//發送數據XUartPs_SendByte(uart_ps->Config.BaseAddress,rxdata);}}
inrt.h
#include "xparameters.h" //器件參數信息
#include "xuartps.h" //包含 PS UART 的函數聲明
#include "xil_printf.h" //包含 print()函數
#include "xscugic.h" //包含中斷的函數聲明
#include "stdio.h" //包含 printf 函數的聲明void intr_config(XScuGic *Intc,XUartPs *Uartps);
void SetupInterruptSystem(XScuGic *Intc, XUartPs *Uartps);
void IntrHandler();
使用printf函數要注意在初始化函數之后使用
更換UART1
????????