搜索

8

主题

21

帖子

199

积分

注册会员

Rank: 2

积分
199
发表于 2017-2-17 11:04:09 16411 浏览 6 回复

求救大神求救大神!!!4412设置外部中断为下降沿触发,但是在上升沿的时候也触发中断


设置和问题如下:
1. 中断信号经过硬件消斗处理;
1. 调试迅为4412的外部中断时,设置中断为下降沿触发,但是在上升沿的时候也触发了中断,这里上升沿触发中断时,中断脚的电平读出来为 0;
2. 设置的外部中断脚为EXYNOS4_GPX2(0),EXYNOS4_GPX2(1),EXYNOS4_GPX1(2),EXYNOS4_GPX3(0)),EXYNOS4_GPX3(2);
3. 其中引脚EXYNOS4_GPX3(0)设置为下降沿中断时,在上升沿不会像其他引脚一样触发中断;
4. 设置为上升沿触发中断时,在上升沿会触发两次中断,在第一次中断时,读取中断脚的电平为 0,在第二次中断时,读取中断脚的电平为 1 ;
5. 调试过程中没有加载下列make menuconfig 路径中提供的的任何驱动:
Device Drivers  --->                                                              
         Input device support  --->
                           
  •    Keyboards  --->  
    6. 中断配置代码如下:
    1.     ret = gpio_request(EXYNOS4_GPX3(2), "EINT26");
    2.     if (ret) {
    3.                 printk("%s: request GPIO %d for EINT26 failed, ret = %d\n", DRIVER_NAME,
    4.                 EXYNOS4_GPX3(2), ret);
    5.                 return ret;
    6.              }
    7.     s3c_gpio_cfgpin(EXYNOS4_GPX3(2), S3C_GPIO_SFN(0xF));
    8.     s3c_gpio_setpull(EXYNOS4_GPX3(2), S3C_GPIO_PULL_UP);
    9.     gpio_free(EXYNOS4_GPX3(2));
    10.     ret = gpio_request(EXYNOS4_GPX3(2), "EINT26");
    11.     if (ret) {
    12.                 printk("%s: request GPIO %d for EINT26 failed, ret = %d\n", DRIVER_NAME,
    13.                 EXYNOS4_GPX3(0), ret);
    14.                 return ret;
    15.              }
    16.     s3c_gpio_cfgpin(EXYNOS4_GPX3(0), S3C_GPIO_SFN(0xF));
    17.     s3c_gpio_setpull(EXYNOS4_GPX3(0), S3C_GPIO_PULL_UP);
    18.     gpio_free(EXYNOS4_GPX3(0));
    19.     ret = gpio_request(EXYNOS4_GPX2(1), "EINT17");
    20.     if (ret) {
    21.                 printk("%s: request GPIO %d for EINT17 failed, ret = %d\n", DRIVER_NAME,
    22.                 EXYNOS4_GPX2(1), ret);
    23.                 return ret;
    24.              }
    25.     s3c_gpio_cfgpin(EXYNOS4_GPX2(1), S3C_GPIO_SFN(0xF));
    26.     s3c_gpio_setpull(EXYNOS4_GPX2(1), S3C_GPIO_PULL_UP);
    27.     gpio_free(EXYNOS4_GPX2(1));
    28.     ret = gpio_request(EXYNOS4_GPX1(2), "EINT10");
    29.     if (ret) {
    30.                 printk("%s: request GPIO %d for EINT10 failed, ret = %d\n", DRIVER_NAME,
    31.                 EXYNOS4_GPX1(2), ret);
    32.                 return ret;
    33.              }
    34.     s3c_gpio_cfgpin(EXYNOS4_GPX1(2), S3C_GPIO_SFN(0xF));
    35.     s3c_gpio_setpull(EXYNOS4_GPX1(2), S3C_GPIO_PULL_UP);
    36.     gpio_free(EXYNOS4_GPX1(2));
    37.     ret = request_irq(IRQ_EINT(26), eint26_interrupt,
    38.                         IRQ_TYPE_EDGE_FALLING /*IRQF_TRIGGER_FALLING*/, "eint26", pdev);
    39.     if (ret < 0) {
    40.                     printk("Request IRQ %d failed, %d\n", IRQ_EINT(26), ret);
    41.                     goto exit;
    42.                  }
    43.     ret = request_irq(IRQ_EINT(24), eint24_interrupt,
    44.                         IRQ_TYPE_EDGE_FALLING /*IRQF_TRIGGER_FALLING*/, "eint24", pdev);
    45.     if (ret < 0) {
    46.                     printk("Request IRQ %d failed, %d\n", IRQ_EINT(24), ret);
    47.                     goto exit;
    48.                  }
    49.     ret = request_irq(IRQ_EINT(17), eint17_interrupt,
    50.                         IRQ_TYPE_EDGE_FALLING /*IRQF_TRIGGER_FALLING*/, "eint17", pdev);
    51.     if (ret < 0) {
    52.                     printk("Request IRQ %d failed, %d\n", IRQ_EINT(17), ret);
    53.                     goto exit;
    54.                  }
    55.     ret = request_irq(IRQ_EINT(10), eint10_interrupt,
    56.                         IRQ_TYPE_EDGE_FALLING /*IRQF_TRIGGER_FALLING*/, "eint10", pdev);
    57.     if (ret < 0) {
    58.                     printk("Request IRQ %d failed, %d\n", IRQ_EINT(10), ret);
    59.                     goto exit;
    60.                  }
    复制代码
    7. 中断信号波形:


  • 本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    回复

    使用道具 举报

    8

    主题

    21

    帖子

    199

    积分

    注册会员

    Rank: 2

    积分
    199
     楼主| 发表于 2017-2-17 20:07:30
    使用其他GPIO脚的外部中断,设置下降沿触发时,在上升沿也会出现中断,这上升沿触发是不确定的(有时触发,有时不触发,当触发时中断脚的电平有时是 1 ,有时是 0 ,理论上应该是 1 )
    回复 点赞

    使用道具 举报

    48

    主题

    604

    帖子

    1923

    积分

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    1923
    发表于 2017-2-18 17:10:34
    中断产生之后可以查看有几次中断的~
    查看的值不对么?
    回复 点赞

    使用道具 举报

    8

    主题

    21

    帖子

    199

    积分

    注册会员

    Rank: 2

    积分
    199
     楼主| 发表于 2017-2-20 09:39:43
    TOPEET_moon 发表于 2017-2-18 17:10
    中断产生之后可以查看有几次中断的~
    查看的值不对么?

    通过cat /proc/interrupts 查看确实是产生了两次中断,中断程序里也是产生两次中断提示,上升沿产生中断时(设置下降沿触发中断),中断脚有时是高电平 1 ,有时是低电平 0 ;
    除了使用函数:gpio_request(); s3c_gpio_cfgpin();s3c_gpio_setpull();request_irq();对中断进行设置外,是不是还需要有其他的设置呢???
    回复 点赞

    使用道具 举报

    48

    主题

    604

    帖子

    1923

    积分

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    1923
    发表于 2017-2-22 09:07:51
    你在内核中搜一下,是不是有别的代码中把这个中断设置为上升和下降沿出发了?
    回复 点赞

    使用道具 举报

    8

    主题

    21

    帖子

    199

    积分

    注册会员

    Rank: 2

    积分
    199
     楼主| 发表于 2017-2-27 09:41:53
    TOPEET_moon 发表于 2017-2-22 09:07
    你在内核中搜一下,是不是有别的代码中把这个中断设置为上升和下降沿出发了?

    我在内核中把有关这个GPIO脚的中断驱动已经去掉了,而且这个上升沿中断不是100%的出现,并且这个上升沿出现中断时,中断脚的电平值有时为0有时为1,这让我很很头痛
    回复 点赞

    使用道具 举报

    3

    主题

    7

    帖子

    64

    积分

    注册会员

    Rank: 2

    积分
    64
    发表于 2017-3-1 15:50:16
    不知道lz有没有发现贴出来的程序中好像有点错误。。。GPX3(0)的时候ret = gpio_request(EXYNOS4_GPX3(2), "EINT26");
    回复 点赞

    使用道具 举报

    返回列表
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    登录或注册

    官方客服

    QQ:2551456065

    官方QQ群

    195631883

    扫一扫关注迅为公众号

    群号652692981

     
    快速回复 返回顶部 返回列表