学习ALINX_ZYNQ(7Z020开发板SDK)第二天——RS485串口

第一路 RS485 用的是 PS 端的 UART0

主程序流程:
初始化DS485_0 DE->设置MIO 9为输出->使能MIO 9->UART 初始化->设置 UART 模式->设置数据格式->串口中断设置
中断程序流程:
中断初始化->设置接收器FIFO中断触发级别,这里设置为32, 即收到32个数据就中断->设置超时时间->打开RX FIFO触发中断和超时中断->RS485为发送
中断服务程序:
读取中断ID寄存器,判断触发的是哪种中断->清除相应中断->判断数据是否发送完->数据全部发送完,RS485为接收,否则继续发送
代码如下:
/* Definitions for peripheral PS7_GPIO_0 */
//串口器件ID
#define RS485_DEVICE_ID      		XPAR_PS7_UART_0_DEVICE_ID
#define RS485_INTC_DEVICE_ID		XPAR_SCUGIC_SINGLE_DEVICE_ID//中断的设备ID
#define RS485_UART_INT_IRQ_ID		XPAR_XUARTPS_0_INTR//串口的中断号
#define XPAR_PS7_GPIO_0_DEVICE_ID 0
XUartPsFormat UartFormat =
{
		9600,
		XUARTPS_FORMAT_8_BITS,
		XUARTPS_FORMAT_NO_PARITY,
		XUARTPS_FORMAT_1_STOP_BIT
};

//串口
int uart_init(void)
{
	static int status;
	//设置RS485
	PsGpioSetup();
	//串口初始化
    status = uart_config();
    //串口中断初始化
    uart_intr(); 
    return status;
}

int PsGpioSetup(void)
{
	int Status;
	/* Initial RS485_0 DE */
	XGpioPs_Config *GPIO_CONFIG ;
	GPIO_CONFIG = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID) ;
	Status = XGpioPs_CfgInitialize(&rs485_0_de, GPIO_CONFIG, GPIO_CONFIG->BaseAddr) ;
	if (Status != XST_SUCCESS)
	{
		return XST_FAILURE ;
	}
	/* set MIO 9 as output */
	XGpioPs_SetDirectionPin(&rs485_0_de, 9, 1) ;
	/* enable MIO 9 output */
	XGpioPs_SetOutputEnablePin(&rs485_0_de, 9, 1) ;
	return XST_SUCCESS ;
}

//串口初始化
int uart_config(void)
{
		int Status;
		XUartPs_Config *Config;
		//根据器件ID查找配置信息
		Config = XUartPs_LookupConfig(RS485_DEVICE_ID);
		if (NULL == Config) {
			return XST_FAILURE;
		}
		//根据配置信息对PS UART进行初始化
		Status = XUartPs_CfgInitialize(&Uart_PS, Config, Config->BaseAddress);
		if (Status != XST_SUCCESS) {
			return XST_FAILURE;
		}
		/* Check hardware build./检查硬件搭配是否正确 */
		Status = XUartPs_SelfTest(&Uart_PS);
		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) ;
		return 1;
}

//串口中断初始化
int uart_intr(void)
{
	/*Set receiver FIFO interrupt trigger level, here set to 32*/
	XUartPs_SetFifoThreshold(&Uart_PS,32);
	//超时时间
	XUartPs_SetRecvTimeout(&Uart_PS,10);
	//RX FIFO trigger interrupt Timeout error interrupt
	XUartPs_SetInterruptMask(&Uart_PS,XUARTPS_IXR_RXOVR|XUARTPS_IXR_TOUT);
	SetupInterruptSystem(&IntcInstPtr, &Uart_PS, RS485_UART_INT_IRQ_ID) ;
	XGpioPs_WritePin(&rs485_0_de, 9, 0) ;
	return 2;
}

int SetupInterruptSystem(XScuGic *IntcInstancePtr,	XUartPs *UartInstancePtr, u16 UartIntrId)
{
	int Status;
	/* Configuration for interrupt controller */
	XScuGic_Config *IntcConfig;
	/* Initialize the interrupt controller driver */
	IntcConfig = XScuGic_LookupConfig(RS485_INTC_DEVICE_ID);
	if (NULL == IntcConfig) {
		return XST_FAILURE;
	}
	Status = XScuGic_CfgInitialize(IntcInstancePtr, IntcConfig,
			IntcConfig->CpuBaseAddress);
	if (Status != XST_SUCCESS) {
		return XST_FAILURE;
	}
	   //设置并打开中断异常处理功能
	    Xil_ExceptionInit();
	/*
	 * Connect the interrupt controller interrupt handler to the
	 * hardware interrupt handling logic in the processor.
	 */
	Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
			(Xil_ExceptionHandler) XScuGic_InterruptHandler,
			IntcInstancePtr);
	Status = XScuGic_Connect(IntcInstancePtr, UartIntrId,
			(Xil_ExceptionHandler) Handler,
			(void *) UartInstancePtr);
	if (Status != XST_SUCCESS) {
		return XST_FAILURE;
	}
	XScuGic_Enable(IntcInstancePtr, UartIntrId);
	Xil_ExceptionEnable();
	return Status ;
}
串口中断服务函数根据自己的功能编写
本代码是根据收到的数据回复对应的数据

 

