⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uart.c

📁 自学ZedBoard:使用IP通过ARM PS访问FPGA(源代码)
💻 C
字号:
#include "xparameters.h"#include "xil_types.h"#include "xil_assert.h"#include "xil_io.h"/* Register offsets */#define UART_CR_OFFSET		0x00#define UART_MR_OFFSET		0x04#define UART_BAUDGEN_OFFSET	0x18#define UART_BAUDDIV_OFFSET	0x34#define MAX_BAUD_ERROR_RATE	3	/* max % error allowed */#define UART_BAUDRATE	115200void Init_Uart(void);void Init_Uart(void){#ifdef STDOUT_BASEADDRESS	u8 IterBAUDDIV;		/* Iterator for available baud divisor values */	u32 BRGR_Value;		/* Calculated value for baud rate generator */	u32 CalcBaudRate;	/* Calculated baud rate */	u32 BaudError;		/* Diff between calculated and requested baud				 * rate */	u32 Best_BRGR = 0;	/* Best value for baud rate generator */	u8 Best_BAUDDIV = 0;	/* Best value for baud divisor */	u32 Best_Error = 0xFFFFFFFF;	u32 PercentError;	u32 InputClk;   u32 BaudRate = UART_BAUDRATE;#if (STDOUT_BASEADDRESS == XPAR_XUARTPS_0_BASEADDR)	InputClk = XPAR_XUARTPS_0_UART_CLK_FREQ_HZ;#elif (STDOUT_BASEADDRESS == XPAR_XUARTPS_1_BASEADDR)	InputClk = XPAR_XUARTPS_1_UART_CLK_FREQ_HZ;#else	/* STDIO is not set or axi_uart is being used for STDIO */	return;#endif	/*	 * Determine the Baud divider. It can be 4to 254.	 * Loop through all possible combinations	 */	for (IterBAUDDIV = 4; IterBAUDDIV < 255; IterBAUDDIV++) {		/*		 * Calculate the value for BRGR register		 */		BRGR_Value = InputClk / (BaudRate * (IterBAUDDIV + 1));		/*		 * Calculate the baud rate from the BRGR value		 */		CalcBaudRate = InputClk/ (BRGR_Value * (IterBAUDDIV + 1));		/*		 * Avoid unsigned integer underflow		 */		if (BaudRate > CalcBaudRate) {			BaudError = BaudRate - CalcBaudRate;		} else {			BaudError = CalcBaudRate - BaudRate;		}		/*		 * Find the calculated baud rate closest to requested baud rate.		 */		if (Best_Error > BaudError) {			Best_BRGR = BRGR_Value;			Best_BAUDDIV = IterBAUDDIV;			Best_Error = BaudError;		}	}	/*	 * Make sure the best error is not too large.	 */	PercentError = (Best_Error * 100) / BaudRate;	if (MAX_BAUD_ERROR_RATE < PercentError) {		return;	}	/* set CD and BDIV */	Xil_Out32(STDOUT_BASEADDRESS + UART_BAUDGEN_OFFSET, Best_BRGR);	Xil_Out32(STDOUT_BASEADDRESS + UART_BAUDDIV_OFFSET, Best_BAUDDIV);	/*	 * 8 data, 1 stop, 0 parity bits	 * sel_clk=uart_clk=APB clock	 */	Xil_Out32(STDOUT_BASEADDRESS + UART_MR_OFFSET, 0x20);	/* enable Tx/Rx and reset Tx/Rx data path */	Xil_Out32((STDOUT_BASEADDRESS + UART_CR_OFFSET), 0x17);	return;#endif}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -