Zynq7020_PS端 uart驱动编写及Vivadio-SDK配置
刚接触 zynq 网上资料也很少,整起来也比较难受。ps、pl 还有SDK。这些东西第一次用都得了解。如果你是个arm工程师,PL部分可以不用怎么了解,只要学习简单的新建硬件流就可以了。主要学习使用的是SDK。在使用方面还得对SDK进行一些配置。
所以记录自己学习zynq的过程。开发板用的是黑金的。下面开始吧!!!!
一、串口初始化
XScuGic Intc // 中断
XUartPs Uart_PS; //uart
int usart_init(void)
{int Status;XUartPs_Config *Config;Config = XUartPs_LookupConfig( XPAR_XUARTPS_0_DEVICE_ID);if (NULL == Config){return XST_FAILURE;}Status = XUartPs_CfgInitialize(&Uart_PS, Config, Config->BaseAddress);if (Status != XST_SUCCESS){return XST_FAILURE;}Status = XUartPs_SelfTest(&Uart_PS); //UART设备自检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) ; //设置帧格式,波特率,停止位······#if 1 // 不使用中断XUartPs_SetRecvTimeout(&Uart_PS, 8);XUartPs_SetFifoThreshold(&Uart_PS,1) ;//FIFO中断触发字节 为1XUartPs_SetInterruptMask(&Uart_PS,XUARTPS_IXR_RXOVR|XUARTPS_IXR_TOUT|XUARTPS_IXR_TXEMPTY); // 设置UART的中断触发方式#endifreturn XST_SUCCESS;
}
二、串口中断控制器配置
/*
XScuGic *Intc 把开头声明的 XScuGic Intc变量传进去配置,
u16 DeviveID 传入配置的驱动参数所在的序号
*/
int Inter_System(XScuGic *Intc,u16 DeviveID)
{int Status=0;XScuGic_Config *IntcConfig;IntcConfig = XScuGic_LookupConfig(DeviveID);Status = XScuGic_CfgInitialize(Intc, IntcConfig, IntcConfig->CpuBaseAddress) ;if (Status != XST_SUCCESS)return XST_FAILURE ;Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT, //中断异常配置(Xil_ExceptionHandler)XScuGic_InterruptHandler,(void*)Intc);Xil_ExceptionEnable(); //Enable GICStatus=XScuGic_Connect(Intc, XPS_UART1_INT_ID,(Xil_InterruptHandler) Handler,(void *)&Uart_PS);//绑定中断函数与串口if (Status != XST_SUCCESS){return XST_FAILURE ;}XScuGic_Enable(Intc, XPS_UART1_INT_ID);/*Set receiver FIFO interrupt trigger level, here set to 1*/return XST_SUCCESS;
}
三、中断函数编写
1、在中断触发方式中,我们虽然没有配置 发送空中断这个模式。但是如果使用发送函数XUartPs_Send函数,会触发发送空中断。所在在中断函数中要清除发送空中断标志位!
2、在串口初始化时,我们配置了接收超时。在中断函数中也可以看到接收超时中断。是为了接收不定长数据用的。
void Handler(void *CallBackRef)
{XUartPs *UartInstancePtr = (XUartPs *) CallBackRef ;u32 ReceivedCount = 0 ;u32 IsrStatus ;//读取中断ID寄存器,判断触发的是哪种中断IsrStatus = XUartPs_ReadReg(UartInstancePtr->Config.BaseAddress,XUARTPS_IMR_OFFSET);IsrStatus &= XUartPs_ReadReg(UartInstancePtr->Config.BaseAddress,XUARTPS_ISR_OFFSET);if (IsrStatus & (u32)XUARTPS_IXR_RXOVR) /* 检查RxFIFO是否触发 */{XUartPs_WriteReg(UartInstancePtr->Config.BaseAddress, XUARTPS_ISR_OFFSET, XUARTPS_IXR_RXOVR) ;/* 清除中断标志 */ReceivedCount=XUartPs_Recv(UartInstancePtr, &RecvBufferPtr[TotalRecvCnt],500) ;TotalRecvCnt+=ReceivedCount;}else if(IsrStatus & (u32)XUARTPS_IXR_TOUT){XUartPs_WriteReg(UartInstancePtr->Config.BaseAddress, XUARTPS_ISR_OFFSET, XUARTPS_IXR_TOUT) ;//清中断 接收超时中断ReceivedCount=XUartPs_Recv(UartInstancePtr, &RecvBufferPtr[TotalRecvCnt], 500) ;TotalRecvCnt+=ReceivedCount;Uart_Send(RecvBufferPtr,50);TotalRecvCnt=0;memset(RecvBufferPtr,0,100);}else if(IsrStatus &(u32)XUARTPS_IXR_TXEMPTY){XUartPs_WriteReg(UartInstancePtr->Config.BaseAddress, XUARTPS_ISR_OFFSET, XUARTPS_IXR_TXEMPTY) ;}
}
注意:其中配置中断控制器时,
这部分代码是公共的,以后全部的中断都用我在开始申明的变量 XScuGic Intc。不能分开配置,否则配置不成功。XScuGic_Config *IntcConfig;IntcConfig = XScuGic_LookupConfig(DeviveID);Status = XScuGic_CfgInitialize(Intc, IntcConfig, IntcConfig->CpuBaseAddress) ;if (Status != XST_SUCCESS)return XST_FAILURE ;Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT, //中断异常配置(Xil_ExceptionHandler)XScuGic_InterruptHandler,(void*)Intc);Xil_ExceptionEnable(); //Enable GIC
Zynq7020_PS端 uart驱动编写及Vivadio-SDK配置相关推荐
- rtems bbb板uart驱动编写
进行串口驱动编写,主要参考源码中的console-config.c文件 以下是代码: void beagle_console_init(void) { if(init_needed) { const ...
- uart驱动框架及编程方法
一.UART介绍 UART(Universal Asynchronous Receiver/Transmitter),中文全称为通用异步收发传输器,是一种异步收发传输器,它将要传输的数据通过并行到串行 ...
- 超详细Uart驱动框架及编程方法
一.UART介绍 UART(Universal Asynchronous Receiver/Transmitter),中文全称为通用异步收发传输器,是一种异步收发传输器,它将要传输的数据通过并行到串行 ...
- Linux uart 驱动
一.串口驱动框架简介 Linux 提供了串口驱动框架.串口驱动没有主机端和设备端之分,就只有一个串口驱动,而且这个驱动也是由处理器厂家编写好了. 我们真正要做的就是在设备树中添加所要使用的串口节点信息 ...
- UART驱动_linux
目录 1.Linux下UART驱动框架 1)uart_driver注册与注销 2)uart_port的添加与移除 3)uart_ops实现 2.RS232驱动编写 1)UART3 IO节点创建 2)添 ...
- linux UART驱动
目录 一.UART驱动关键结构体 二.UART驱动分析 三.UART驱动编写 一.UART驱动关键结构体 1.uart_driver 结构体 (1) uart_driver 结构体表示 UART 驱动 ...
- 4412linux编写串口驱动,Tiny4412之串口(Uart)驱动编写
一:tiny4412串口驱动编写 1.串口通信简介 串口通信指串口按位(bit)发送和接收字节,串口通信的概念非常简单,串口按位(bit)发送和接收字节.尽管比按字节(byte)的并行通信慢,但是串口 ...
- Hi3519v101 uart驱动
一.说明 1.Hi3519v101 SDK已经将uart驱动写好了,可以直接使用.但内核默认只添加了uart0驱动,其他端口需要手动添加.uart驱动路径为: drivers/tty/serial/a ...
- rk3568 | 瑞芯微平台GPIO引脚驱动编写
最近在玩瑞芯微平台的产品,移植了几个设备的驱动,遇到了一些问题,总结后发现大部分问题都出在了GPIO配置的问题上,写下本篇文章,用来分享一下调试的心得. 有喜欢瑞芯微的朋友,可以加我好友,拉你进群,一 ...
最新文章
- PHP中spl_autoload_register函数的用法
- svn清理失败且路径显示乱码
- mybatis添加记录时返回主键id
- 《Selenium自动化测试指南》—第1章1.1节自动化测试基础
- 打开有视频的文件夹~~当遇到某些特定的视屏格式就会出现Activemovie Window:Explorer.EXE-应用程序错误
- sql server charindex函数和patindex函数详解(转)
- 【Java】HashMap源码(1.7)
- 针对12306.cn网站应用架够的一些看法
- 持续集成工具集之六 参考
- azure未连接_将Azure Databricks数据连接到Power BI Desktop
- Python中装入包pandas和matplotlib
- Pytorch——激活函数(Activation Function)
- 小程序服务器mp4文件,如何添加小程序视频链接及获取MP4格式视频
- 易到网约车许可证到手,终于能卖个好价钱了
- 各大洲时区以及Linux环境下修改时区
- golang的json的时间格式化解决方案
- RobotStudio 创建第一个工作站
- “errmsg“ : “not master and slaveOk=false“_Mongo集群没有primary但有secondary时连接不上且不能读数据
- 将 多个空格 替换为一个逗号
- luckySheet在线编辑excel及遇到的问题