baobeizhanshen 2020-03-22 09:45 采纳率: 0%
浏览 1255
已结题

zynq 7000 PS接收PL中断问题

A、本人最近在进行ZYNQ7045的调测试,其中涉及到PS接收PL端的中断问题。
原理:PL设置定时器,以20ms为周期进行中断触发,PS在收到中断之后,立马响应,做后续的程序判断。
1、PL的20ms中断是上升沿边沿触发方式,中断号是61
2、调试过程1,不设置中断触发方式时,一直进入中断出不来,不进入主函数了。
3、调试过程2,设置中断触发方式为边沿触发,不进中断,一直在主函数中。
B、代码如下:

#include "xscugic.h"
#include "test_interrupt.h"

int flag_1ms,flag_20ms;


void Device1553BDriverHandler(void *CallbackRef)
{
    xil_printf("进入rt1553B-20200320\r\n");
    rtIsr();
}

void Device20msDriverHandler(void *CallbackRef,XScuGic *IntcInstancePtr,int intId)
{
    xil_printf("进入20ms中断-%d次\r\n",flag_20ms);
    flag_20ms ++;
    xil_printf("进入20ms中断-20200320\r\n");
    IntcTypeClear(IntcInstancePtr,INTC_DEVICE_20MS_INT_ID);
    //Xil_Out32(ICDICPR,0xffffffff);
    //Xil_Out32(ICDICPR+4,0xffffffff);
    //Xil_Out32(ICDICPR+8,0xffffffff);
    xil_printf("清除20ms中断-20200320\r\n");
}


//GIC初始化
int GIC_Initial(XScuGic *IntcInstancePtr,u32 INT_DEVICE_ID)
{
    int gic_status = 0;
    XScuGic_Config *GICConfigPtr;
    //根据INT_DEVICE_ID 中断设备号,完成中断GIC设备的配置
    GICConfigPtr = XScuGic_LookupConfig(INT_DEVICE_ID);
    gic_status = XScuGic_CfgInitialize(IntcInstancePtr,GICConfigPtr,GICConfigPtr->CpuBaseAddress);
    if(gic_status == XST_SUCCESS)
    {
        xil_printf("GIC配置成功!!!20200320\r\n");

    }
    gic_status = XScuGic_SelfTest(IntcInstancePtr);
    if(gic_status == XST_SUCCESS)
    {
        xil_printf("定时器自测试成功!!!\r\n");
    }
    return gic_status;
}
//全局中断设置
void Setup_Interrupt_Exception(XScuGic *IntcInstancePtr)
{
    xil_printf("全局中断设置!!!20200320\r\n");
    Xil_ExceptionInit();
    Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_IRQ_INT,
                    (Xil_ExceptionHandler)XScuGic_InterruptHandler,
                    IntcInstancePtr);
    Xil_ExceptionEnable();   //必须使能异常,之前没有使能导致程序错误!!!
}



//20ms中断设置和挂接
void Setup_20ms_Interrupt(XScuGic *IntcInstancePtr,u16 Intr_20ms_Id)
{
    int sta;
    u8 Priority,Trigger;
    //设置上升沿中断类型
    XScuGic_GetPriorityTriggerType(IntcInstancePtr, Intr_20ms_Id, &Priority, &Trigger);
    XScuGic_SetPriorityTriggerType(IntcInstancePtr, Intr_20ms_Id, Priority, 0x3);//上升沿
    //挂接中断
    sta = XScuGic_Connect(IntcInstancePtr, Intr_20ms_Id, (Xil_ExceptionHandler)Device20msDriverHandler, (void *)1);//
    if (sta != XST_SUCCESS)
    {
        return XST_FAILURE;
    }else
    {
        xil_printf("完成20ms 61号中断挂接 \r\n");
    }
    //中断使能
    XScuGic_Enable(IntcInstancePtr, Intr_20ms_Id);
    xil_printf("完成20ms中断使能 \r\n");
}

主函数编写

#include <string.h>
#include "NetWork.h"
#include "GlobalVars.h"
#include "gtypes.h"
#include "test_interrupt.h"

extern BOOL f_bSyn20ms; 
extern BOOL g_bStartTimer;
extern unsigned int g_nTimerCnt;


#define INTC_DEVICE_ID      XPAR_SCUGIC_SINGLE_DEVICE_ID //SCU的GIC设备号

XScuGic IntcInstancePtr;   ///?????

int main(void)
{ 


    char ID;
    ID = Get_CPU_ID();
    xil_printf("当前CPU的ID是 %d \r\n",ID);
    sleep(1);

#if 1
    //1、定义中断结构体   之前有取地址符
    GIC_Initial(&IntcInstancePtr,INTC_DEVICE_ID);

    //2、调用中断函数,
    Setup_Interrupt_Exception(&IntcInstancePtr);


    //4、中断使能
    Setup_20ms_Interrupt(&IntcInstancePtr,INTC_DEVICE_20MS_INT_ID);
#endif
    xil_printf("hello world5464654!!! \r\n");



    while(1)
    {

        xil_printf("hello world!!! \r\n");
        sleep(1);

    }

    return 0;
}

C、请各位看看是哪里设置的不对?
D、本人疑惑:
如果中断挂接不正常,那么不应该进入中断
本人一开始重点排查没有清楚中断,自己直接操作的ICDICPR该寄存器,不知道操作是否正确,屏蔽也没有作用。

  • 写回答

1条回答 默认 最新

  • 关注
    评论

报告相同问题?

悬赏问题

  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败