void Handler(void *CallBackRef)
{
	XUartPs *UartInstancePtr = (XUartPs *) CallBackRef ;
	u32 UartSrValue ;
    //读取中断ID寄存器,判断触发的是哪种中断
	UartSrValue = XUartPs_ReadReg(UartInstancePtr->Config.BaseAddress,XUARTPS_IMR_OFFSET);
	UartSrValue &= XUartPs_ReadReg(UartInstancePtr->Config.BaseAddress,XUARTPS_ISR_OFFSET);
		if (UartSrValue & XUARTPS_IXR_RXOVR)   /* check if receiver FIFO trigger */
		{
	    	if(uart.Received_OK == TRUE)
			{
				XUartPs_WriteReg(UartInstancePtr->Config.BaseAddress,XUARTPS_ISR_OFFSET, XUARTPS_IXR_RXOVR);
				XUartPs_WriteReg(UartInstancePtr->Config.BaseAddress,XUARTPS_ISR_OFFSET, XUARTPS_IXR_TOUT) ;
				return;
			}
			/* clear trigger interrupt */
			XUartPs_WriteReg(UartInstancePtr->Config.BaseAddress, XUARTPS_ISR_OFFSET, XUARTPS_IXR_RXOVR) ;
			uart.rx_realnumber = XUartPs_Recv(&Uart_PS, uart.Buffer_R_temp, 1000) ;
			if(uart.rx_totalnumber+uart.rx_realnumber>1000)
			{
				uart.rx_totalnumber = 0;
				return;
			}
			else
			{
				memcpy(&uart.RX_buff[uart.rx_totalnumber],uart.Buffer_R_temp,uart.rx_realnumber);
			}
			uart.rx_totalnumber += uart.rx_realnumber;

		}
		    else if (UartSrValue & (u32)XUARTPS_IXR_TOUT)
		    {
		    	if(uart.Received_OK == TRUE)
				{
					XUartPs_WriteReg(UartInstancePtr->Config.BaseAddress,XUARTPS_ISR_OFFSET, XUARTPS_IXR_RXOVR);
					XUartPs_WriteReg(UartInstancePtr->Config.BaseAddress,XUARTPS_ISR_OFFSET, XUARTPS_IXR_TOUT) ;
					return;
				}
		        //清除中断标志
		        XUartPs_WriteReg(UartInstancePtr->Config.BaseAddress,XUARTPS_ISR_OFFSET, XUARTPS_IXR_TOUT) ;
		        uart.rx_realnumber = XUartPs_Recv(&Uart_PS,uart.Buffer_R_temp,1000);
				if(uart.rx_totalnumber+uart.rx_realnumber>1000)
				{
					uart.rx_totalnumber = 0;
					return;
				}
				else
				{
					memcpy(&uart.RX_buff[uart.rx_totalnumber],uart.Buffer_R_temp,uart.rx_realnumber);
				}
				uart.rx_totalnumber += uart.rx_realnumber;
				uart.whitch_Num_R=uart.rx_totalnumber;
				if(uart.whitch_Num_R>1)
				{
					uart.Received_OK=TRUE;
					XGpioPs_WritePin(&rs485_0_de, 9, 1) ;
					//接收数据处理
					PROTOCOL_Analysis((u8 *)uart.RX_buff,uart.whitch_Num_R);
					uart.whitch_Num_R = 0;
					uart.Received_OK = FALSE;
				}
				else
				{
					XUartPs_EnableUart(&Uart_PS);
				}
				uart.rx_totalnumber = 0;
		    }
		    else if (UartSrValue & (u32)XUARTPS_IXR_TXEMPTY)
		    {
		    	XUartPs_WriteReg(UartInstancePtr->Config.BaseAddress,XUARTPS_ISR_OFFSET, XUARTPS_IXR_TXEMPTY) ;
			    u32 rx_cnt=0;
			    rx_cnt=XUartPs_SendBuffer(&Uart_PS);
			//  printf("%ld\r\n",rx_cnt);
			    if(rx_cnt==0)
			    {
			    //数据全部发送,485为接收
		    	  XGpioPs_WritePin(&rs485_0_de, 9, 0);
			    }
			    else
			    {
			    }
		    }
		    else
		    {
		    	XUartPs_WriteReg(UartInstancePtr->Config.BaseAddress,XUARTPS_ISR_OFFSET, XUARTPS_IXR_MASK);
		    }

}

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: cource_s1_alinx_zynq(ax7xxx)开发平台基础教程vx.xx是一门关于使用AX7xxx系列Zynq芯片的开发平台的基础教程。这门课程主要面向初学者,提供了使用该开发平台的基本知识和技能。 在这门课程中,学习者将学习如何设置开发环境和安装必要的软件。他们将了解如何使用AX7xxx开发板,并学习如何连接外部设备,如显示器和键盘。学习者还将学习如何使用软件工具,如Vivado和SDK,来开发和调试他们的应用程序。 课程还将介绍Zynq芯片的架构和功能。学习者将学习如何配置和编程处理系统(PS)和可编程逻辑(PL)部分。他们将了解如何使用PS和PL之间的接口进行通信,并学习如何配置和使用Zynq芯片的外围设备,如GPIO,UART和SPI。 在课程的实践部分,学习者将完成一些小型项目来应用他们所学的知识。他们将开发一些简单的应用程序,如LED闪烁和按键检测,并学会如何使用中断来处理外部事件。学习者还将学习如何使用AX7xxx开发平台的嵌入式软件库,如FreeRTOS和lwIP,来开发更复杂的应用程序。 总体而言,cource_s1_alinx_zynq(ax7xxx)开发平台基础教程vx.xx是一门全面且实用的课程,旨在帮助初学者快速上手使用AX7xxx系列Zynq芯片的开发平台。通过学习这门课程,学员将掌握开发环境设置、软件工具使用、Zynq芯片架构和功能、外围设备配置和使用等基本技能,能够开发出简单到复杂的应用程序。 ### 回答2: cource_s1_alinx_zynq(ax7xxx)开发平台基础教程vx.xx是一本关于使用AlinxZynq(ax7xxx)开发平台进行开发的基础教程。该教程的版本号为vx.xx。 这本教程旨在帮助开发人员了解如何使用AlinxZynq开发平台进行项目开发Zynq是赛灵思公司推出的一款SoC(系统级芯片),它集成了ARM处理器和可编程逻辑(FPGA),可以同时运行软件和硬件设计。Alinx是一家专注于嵌入式系统开发的公司,他们提供了一系列的开发板和解决方案。 教程从基础概念开始介绍,例如Zynq的架构和功能。然后,教程详细解释了如何设置开发环境,包括安装必要的开发工具和驱动程序。接下来,教程向读者展示了如何开始一个项目,包括创建工程、导入IP核和配置FPGA。 教程中还包含了一些实际的示例项目,以帮助读者更好地理解并实践所学知识。这些项目涵盖了不同的应用领域,如图像处理、通信和控制等。读者可以根据自己的兴趣和需求选择适合的项目进行学习和仿真。 此外,教程还提供了一些调试技巧和常见问题的解答,以帮助读者克服在开发过程中可能遇到的困难和挑战。最后,教程还提供了进一步学习资料的推荐,如文档、视频教程和论坛等。 总之,cource_s1_alinx_zynq(ax7xxx)开发平台基础教程vx.xx是一本介绍如何使用AlinxZynq开发平台进行项目开发的教程。它适合那些希望了解Zynq平台基础知识和进行项目开发的读者。无论是初学者还是有经验的开发人员,都可以从中获得有益的指导和实践经验。 ### 回答3: cource_s1_alinx_zynq(ax7xxx)开发平台基础教程vx.xx是一套关于alinx Zynq系列(ax7xxx)开发平台的基础教程。Zynq系列开发平台是Xilinx推出的一种基于ARM架构的SoC(System-on-Chip)解决方案,它集成了ARM处理器和Xilinx的FPGA器件,可以在单一芯片上同时实现高性能的软件处理和灵活的硬件设计。这大大简化了嵌入式系统的设计流程,并提高了系统的灵活性和性能。 该教程主要介绍如何使用cource_s1_alinx_zynq(ax7xxx)开发平台进行软硬件协同设计。首先,它会介绍Zynq系列芯片的基本架构和硬件资源,使学习者能够了解芯片的基本功能和特性。然后,教程会详细介绍如何进行软件设计和硬件设计。对于软件设计部分,教程会涵盖Linux操作系统的移植、设备驱动程序的开发和应用软件的开发等内容。对于硬件设计部分,教程会介绍如何使用Xilinx的Vivado软件进行FPGA的逻辑设计和约束编写。此外,教程还会介绍如何进行软硬件协同设计,包括FPGA与ARM之间的数据传输和通信。 通过学习cource_s1_alinx_zynq(ax7xxx)开发平台基础教程,学习者可以掌握Zynq系列芯片的基本知识,了解软硬件协同设计的流程和方法,掌握基本的软硬件设计技巧,能够进行Zynq系列开发平台的应用开发。这对于从事嵌入式系统设计和开发的工程师来说是非常重要的,可以提高工作效率和开发质量,推动嵌入式系统的发展。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值