项目简述
前面的文章我们已经讲过CPU之间的软中断,PS与PL之间的共享中断,但是共享中断还有一种数据类型也就是PS外设引起的中断。在学习本篇文章的同时一定要学习前面的两篇文章,可以对ZYNQ的中断有一个总体的认知。本篇文章将以UART为例来讲解PS的外设中断的使用。关于UART在ZYNQ的PS端相信大家都使用过print来输出相应的数据。但是UART如何接收数据是不是大家还没有真正的使用过,UART接收数据一般情况下我们使用的是中断来进行相应数据的接收,所以这篇文章我们讲解UART的中断情况下的发射与接收。
工程描述:使用PC机通过串口对PS发送数据,PS端做出相应的相应,并把接受到的数据发送回PS端,从而完成串口的回环校验。
本次实验所用到的软硬件环境如下:
1、VIVADO 2019.1
2、米联客MZ7015FA开发板
共享中断概述
这里为了清晰表述,再次引入中断分类:
从上面可以看出共享中断分为PL的中断和PS的IO中断,然后下面的共享中断的详细情况:
从上面可以看出UART1中断的ID是82,这在程序中进行初始化相应的中断时唯一的标识。
这一篇文章我们主要讲解UART中断的例子,引起UART中断的事件类型有很多,这就需要我们对其进行相应的中断类型的操作。而且这里需要注意的一点,这种类型的终端操作调试的时候一般不要使用Debug进行调试,因为这种情况会使得数据传输丢失,当然使用Debug调试还是可以大体验证自己实验的正确性。中断的代码与前面的软中断和PL端的共享中断大体一直,但是需要我们针对UART中断多添加一些额外的内容:
1、设置UART中断类型:IntrMask = XUARTPS_IXR_TOUT | XUARTPS_IXR_PARITY | XUARTPS_IXR_FRAMING |
XUARTPS_IXR_OVER | XUARTPS_IXR_TXEMPTY | XUARTPS_IXR_RXFULL |
XUARTPS_IXR_RXOVR;
XUartPs_SetInterruptMask(&UartPs, IntrMask);
2、设置串口波特率:XUartPs_SetBaudRate(&UartPs,115200);
3、设置中断服务函数:XUartPs_SetHandler(&UartPs,(XUartPs_Handler)UartHandler,&UartPs);
4、这里需要注意中断发生后一定要接受缓存的数据用来确保下次触发数据的正确性,XUartPs_Recv(&UartPs, RecBuf, 32);
PL端设计
这里PL端只需要例化一个ZYNQ的IP,其他部分不需要进行任何处理,所以PL端我们没有进行相应的设计。其中,Block Design设计如下:
PS端设计
总体代码与前面的两篇博客几乎一样,只是针对UART的协议使用了几个函数用来进行相应的设置。代码如下:
#include <stdio.h>
#include "xscugic.h"
#include "xparameters.h"
#include "sleep.h"
#include "xuartps.h"
#define GIC_ID XPAR_PS7_SCUGIC_0_DEVICE_ID
#define UART_DEVICE_ID XPAR_XUARTPS_0_DEVICE_ID
#define UART1INIR XPAR_XUARTPS_1_INTR
static XScuGic ScuGic;
static XScuGic_Config * ScuGicCfgPtr;
XUartPs UartPs;
XUartPs_Config *Config;
u8 RecBuf[32];
u8 SendBuf[32];
//initial gic & software intr
int initSwIntr();
//callback func
void UartHandler(vo