ZCU102平台PMU移植UARTPS驱动中断异常求助
Zynq UltraScale+ MPSoC ZCU102 PMU下UARTPS中断异常排查求助
使用Zynq UltraScale+ MPSoC ZCU102评估套件,正在将UARTPS驱动移植至PMU运行。执行xuartps_intr_example.c时,程序卡在第285行的while循环中,怀疑UART中断Handler(对应原示例代码第333行)未正常工作。
UART0用于打印日志,UART1用于传输数据,相关配置如下:
中断控制器定义
#define INTC XIntc #define INTC_DEVICE_ID 1 #define UART_INT_IRQ_ID 54
UARTPS配置表
XUartPs_Config XUartPs_ConfigTable[XPAR_XUARTPS_NUM_INSTANCES] = { { (u16)XPAR_XUARTPS_0_DEVICE_ID, // 0 (u32)XPAR_XUARTPS_0_BASEADDR, // 0xFF000000 (u32)XPAR_XUARTPS_0_UART_CLK_FREQ_HZ, // 99990005 (s32)0 }, { (u16)XPAR_XUARTPS_1_DEVICE_ID, // 1 (u32)XPAR_XUARTPS_1_BASEADDR, // 0xFF010000 (u32)XPAR_XUARTPS_1_UART_CLK_FREQ_HZ, // 99990005 (s32)0 } };
中断控制器配置表
#define XPAR_XINTC_NUM_INSTANCES 2 /* Number of instances */ #define XPAR_INTC_0_DEVICE_ID 1 /* Device ID for instance */ #define XPAR_INTC_0_BASEADDR 0x70800000 /* Register base address */ #define XPAR_INTC_0_ACK_BEFORE 0xFFFF00FF /* Ack timing, before/after */ #define XPAR_INTC_1_DEVICE_ID 2 /* Device ID for instance */ #define XPAR_INTC_1_BASEADDR 0x70800020 /* Register base address */ #define XPAR_INTC_1_ACK_BEFORE 0xFFFF00FF /* Ack timing, before/after */ XIntc_Config XIntc_ConfigTable[XPAR_XINTC_NUM_INSTANCES] = { { XPAR_INTC_0_DEVICE_ID, /* Unique ID of device */ XPAR_INTC_0_BASEADDR, /* Register base address */ XPAR_INTC_0_ACK_BEFORE, /* Ack before or after service */ 0 /* Device options */ } , { XPAR_INTC_1_DEVICE_ID, /* Unique ID of device */ XPAR_INTC_1_BASEADDR, /* Register base address */ XPAR_INTC_1_ACK_BEFORE, /* Ack before or after service */ 0 /* Device options */ } };
排查建议
- 中断控制器选型错误:PMU核心使用的是GICv2而非传统XIntc,当前代码中使用
XIntc驱动完全不匹配,需替换为XScuGic驱动进行中断管理 - 中断ID核对:ZCU102的PMU UART1中断ID并非54,需参考《Zynq UltraScale+ MPSoC Technical Reference Manual》(UG1085)中PMU中断映射表确认正确的中断号
- 中断使能完整性:
- 确认UART1已通过
XUartPs_SetInterruptMask开启对应发送/接收中断 - 确认中断控制器中已通过
XScuGic_Enable使能目标中断
- 确认UART1已通过
- Handler注册验证:检查
XScuGic_Connect是否正确将Handler与中断ID绑定,同时确认中断优先级、触发类型(电平/边沿)配置符合PMU要求 - 硬件与参数匹配:确认UART1的波特率、数据位、停止位、奇偶校验参数与外设完全一致,引脚连接无松动
- Handler触发验证:在Handler中添加寄存器写操作(如写入某块内存),通过JTAG调试工具监控该内存地址变化,直接判断Handler是否被触发
内容的提问来源于stack exchange,提问作者RookieRyan
相关产品推荐
相关产品推荐

