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.

gio口中断问题



最近在做矩阵键盘,按下按键后,通过sci观察会看多100多个数据,始终无法解决。我设置的是gioPORTB的0、2、4、6具有下降沿中断功能,另外的几个口用hetPORT1,不具备中断功能。由于键盘扫描中有这样一步gioSetPort(gioPORTB,0x00);,使得程序会发生4次中断,异味着即使消抖很好每次至少要发送5个数据。我想问一下,如何关中断,就是在进入中断处理服务函数之后,程序不再响应中断。

  • 你好。

    根据你的描述,你在按键中断程序中调用gioSetPort(gioPORTB,0x00);并通过SCI发送数据,所以你希望在中断程序中判断GIO的中断。不知这样理解是否正确?

    如果上述理解正确,那么你可以在中断程序中gioSetPort(gioPORTB,0x00);前调用gioDisableNotification(gioPORTB,0);关闭所有GIOB中断,在中断函数返回前,使能中断gioEnableNotification(gioPORTB,0);

    Regards.

    Jay

  • 你的理解是对的,但我按照你的方法貌似没用,以下是我中断

    #pragma CODE_STATE(gioLowLevelInterrupt, 32)
    #pragma INTERRUPT(gioLowLevelInterrupt, IRQ)

    /* SourceId : GIO_SourceId_011 */
    /* Requirements : HL_SR131 */
    void gioLowLevelInterrupt(void)
    {
        sint32 offset = gioREG->OFFSET1 - 1U;
        /* USER CODE BEGIN (17) */
        gioDisableNotification(gioPORTB,0);
        /* USER CODE END */
        if (offset >= 8)
        {
            gioNotification(gioPORTB, offset-8);
        }
        else
        {
            gioNotification(gioPORTA, offset);
        }
        /* USER CODE BEGIN (18) */
        gioEnableNotification(gioPORTB,0);
        /* USER CODE END */
    }

    下面是我中断服务程序的键盘扫描的部分程序

    uint8 key_scan()
    {
        uint32 key_temp0=0;
        uint32 key_temp1=0;
        uint32 key_num=0;
        wait(2000);
       key_temp0=gioGetPort(gioPORTB);
        if(key_temp0!=0x55)
        {
            wait(2000);
            key_temp0=gioGetPort(gioPORTB);
            if(key_temp0!=0x55)
            {
                gioSetPort(hetPORT1,0x091120FE);
                gioSetPort(gioPORTB,0x00);//程序在执行到这一步的时候,IntFlag会变成0x5500,本次中断结束后仍然继续执行gioNotification(gioPORTB, offset-8);直到IntFlag的值变为0x0000;
                key_temp1=gioGetPort(hetPORT1);

    我用示波器看了一下波形,gioPORTB口从高电平变为低电平,但是会出现尖峰,SCI传输的也是很多重复的数字。

    或者你有矩阵键盘的例程吗,我想参考下

  • 是不是我nhet1的设置有问题?

  • 问题已经解决。我用的gioPORTB和hetPORT1做的4*6矩阵键盘,用的是gioPORTB的0、2、4、6口作下降沿中断;
    但是在键盘扫描中有这样一句话gioSetPort(gioPORTB,0x00);,使得B口由高电平变为低电平,产生了4个下降沿中断,IntFlag中断标志寄存器的值变为0x5500,在本次中断结束之后仍然会进入中断,所以在中断处理程序末尾加上这样一句话
    gioREG->FLG = 0xFFFFU;把中断标志寄存器清零即可。

  • Hi sadlll,

        抱歉没能及时回复。

        问题解决了就好了。

        后面如果有任何其他问题,我们可以继续交流。