zynq 的uart(ps)

本文详细介绍了串口通信的初始化过程,包括配置参数设置、操作模式选择及中断系统设定。同时,深入探讨了串口数据的发送与接收函数实现,以及如何通过宏定义简化开发流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

初始化

int serial_init(void)
{
	int Status;
	XUartPs_Config *Config;

	Config = XUartPs_LookupConfig(UART_DEVICE_ID);
	if (NULL == Config) {
		return XST_FAILURE;
	}
	Status = XUartPs_CfgInitialize(&Uart_PS, Config, Config->BaseAddress);
	if (Status != XST_SUCCESS) {
		return XST_FAILURE;
	}
	/* Use Normal mode. */
	XUartPs_SetOperMode(&Uart_PS, XUARTPS_OPER_MODE_NORMAL);
	/* Set uart mode Baud Rate 115200, 8bits, no parity, 1 stop bit */
	XUartPs_SetDataFormat(&Uart_PS, &UartFormat) ;
	/*Set receiver FIFO interrupt trigger level, here set to 1*/

#if 0         // 不使用中断
	XUartPs_SetFifoThreshold(&Uart_PS,1) ;
	/* Enable the receive FIFO trigger level interrupt and empty interrupt for the device */
	XUartPs_SetInterruptMask(&Uart_PS,XUARTPS_IXR_RXOVR|XUARTPS_IXR_TXEMPTY);

	SetupInterruptSystem(&IntcInstPtr, &Uart_PS, UART_INT_IRQ_ID) ;
#endif

	return XST_SUCCESS;
}

发送和接收

int Uart_Send(u8 *sendbuf, int length)
{
	int SentCount = 0;

	while (SentCount < length) {
		SentCount += XUartPs_Send(&Uart_PS, &sendbuf[SentCount], 1);
	}

	return SentCount;
}

#define MAX_BUF_LEN		64
static char _uartBuf[MAX_BUF_LEN + 4];


u32 serial_send(u8 *pBuf, u32 len)
{
	 return XUartPs_Send(&Uart_PS, pBuf, len);
}

u32 serial_get(u8 *pBuf, int len)
{
	return XUartPs_Recv(&Uart_PS, pBuf, len);
}

void serial_puts(const char *fmt, ...)
{
	// Generate formatted string.
	s16 count;
	va_list vArgList;
	va_start(vArgList, fmt);
	count = vsnprintf(_uartBuf, MAX_BUF_LEN, fmt, vArgList);
	va_end(vArgList);

	if (MAX_BUF_LEN < count)
	{
		count = MAX_BUF_LEN;
	}

	serial_send(_uartBuf, count);
}

需要的宏

#define UART_DEVICE_ID      XPAR_XUARTPS_0_DEVICE_ID
#define INTC_DEVICE_ID		XPAR_SCUGIC_SINGLE_DEVICE_ID
#define UART_INT_IRQ_ID		XPAR_XUARTPS_1_INTR

静态变量

const XUartPsFormat UartFormat =
{
		115200,
		XUARTPS_FORMAT_8_BITS,
		XUARTPS_FORMAT_NO_PARITY,
		XUARTPS_FORMAT_1_STOP_BIT
};


XUartPs Uart_PS;		/* Instance of the UART Device */
XScuGic IntcInstPtr ;

 

### Zynq 平台中的 UART 配置与使用 Zynq-7000 All Programmable SoC 是一种集成 ARM Cortex-A9 处理器和可编程逻辑的器件,广泛应用于嵌入式系统设计中。UART(Universal Asynchronous Receiver/Transmitter)是一种常见的串行通信接口,在 Zynq 中可以通过硬件模块实现其功能。 #### 硬件配置 在 Vivado 或 Xilinx SDK 工具链中,可以利用 PS(Processing System)部分的 UART 控制器来完成基本的串口通信设置。PSUART 功能默认支持多种波特率以及标准的数据位、停止位和校验模式的选择[^1]。具体配置过程如下: - **创建 Block Design**: 在 Vivado 中新建一个项目并添加 Zynq Processing System (PS) 模块。 - **启用 UART 接口**: 打开 PS 配置界面,进入 `Peripheral I/O Pins` 页面,找到 UART 相关选项并将它们映射到外部引脚上。 - **分配引脚位置**: 使用工具自动或手动指定 TX 和 RX 引脚的位置以便于后续连接物理设备测试电路板上的信号传输情况。 #### 软件初始化 对于软件层面的操作,则主要依赖 Linux 驱动程序或者裸机应用程序来进行详细的参数设定工作。如果是在运行操作系统环境下的开发流程里,通常不需要过多关注底层细节因为已经有现成可用的服务函数可供调用;而对于无 OS 场景则需自行编写驱动代码管理寄存器读写动作等操作行为。 以下是基于纯 C 语言的一个简单例子展示如何打开端口、设置波特率为 115200bps 及其他必要属性之后发送字符串消息给另一方接收终端显示出来: ```c #include <stdio.h> #include "xparameters.h" #include "xuartps.h" #define UART_BASEADDR XPAR_XUARTPS_0_BASEADDR int main(){ int Status; XUartPs Uart; /* Initialize the UART driver */ Status = XUartPs_CfgInitialize(&Uart,(XUartPs_Config *)XPAR_XUARTPS_0_DEVICE_ID,UART_BASEADDR); if(Status != XST_SUCCESS){ return XST_FAILURE; } /* Set Baud Rate to 115200 bps*/ XUartPs_SetBaudRate(&Uart,115200); /* Send String Over UART */ char *msg="Hello World!\n\r"; XUartPs_Send(&Uart,msg,strlen(msg)); while(XUartPs_IsTransmitFull(&Uart)); // Wait until all bytes are sent return 0; } ``` 上述片段展示了通过调用特定 API 函数完成整个初始化过程,并最终实现了向目标发出固定文本的功能演示效果[^2]。 #### 注意事项 当实际部署解决方案时还需要考虑更多方面因素比如错误处理机制的设计思路规划等问题都需要提前做好充分准备才能确保整体系统的稳定性和可靠性达到预期水平。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值