第一路 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;//设置RS485PsGpioSetup();//串口初始化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 interruptXUartPs_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);}}

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

  1. 【嵌入式小白学习】--在STM32开发板上实现简单的串口通信

    嵌入式小白学习--在STM32开发板上实现简单的串口通信 这里写目录标题 嵌入式小白学习--在STM32开发板上实现简单的串口通信 Part1. STM32环境的搭建 Part2. 编写代码 Part ...

  2. Linux学习之ARM开发板连接ubuntu18.04LTS及NFS相关配置

    Linux学习之ARM开发板连接ubuntu18.04LTS及NFS相关配置 第一步:在PC机安装Ubuntu18.04LTS 具体安装步骤参见上一篇文章 第二步:安装arm-linux-gcc交叉编 ...

  3. 联盛德W800开发板|SDK|make menuconfig|工具链|本地命令行编译|Windows11|msys|清华源|(4)、联盛德W800开发板命令行编译指南

    目录 W800 芯片介绍: W800开发板 主要接口如下: 1 概述 2 准备工作 3.SDK目录结构如下: 4 W800编译固件编译 4.1 安装MSYS到本地: 4.2增加国内软件更新源 ​编辑4 ...

  4. 【Arduino学习】01.开发板选择和环境的搭建

    1.Arduino是一款便捷灵活.方便上手的开源电子原型平台.包含硬件(各种型号的Arduino板)和软件(Arduino IDE).由一个欧洲开发团队于2005年冬季开发. 2.做嵌入式开发有一点不 ...

  5. 【迅为推荐】适合新手学习的arm开发板-iTOP-4412开发板

    转自网站:www.topeetboard.com 免费部分视频试看地址:(PS:迅为提供高清版下载地址) [视频教程]iTOP-4412开发板之学习方法--致初学者 http://v.youku.co ...

  6. 全志H3-NanoPi开发板SDK之一总体概述

    版权声明:本文为博主(宽简厚重,Yuesichiu)原创文章,未经博主允许不得转载. http://blog.csdn.net/yuesichiu/article/details/77599746 一 ...

  7. stm32开发板的第二次下载程序

    作为一名妥妥的新手小白,我亲爱的同学让我记得写笔记,不然下次又忘了.我深感有理.如有错误不足请各位在评论区告知我及时更正. 先去看看B站视频[野火F103-MINI视频学习-[入门篇]] https: ...

  8. 【迅为iMX6Q】开发板烧写Uboot后串口无任何输出的问题解决

    问题描述 [迅为iMX6Q]开发板,资料还是很少的,或者说iMX6Q这款芯片,相关的资料很少 之前这个块开发板,是可以正常烧写并启动的,最近有了点时间,烧写了Linux系统镜像,发现设置为EMMC启动 ...

  9. 基于Arm板linux嵌入式系统RS485串口读写通讯

    最近在做基于Arm板linux嵌入式系统的RS485串口读写通讯首先参考 http://bbs.chinaunix.net/thread-3650543-1-1.html上的文章,该文章写道,读的时候 ...

最新文章

  1. 深入解析:TRUNCATE TABLE 的内部原理解析与恢复思路
  2. DNS隧道之DNS2TCP使用心得教程——是可以用来穿透qiang的,ubuntu下直接apt install dns2tcp...
  3. fork/join和线程池_从fork-join /线程池调用的Singelton bean中的访问spring请求范围缓存...
  4. 使用encodeURl()进行编解码
  5. Base Filtering Engine 拒绝访问解法
  6. 使用tail和head读取字节流
  7. 计算机缺失esul.dll,msedgeupdateres_es.dll
  8. hadoop之 hadoop日志存放路径
  9. vm怎么装vim_虚拟机中Ubuntu下安装vim及配置文件和插件之菜鸟初体验
  10. 又发现昆仑通态的一个BUG
  11. 使用ARCGIS对shp数据添加投影坐标系
  12. Jetty9开发(1)
  13. 浏览器控制台操作——随身笔记
  14. PHP 调用百度翻译api翻译数据
  15. 使用prophet库分析航空出行人次规律
  16. 开源托管平台GitHub和git分支
  17. video.js播放rtmp直播源和hls直播源
  18. 百度网盘资源怎么分享群链接下载?
  19. shell编程中expr的用法
  20. 获取mysql 自增id 和mysql 下一个自增id的方法

热门文章

  1. 皮克斯华人CG老鸟深圳创业!低代码实现好莱坞大片特效,北大图形学大牛:绝代双骄CG产业聚首...
  2. shell----------冒泡算法
  3. 众里寻TiDB千百度,蓦然回首,这些填坑记录还在灯火阑珊处
  4. 【Origin下载】最新正式版Origin中文版下载安装及绘图功能使用
  5. k折交叉验证概述-附R语言实现
  6. 易语言文本_解密c,易语言CNA算法实现快速加密解密文件的代码
  7. 启英泰伦推出离在线语音方案,断网、联网都能实现语音交互
  8. SEO吸引用户访问网站的方法是什么?
  9. 怎样才能做到吸引用户和留住用户呢?
  10. 两个音频合成一个PHP,剪切合并音乐软件 怎么把两段音乐合成一段