打印
[FPGA]

zynq的串口中断不能触发问题

[复制链接]
7674|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
colinjen|  楼主 | 2014-1-15 15:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
zynq板,想用串口接收中断,但是完全没反应,发送的字符可以接收,但就是没有触发中断,用过串口中断的帮忙看看,是uart初始化有问题,还是gic初始化有问题啊,急


#include "../inc/UartInit.h"

static void UartInterruptHandler(void);
static int GIC_Init(void);

XUartPs UartPs;
XScuGic ScuGic;

char rec;
int Uart_Init(void)
{
        int Status;
        u32 u32RegBaseAddress;
        XUartPs_Config *ConfigPtr;

        ConfigPtr = XUartPs_LookupConfig(XPAR_PS7_UART_1_DEVICE_ID);
        if (ConfigPtr == (XUartPs_Config *)NULL)
    {
                return XST_DEVICE_NOT_FOUND;
        }
        u32RegBaseAddress = ConfigPtr->BaseAddress;//
        XUartPs_CfgInitialize(&UartPs, ConfigPtr, ConfigPtr->BaseAddress);  //初始化
//        XUartPs_SetHandler(&UartPs, (XUartPs_Handler)UartInterruptHandler, (void *)0);
        Status = GIC_Init();   //配置GIC
        if (Status != XST_SUCCESS)
    {
                return XST_FAILURE;
        }
        XUartPs_WriteReg(u32RegBaseAddress, XUARTPS_RXWM_OFFSET, 1);

        XUartPs_WriteReg(u32RegBaseAddress, XUARTPS_IER_OFFSET, XUARTPS_IXR_RXFULL|XUARTPS_IXR_RXOVR);     //允许接收中断
        XUartPs_WriteReg(u32RegBaseAddress, XUARTPS_IDR_OFFSET, ~(XUARTPS_IXR_RXFULL|XUARTPS_IXR_RXOVR));  //允许接收中断

        XUartPs_SetBaudRate(&UartPs, UART_BAUDRATE);                              //设置波特率
        XUartPs_WriteReg(u32RegBaseAddress, XUARTPS_MR_OFFSET, 0x20);
        XUartPs_WriteReg(u32RegBaseAddress, XUARTPS_CR_OFFSET, 0x17);


        printf("0x%x\n",XUartPs_ReadReg(u32RegBaseAddress, XUARTPS_IMR_OFFSET));

        return XST_SUCCESS;
}

static int GIC_Init(void)
{
        int Status;

        XScuGic_Config * ConfigPtr;

        ConfigPtr = XScuGic_LookupConfig(XPAR_SCUGIC_0_DEVICE_ID);

        Status = XScuGic_CfgInitialize(&ScuGic, ConfigPtr, ConfigPtr->CpuBaseAddress);
        if (Status != XST_SUCCESS)
    {
                return XST_FAILURE;
        }
        XScuGic_Disable(&ScuGic, UART1_IRQ_ID);

        XScuGic_SetPriorityTriggerType(&ScuGic, UART1_IRQ_ID, 0x2, 0x1);  //设置优先级和触发类型
        XScuGic_Connect (&ScuGic, UART1_IRQ_ID, (Xil_InterruptHandler)UartInterruptHandler, (void *)0);
        if (Status != XST_SUCCESS)
    {
                return XST_FAILURE;
        }

        XScuGic_Enable(&ScuGic, UART1_IRQ_ID);                //允许串口中断

        Xil_ExceptionInit();

        Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT, (Xil_ExceptionHandler)XScuGic_InterruptHandler, &ScuGic);

        Xil_ExceptionEnable();

        return XST_SUCCESS;
}

static void UartInterruptHandler(void)
{
    volatile u8 StatusRegister;

    u32 u32RegBaseAddress;

    u32RegBaseAddress = UartPs.Config.BaseAddress;

        XUartPs_WriteReg(u32RegBaseAddress, XUARTPS_ISR_OFFSET, 0xffffffff);

    StatusRegister = XUartPs_ReadReg(u32RegBaseAddress, XUARTPS_ISR_OFFSET);
        /* enable Tx/Rx and reset Tx/Rx data path */


    while(StatusRegister & (XUARTPS_SR_RXFULL | XUARTPS_SR_RXOVR))//接收
    {
        if(StatusRegister & (XUARTPS_SR_RXFULL | XUARTPS_SR_RXOVR))
        {
                rec = XUartPs_ReadReg(u32RegBaseAddress, XUARTPS_FIFO_OFFSET);
            }
    }

}


相关帖子

沙发
Mevis| | 2017-12-3 20:12 | 只看该作者
请问您现在解决了吗?我现在也是不能触发串口中断。。。。。。。

使用特权

评论回复
板凳
wang_ys| | 2017-12-4 18:18 | 只看该作者
用的PS侧的串口还是PL侧的uartlite?

使用特权

评论回复
地板
Mevis| | 2017-12-11 22:35 | 只看该作者
wang_ys 发表于 2017-12-4 18:18
用的PS侧的串口还是PL侧的uartlite?

PS端的UART0

使用特权

评论回复
5
Mevis| | 2017-12-11 22:42 | 只看该作者
wang_ys 发表于 2017-12-4 18:18
用的PS侧的串口还是PL侧的uartlite?

PS端的UART0,现在就是能发送数据,但是不会触发中断

使用特权

评论回复
6
Mevis| | 2017-12-11 22:43 | 只看该作者
PS端的UART0,现在就是能发送数据,但是不会触发中断

使用特权

评论回复
7
zxq6| | 2017-12-12 07:26 | 只看该作者
估计还是初始化有问题,参考下官方例程试试看

使用特权

评论回复
8
CAO2015| | 2019-1-8 21:04 | 只看该作者
我也是同样的问题,触发不了接收中断,PS端的uart1

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

4

帖子

1

粉丝