查看: 8346|回复: 9

[MQX] 在MQX 4.0中,多个GPIO脚中断问题(已解决)

[复制链接]

该用户从未签到

3

主题

17

帖子

0

新手上路

Rank: 1

积分
26
最后登录
1970-1-1
发表于 2014-6-17 20:24:15 | 显示全部楼层 |阅读模式
我使用的GPIO_PORT_E的二个GPIO(GPIO_PIN4, GPIO_PIN28)引脚作为中断输入引脚,对于同一个GPIO_PORT的不同引脚的中断,中断函数好象只有一个,在中断函数中通过查询ISFR寄存器的值,确认是哪个GPIO脚中断,执行相应的代码。
在下例代码中,单独使用GPIO_PIN4或GPIO_PIN28作为中断引脚时,都会进入中断函数,但是同时配置二个中断引脚时,却不会产生中断,不知道在MQX中,如何正确配置,希望指点一下。
/* 中断响应函数 */
void int_service_routine(void *pin)
{

PORT_MemMapPtr pctl;
pctl = (PORT_MemMapPtr)PORTE_BASE_PTR;

if(pctl->ISFR & (1ISFR & (1
我知道答案 目前已有9人回答
回复

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2014-6-18 09:06:09 | 显示全部楼层

RE:在MQX 4.0中,多个GPIO脚中断问题

楼主用的是什么芯片,请给出芯片全称,另外你的例程是官方的吗?
如果是,请告诉我们你用的是哪个,便于我们验证。
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

17

帖子

0

新手上路

Rank: 1

积分
26
最后登录
1970-1-1
 楼主| 发表于 2014-6-18 09:51:33 | 显示全部楼层

回复:在MQX 4.0中,多个GPIO脚中断问题

我用的芯片型号是MK60FN1M0VLQ15,在程序中,我参考的例程是  Freescale\Freescale_MQX_4_0\mqx\examples\gpio,在网上发现这个帖子http://ask.ttwait.com/que/20673637 (Configure interrupt handler for different GPIO pins of same port ),和我使用的情况是一样的,在同一PORT中单独使用一个GPIO脚时OK,但使用多个时,就会出问题。
回复 支持 反对

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2014-6-18 11:02:50 | 显示全部楼层

回复:在MQX 4.0中,多个GPIO脚中断问题

回复第 3 楼 于2014-06-18 09:51:33发表:
我用的芯片型号是MK60FN1M0VLQ15,在程序中,我参考的例程是 Freescale\Freescale_MQX_4_0\mqx\examples\gpio,在网上发现这个帖子http://ask.ttwait.com/que/20673637 (Configure interrupt handler for different GPIO pins of same port ),和我使用的情况是一样的,在同一PORT中单独使用一个GPIO脚时OK,但使用多个时,就会出问题。
 

 
从PORT口的原理上讲不会出现这样的冲突,裸板中也是可以的。
这样吧,我把你的题转给我们的MQX工程师看看,是不是代码其他地方还要设置。
请稍等。
回复 支持 反对

使用道具 举报

该用户从未签到

7

主题

196

帖子

0

中级会员

Rank: 3Rank: 3

积分
380
最后登录
1970-1-1
发表于 2014-6-18 14:52:31 | 显示全部楼层

回复:在MQX 4.0中,多个GPIO脚中断问题

MQX lwgpio driver是基于pin的,建议你检查下终端是否使能。检查lwgpio_int_enable,对每个pin分别使用。  
回复 支持 反对

使用道具 举报

该用户从未签到

7

主题

196

帖子

0

中级会员

Rank: 3Rank: 3

积分
380
最后登录
1970-1-1
发表于 2014-6-18 14:58:58 | 显示全部楼层

RE:在MQX 4.0中,多个GPIO脚中断问题

typedef struct {
    uint8_t  port_idx;
    uint8_t  pinmask; /* since struct holds one pin, pinmask will have only one bit set */
    uint32_t flags;
} LWGPIO_STRUCT, * LWGPIO_STRUCT_PTR
这个结构是基于pin的
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

17

帖子

0

新手上路

Rank: 1

积分
26
最后登录
1970-1-1
 楼主| 发表于 2014-6-19 08:57:50 | 显示全部楼层

回复:在MQX 4.0中,多个GPIO脚中断问题

这个问题已解决,感谢freescale的梁工
void int_service_routine(void *buttons)
{
    LWGPIO_STRUCT_PTR  *btn_array = (LWGPIO_STRUCT_PTR  *)buttons;
    LWGPIO_STRUCT_PTR  btn = NULL;

     btn = btn_array[0];
    if(lwgpio_int_get_flag(btn))
    {
        //printf("GPIO_PIN4 Interrupt.\n");
        lwgpio_int_clear_flag((LWGPIO_STRUCT_PTR) btn);
    }
    btn = btn_array[1];
    if(lwgpio_int_get_flag(btn))
    {
        //printf("GPIO_PIN28 Interrupt.\n");
        lwgpio_int_clear_flag((LWGPIO_STRUCT_PTR) btn);
    }

}


void main_task
    (
        uint32_t initial_data
    )
{
    /* Structures holding information about specific pin */
LWGPIO_STRUCT btn1,btn2;

    /* opening pins for input */
    if (!lwgpio_init(&btn1, BSP_BUTTON1, LWGPIO_DIR_INPUT, LWGPIO_VALUE_NOCHANGE))
    {
        printf("Initializing button GPIO as input failed.\n");
        _task_block();
    }

    /* Some platforms require to setup MUX to IRQ functionality,
    for the rest just set MUXto GPIO functionality */
    lwgpio_set_functionality(&btn1, BSP_BUTTON1_MUX_IRQ);

    lwgpio_set_attribute(&btn1, LWGPIO_ATTR_PULL_UP, LWGPIO_AVAL_ENABLE);

    /* enable gpio functionality for given pin, react on falling edge */
    if (!lwgpio_int_init(&btn1, LWGPIO_INT_MODE_FALLING))
    {
        printf("Initializing button GPIO for interrupt failed.\n");
        _task_block();
    }

    /* opening pins for input */
    if (!lwgpio_init(&btn2, BSP_BUTTON2, LWGPIO_DIR_INPUT, LWGPIO_VALUE_NOCHANGE))
    {
        printf("Initializing button GPIO as input failed.\n");
        _task_block();
    }
   
    /* Some platforms require to setup MUX to IRQ functionality,
    for the rest just set MUXto GPIO functionality */
    lwgpio_set_functionality(&btn2, 1);
    lwgpio_set_attribute(&btn2, LWGPIO_ATTR_PULL_UP, LWGPIO_AVAL_ENABLE);

    /* enable gpio functionality for given pin, react on falling edge */
    if (!lwgpio_int_init(&btn2, LWGPIO_INT_MODE_FALLING))
    {
        printf("Initializing button GPIO for interrupt failed.\n");
        _task_block();
    }

    /* install gpio interrupt service routine */
    //_int_install_isr(lwgpio_int_get_vector(&btn2), int_service_routine, (void *) &btn2);
    /* set the interrupt level, and unmask the interrupt in interrupt controller */
    //_bsp_int_init(lwgpio_int_get_vector(&btn2), 3, 0, TRUE);
    /* enable interrupt on GPIO peripheral module */
    lwgpio_int_enable(&btn2, TRUE);

    btn_array[0] = &btn1;
    btn_array[1] = &btn2;
   
    /* install gpio interrupt service routine */
    _int_install_isr(lwgpio_int_get_vector(&btn1), int_service_routine, (void *) btn_array);
    /* set the interrupt level, and unmask the interrupt in interrupt controller */
    _bsp_int_init(lwgpio_int_get_vector(&btn1), 3, 0, TRUE);
    /* enable interrupt on GPIO peripheral module */
    lwgpio_int_enable(&btn1, TRUE);

}
回复 支持 反对

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2014-6-19 09:20:55 | 显示全部楼层

RE:在MQX 4.0中,多个GPIO脚中断问题

楼主以后如果问题解决了,还请帮我们结贴,在问题标题的结尾加上(已解决),这样方便我们查看未结帖。
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

1

帖子

0

新手上路

Rank: 1

积分
8
最后登录
2017-3-12
发表于 2017-3-9 19:58:07 | 显示全部楼层
我为什么用上面的不可以啊
回复 支持 反对

使用道具 举报

  • TA的每日心情
    奋斗
    2020-12-31 08:09
  • 签到天数: 438 天

    连续签到: 1 天

    [LV.9]以坛为家II

    9

    主题

    510

    帖子

    1

    金牌会员

    Rank: 6Rank: 6

    积分
    1673
    最后登录
    2020-12-31
    发表于 2018-11-26 18:35:14 | 显示全部楼层
    学习中
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-21 21:36 , Processed in 0.255283 second(s), 30 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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