C6657 sysbios下的GPIO中断问题

C6657 sysbios下的GPIO中断问题

此问题尚无答案
All Replies
  • 秀才80分

          本人最近在使用C6657跑sysbios系统来写一个GPIO22和GPIO23的中断,在裸机上已经能够进入中断,但是现在要使用sysbios,发现怎么都不能够进入中断,下面我贴出我的代码,请问是什么问题?

    /******************************************************************************************
     *
     *                        GPIO硬件中断线程创建函数
     *
    *******************************************************************************************/
    void GPIO_Hwi_thread_create(xdc_Int CPU_INTn1, xdc_Int CPU_INTn2, xdc_Int CPU_INTn3)
    {
        // 动态创建硬件中断
        Hwi_Handle hwi0;
        Hwi_Params hwiParams0;
        Error_Block eb0;
    
        // 初始化错误块
        Error_init(&eb0);
        // 使用默认值初始化参数
        Hwi_Params_init(&hwiParams0);
    	hwiParams0.eventId = 91;                                                                       // 中断事件
        hwiParams0.arg = 0;                                                                                // 传递到中断服务函数的参数
        hwiParams0.maskSetting = Hwi_MaskingOption_SELF;                    // 不允许该中断自身嵌套
        hwiParams0.enableInt = TRUE;                                                              // 使能中断
        hwi0 = Hwi_create(CPU_INTn1, GPIO0_Isr, &hwiParams0, &eb0);
        if(hwi0 == NULL)
        {
        	printf("GPIO Hwi create failed !\n");
        }
    
        // 动态创建硬件中断
    	Int eventId1;
    	Hwi_Handle hwi1;
    	Hwi_Params params1;
    	Error_Block eb1;
    
    	Error_init(&eb1);
    	CpIntc_mapSysIntToHostInt(0, CSL_INTC0_GPINT22, 0);                                                         // 中断控制器 0 映射系统中断 6 到主机中断 0
    	CpIntc_dispatchPlug(CSL_INTC0_GPINT22, &GPIO22_Isr, CSL_INTC0_GPINT22, TRUE);    // 配置系统中断 6中断服务函数并使能
    	CpIntc_enableHostInt(0, 0);                                                             // 中断控制器 0 使能主机中断 0
    	eventId1 = CpIntc_getEventId(0);                                                   // 取得主机中断 6 相应的事件号
    	Hwi_Params_init(&params1);                                                         // 初始化参数
    	params1.eventId = eventId1;                                                            // 设置关联主机中断的事件 ID
    	params1.arg = 0;                                                                                  // 参数必须为主机中断号
    	params1.maskSetting = Hwi_MaskingOption_SELF;                     // 不允许该中断自身嵌套
    	params1.enableInt = TRUE;                                                               // 使能中断
    	hwi1 = Hwi_create(CPU_INTn2, &CpIntc_dispatch, &params1, &eb1);
    	if(hwi1 == NULL)
    	{
    		printf("GPIO22(SYN_SAMPLE) Hwi create failed !\n");
    	}
    
    	// 动态创建硬件中断
    	Int eventId2;
    	Hwi_Handle hwi2;
    	Hwi_Params params2;
    	Error_Block eb2;
    
    	Error_init(&eb2);
    	CpIntc_mapSysIntToHostInt(0, CSL_INTC0_GPINT23, 1);                                            // 中断控制器 0 映射系统中断 7 到主机中断 1
    	CpIntc_dispatchPlug(CSL_INTC0_GPINT23, &GPIO23_Isr, CSL_INTC0_GPINT23, TRUE);                           // 配置系统中断 7 中断服务函数并使能
    	CpIntc_enableHostInt(0, 1);                                                           // 中断控制器 0 使能主机中断 1
    	eventId2 = CpIntc_getEventId(1);                                                 // 取得主机中断 1 相应的事件号
    	Hwi_Params_init(&params2);                                                         // 初始化参数
    	params2.eventId = eventId2;                                                            // 设置关联主机中断的事件 ID
    	params2.arg = 1;                                                                                  // 参数必须为主机中断号
    	params2.maskSetting = Hwi_MaskingOption_SELF;                     // 不允许该中断自身嵌套
    	params2.enableInt = TRUE;                                                               // 使能中断
    	hwi2 = Hwi_create(CPU_INTn3, &CpIntc_dispatch, &params2, &eb2);
    	if(hwi2 == NULL)
    	{
    		printf("GPIO23(SYN) Hwi create failed !\n");
    	}
    
    	Hwi_enable();
    
    }
    /******************************************************************************************
     *
     *                        同步信号初始化函数
     *
    *******************************************************************************************/
    void SYN_init(xdc_Int CPU_INTn1, xdc_Int CPU_INTn2, xdc_Int CPU_INTn3)
    {
    	KickUnlock();     // 解锁关键寄存器
    //	GPIOPinMuxSet(SOC_DSC_BASE_REGS + SOC_DSC_PIN_CONTROL_0, GPIO00_LENDIAN,  GPIO_NORMAL_ENABLED);       // 底板按键
    //	GPIOPinMuxSet(SOC_DSC_BASE_REGS + SOC_DSC_PIN_CONTROL_0, GPIO22_UARTCTS0,  GPIO_NORMAL_ENABLED);    //SYN_SAMPLE
    //	GPIOPinMuxSet(SOC_DSC_BASE_REGS + SOC_DSC_PIN_CONTROL_0, GPIO23_UARTRTS0,  GPIO_NORMAL_ENABLED);    //SYN
    
    	(*((volatile unsigned int *)(SOC_DSC_BASE_REGS + SOC_DSC_PIN_CONTROL_0))) |= ((1<<GPIO00_LENDIAN) | (1<<GPIO22_UARTCTS0) | (1<<GPIO23_UARTRTS0));
    
    	KickLock();        // 锁定关键寄存器
    //	GPIODirModeSet(SOC_GPIO_0_REGS, GPIO00_LENDIAN,  GPIO_DIR_INPUT);                    // 底板按键
    //	GPIODirModeSet(SOC_GPIO_0_REGS, GPIO22_UARTCTS0,  GPIO_DIR_INPUT);                  //SYN_SAMPLE
    //	GPIODirModeSet(SOC_GPIO_0_REGS, GPIO23_UARTRTS0,  GPIO_DIR_INPUT);                  //SYN
    
    	gpGPIO_regs->BANK_REGISTERS[0].DIR |= ((1<<GPIO00_LENDIAN) | (1<<GPIO22_UARTCTS0) | (1<<GPIO23_UARTRTS0));    //1为输入
    
    //	GPIOIntTypeSet(SOC_GPIO_0_REGS, GPIO00_LENDIAN,  GPIO_INT_TYPE_FALLEDGE);         // 配置为下降沿触发
    //	GPIOIntTypeSet(SOC_GPIO_0_REGS, GPIO22_UARTCTS0,  GPIO_INT_TYPE_FALLEDGE);      // 配置为下降沿触发
    //	GPIOIntTypeSet(SOC_GPIO_0_REGS, GPIO23_UARTRTS0,  GPIO_INT_TYPE_FALLEDGE);      // 配置为下降沿触发
    
    	/*trigger interrupt on both rising and falling edge*/
    	gpGPIO_regs->BANK_REGISTERS[0].CLR_FAL_TRIG= 0xFFFFFFFF;
    	gpGPIO_regs->BANK_REGISTERS[0].CLR_RIS_TRIG= 0xFFFFFFFF;
    	gpGPIO_regs->BANK_REGISTERS[0].SET_RIS_TRIG= 0;
    	gpGPIO_regs->BANK_REGISTERS[0].SET_FAL_TRIG= ((1<<GPIO00_LENDIAN) | (1<<GPIO22_UARTCTS0) | (1<<GPIO23_UARTRTS0));  //设置下降沿触发
    
    	GPIO_Hwi_thread_create(CPU_INTn1,CPU_INTn2,CPU_INTn3);
    
    	//GPIOBankIntEnable(SOC_GPIO_0_REGS);	                                                                              // 使能 GPIO BANK 中断
    	gpGPIO_regs->BINTEN= 3;
    }

    因为GPIO0的中断不是由CIC0路由的,所以是能够进入中断;但是GPIO22和GPIO23的中断需要CIC0路由一下,这个操作流程我是参考的我之前写的好使的串口0的中断写的,但是就是不能进中断。但是如果是裸机程序的话是可以进入中断的这说明硬件是没有问题的,所以我怀疑是sysbios软件的问题。但是不知道怎么查问题。

  • 状元96320分

    代码没有使能system interrupt,试试用CpIntc_enableSysInt函数。

    http://processors.wiki.ti.com/index.php/Configuring_Interrupts_on_Keystone_Devices#CpIntc

  • 秀才80分

    我试了还是不行。

  • 秀才80分

    请问还有可能是什么原因呢?

  • 状元96320分

    如果之前写的好使的串口0的中断也是基于sys/bios的,那流程应该没问题,最多是事件号和映射的中断号不一样。

    看一下中断标志位有没有置1?总中断有没有使能?

    另外,CSL和SYS/BIOS不要同时使用。