刚接触 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配置相关推荐

  1. rtems bbb板uart驱动编写

    进行串口驱动编写,主要参考源码中的console-config.c文件 以下是代码: void beagle_console_init(void) { if(init_needed) { const ...

  2. uart驱动框架及编程方法

    一.UART介绍 UART(Universal Asynchronous Receiver/Transmitter),中文全称为通用异步收发传输器,是一种异步收发传输器,它将要传输的数据通过并行到串行 ...

  3. 超详细Uart驱动框架及编程方法

    一.UART介绍 UART(Universal Asynchronous Receiver/Transmitter),中文全称为通用异步收发传输器,是一种异步收发传输器,它将要传输的数据通过并行到串行 ...

  4. Linux uart 驱动

    一.串口驱动框架简介 Linux 提供了串口驱动框架.串口驱动没有主机端和设备端之分,就只有一个串口驱动,而且这个驱动也是由处理器厂家编写好了. 我们真正要做的就是在设备树中添加所要使用的串口节点信息 ...

  5. UART驱动_linux

    目录 1.Linux下UART驱动框架 1)uart_driver注册与注销 2)uart_port的添加与移除 3)uart_ops实现 2.RS232驱动编写 1)UART3 IO节点创建 2)添 ...

  6. linux UART驱动

    目录 一.UART驱动关键结构体 二.UART驱动分析 三.UART驱动编写 一.UART驱动关键结构体 1.uart_driver 结构体 (1) uart_driver 结构体表示 UART 驱动 ...

  7. 4412linux编写串口驱动,Tiny4412之串口(Uart)驱动编写

    一:tiny4412串口驱动编写 1.串口通信简介 串口通信指串口按位(bit)发送和接收字节,串口通信的概念非常简单,串口按位(bit)发送和接收字节.尽管比按字节(byte)的并行通信慢,但是串口 ...

  8. Hi3519v101 uart驱动

    一.说明 1.Hi3519v101 SDK已经将uart驱动写好了,可以直接使用.但内核默认只添加了uart0驱动,其他端口需要手动添加.uart驱动路径为: drivers/tty/serial/a ...

  9. rk3568 | 瑞芯微平台GPIO引脚驱动编写

    最近在玩瑞芯微平台的产品,移植了几个设备的驱动,遇到了一些问题,总结后发现大部分问题都出在了GPIO配置的问题上,写下本篇文章,用来分享一下调试的心得. 有喜欢瑞芯微的朋友,可以加我好友,拉你进群,一 ...

最新文章

  1. PHP中spl_autoload_register函数的用法
  2. svn清理失败且路径显示乱码
  3. mybatis添加记录时返回主键id
  4. 《Selenium自动化测试指南》—第1章1.1节自动化测试基础
  5. 打开有视频的文件夹~~当遇到某些特定的视屏格式就会出现Activemovie Window:Explorer.EXE-应用程序错误
  6. sql server charindex函数和patindex函数详解(转)
  7. 【Java】HashMap源码(1.7)
  8. 针对12306.cn网站应用架够的一些看法
  9. 持续集成工具集之六 参考
  10. azure未连接_将Azure Databricks数据连接到Power BI Desktop
  11. Python中装入包pandas和matplotlib
  12. Pytorch——激活函数(Activation Function)
  13. 小程序服务器mp4文件,如何添加小程序视频链接及获取MP4格式视频
  14. 易到网约车许可证到手,终于能卖个好价钱了
  15. 各大洲时区以及Linux环境下修改时区
  16. golang的json的时间格式化解决方案
  17. RobotStudio 创建第一个工作站
  18. “errmsg“ : “not master and slaveOk=false“_Mongo集群没有primary但有secondary时连接不上且不能读数据
  19. 将 多个空格 替换为一个逗号
  20. luckySheet在线编辑excel及遇到的问题

热门文章

  1. 奈飞win10安装包_Windows10系统修复Netflix应用程序错误
  2. 微信小程序页面元素如何保存成图片
  3. 10gR2--EMCA常用命令说明
  4. python-猜数字游戏(0-9)
  5. 使用Outlook Mail App滑动操作快速处理邮件
  6. 苹果Mac触控栏怎样使用更方便
  7. 如何正确的从零开始学英语
  8. 在键盘上同时按3个键有时会有一个键不起作用是什么原因?
  9. Excel如何批量添加图片批注?
  10. 网络舆情分析工作怎么做的平台解决办法