This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

C6416外部中断在没有极性信号输入情况下,一直进入能够中断

Other Parts Discussed in Thread: TMS320C6416T

我是用TMS320C6416T的开发板,用外部中断6作为中断源,在程序配置好相关寄存器,并将程序下载到开发板并运行,在外部中断6引脚未接信号,此时用示波器观察到外部中断6引脚的信号一直是3.3V,通过设置断点观察到程序可以一直进入中断,观察寄存器看到外部中断6的IFR的一直是有效的;另外通过在程序中设置EXTPOL寄存器,编译器提示语句无效,下面是我的程序,求各位大神指教,不甚感激啊!

static GPIO_Config myGpioCfg1={
0x00000000, //GPGC: 直通模式下向CPU发送中断
0x000000F0, //GPEN: GP4、5、6、7设为输入\输出状态
// 0x00000000, //GPDIR: GP0 - GP15 设为输入
0x00000030, //GPDIR: GP4 - GP5 设为输出
0x00000000, //GPVAL: GP0 - GP15 值锁存为0
// 0x00000030, //GPVAL: GP4 - GP5 值锁存为1
0x000000C0, //GPHM: GP4 - GP7 允许接受中断
0x000000C0, //GPLM:GP4 - GP7 允许接受中断
// 0x00000000 //GPPOL: 上升沿触发
0x0000000F //GPPOL: 下降沿触发
};

void main(void)
{
GPIO_Handle myhGpio;
//Initialise CSL
CSL_init();

//配置GPIO
myhGpio = GPIO_open(GPIO_DEV0,GPIO_OPEN_RESET);
GPIO_config(myhGpio,&myGpioCfg1);

// IRQ_EXTPOL_XIP_OF(0xF);
*( volatile unsigned int* )EXTPOL=0x0000000F;
//中断设置
set_intrupt();

for(;;){

}
}

////////////////////////////////////////////////////////////////////////////
//中断寄存器配置函数
////////////////////////////////////////////////////////////////////////////
void set_intrupt(void){
IRQ_setVecs(vectors);

*( volatile unsigned int* )EXTPOL=0x0000000F;

IRQ_resetAll();
IRQ_map(IRQ_EVT_EXTINT6,6);
IRQ_map(IRQ_EVT_EDMAINT,8);

IRQ_nmiEnable();
IRQ_reset(IRQ_EVT_EXTINT6);
IRQ_enable(IRQ_EVT_EXTINT6);
IRQ_enable(IRQ_EVT_EDMAINT);

//允许通道6中断;
EDMA_intEnable(6);

IRQ_globalEnable();
}

  • void c_int04(void)

    {

                  GPIOBankIntDisable(SOC_GPIO_0_REGS, 0);

                  IntEventClear(SYS_INT_GPIO_B0INT);

                  GPIOPinIntClear(SOC_GPIO_0_REGS, 13);

                  GPIOBankIntEnable(SOC_GPIO_0_REGS, 0);

    }

    你看下这个中断子函数,你有没有对对应的寄存器clear。

  • 我的程序是进入中断服务函数,先清除该中断标志位,关闭中断,退出中断服务函数时候再使能中断的

  • 在中断程序里是不需要做中断的关闭与使能的,因为硬件自动把GIE关闭了,退出中断时执行B IRP会自动打开GIE,你要做的是清除模块的中断状态。

  • 哦,这样啊,那我在中断服务子函数中做了中断的关闭与使能,应该是多余的了,但它应该不会影响程序进入中断函数吧。我是在外部中断6引脚直接没有接任何信号时候,用示波器观察到的波形一直是3.3V左右的高电平,但程序跑起来之后,可以连续进入外部中断6,不知道这个是什么原因导致的

  • 提供一下ISR程序代码,以及GPIO的寄存器值(截屏)。

  • 下面是我的ISR程序代码:

    ////////////////////////////////////////////////////////////////////////////
    //外部中断6的ISR函数
    ////////////////////////////////////////////////////////////////////////////
    interrupt void c_Int6_BeginRead(void)
    {
    IRQ_disable(IRQ_EVT_EXTINT6);        //暂时关闭外部中断6,在EDMA中断处理函数中手动开启INT6
    IRQ_clear(IRQ_EVT_EXTINT6);
    printf("ExInt6 isr is running!\n");

    EDMA_open(EDMA_CHA_EXTINT6,EDMA_OPEN_ENABLE);
    set_qdma();

    return;
    }

    ////////////////////////////////////////////////////////////////////////////
    //EDMA中断的ISR函数
    ////////////////////////////////////////////////////////////////////////////
    interrupt void c_Int8_EdmaCha6(void){
    printf("edma_int is running!\n");

    ............      

    IRQ_enable(IRQ_EVT_EXTINT6);       //开启INT6

    return;
    }

    这是在INT6引脚无信号输入状态下,程序跑起来后GPIO寄存器值:

  • 上面寄存器显示GPIO6的值在变化,说明外部是有信号变化的,可能是你量的不对吧,不然怎么别的bit没有变化呢?

  • INT6的引脚确实是没有接任何信号的,换成了INT7引脚,可正常工作了,谢谢指导了哈!