搜索
bottom↓
回复: 14

FRDM-KL25Z外部中断无法进入(已解决)

[复制链接]

出0入0汤圆

发表于 2014-3-13 21:54:44 | 显示全部楼层 |阅读模式
本帖最后由 FSL_TICS_ZP 于 2014-4-1 09:30 编辑

准备使用MMA8451Q的Motion中断INT1(跟KL25Z PTA14引脚相连)来通知CPU状态,但是在配置PTA14引脚的中断时,中断函数一直进不去。

贴代码:

/**
  * @brief: init MMA8451 INT1 interrupt pin
  * @note:  PTA14
  *         PULL UP
  *         Interrupt on falling edge
  *
  */
void    init_PTA14_interrupt(void)
{
    // PTA14 -- MMA8451 INT1
    // ALT1
    /* PORTA_PCR14: ISF=0, MUX=1, IQRC=0x0A(1010), PE=1, PS=1 */
    PORTA_PCR14 = (uint32_t)((PORTA_PCR14 & (uint32_t)~(uint32_t)(PORT_PCR_ISF_MASK | PORT_PCR_MUX(0x06) | PORT_PCR_IRQC_MASK)) |
                                (uint32_t)(PORT_PCR_MUX(0x01)) |
                                (uint32_t)PORT_PCR_IRQC(0x0A) |
                                PORT_PCR_PS_MASK |
                                PORT_PCR_PE_MASK
                                );

    APP_TRACE("PORTA_PCR14 = 0x%.8X\r\n", PORTA_PCR14);
    //PORTA_PCR14 = 0x010A0103;

    _int_install_isr(LDD_ivIndex_INT_PORTA, MMA8451_INT1_isr_service, NULL);
    // ENABLE PTA14 Falling interrupt
    enable_irq(30);
    set_irq_priority(30, 2);
}





static void MMA8451_INT1_isr_service(void* p_arg)
{
    byte            Data;
    LDD_TError      ret;

    TRACE("MMA8451_INT1_isr_service\r\n");

    // PTA14
    if (PORTA_ISFR & ((uint32_t)(1<<14)))
    {
        // writte 1 to the flag to clear the interrupt flag
        PORTA_ISFR = (uint32_t)(1<<14);

        // Determine source of interrupt by reading the system interrupt
        ret = ReadAccRegs(g_I2C_DeviceData,
                          &g_DataState,
                          INT_SOURCE_REG,
                          ACC_REG_SIZE,
                          &Data);
        if (ret)
        {
            // Set up Case statement here to service all of the possible interrupts
            if ((Data &0x04)==0x04)
            {
                //Perform an Action since Motion Flag has been set
                //Read the Motion/Freefall Function to clear the interrupt
                ret = ReadAccRegs(g_I2C_DeviceData,
                                  &g_DataState,
                                  FF_MT_SRC_REG,
                                  ACC_REG_SIZE,
                                  &Data);

                // post a message to the app task
                _lwsem_post(&g_mma8451_int_sem);
            }
        }
    }
}



出0入0汤圆

 楼主| 发表于 2014-3-14 08:52:59 | 显示全部楼层
谁有KL25Z外部中断调试通过的例程,发上来给我参考下也行。我的可能是什么地方配置不正确

出0入0汤圆

发表于 2014-3-14 10:04:44 | 显示全部楼层
bruce_helen 发表于 2014-3-14 08:52
谁有KL25Z外部中断调试通过的例程,发上来给我参考下也行。我的可能是什么地方配置不正确 ...

如果你调试时能进入中断的话,很有可能说明你的中断Vetor配置错啊,如果什么都没进入说明你配置中断使能就很有可能出错啊!!

出0入0汤圆

发表于 2014-3-14 10:07:50 | 显示全部楼层
FRDM-KL25板的例程包中low_power_demo例程就有引脚的中断,你可以参考一下!!
http://www.amobbs.com/thread-5557117-1-1.html

出0入0汤圆

发表于 2014-3-14 15:23:31 | 显示全部楼层
bruce_helen 发表于 2014-3-14 08:52
谁有KL25Z外部中断调试通过的例程,发上来给我参考下也行。我的可能是什么地方配置不正确 ...

建议楼主先随便找个引脚测试外部中断,等功能实现了再结合MMA8451Q的中断引脚修改一下程序。

出0入0汤圆

 楼主| 发表于 2014-3-14 20:17:56 | 显示全部楼层
FSL_TICS_ZP 发表于 2014-3-14 10:07
FRDM-KL25板的例程包中low_power_demo例程就有引脚的中断,你可以参考一下!!
http://www.amobbs.com/thre ...

没看到外部引脚中断啊,都是定时器唤醒CPU

出0入0汤圆

 楼主| 发表于 2014-3-14 20:18:57 | 显示全部楼层
FSL_TICS_Robin 发表于 2014-3-14 15:23
建议楼主先随便找个引脚测试外部中断,等功能实现了再结合MMA8451Q的中断引脚修改一下程序。 ...

是的,换成了其他I/O口,一样不行,你看看上面配置外部中断的代码有没有问题呢?

出0入0汤圆

 楼主| 发表于 2014-3-15 07:28:29 | 显示全部楼层
FSL_TICS_ZP 发表于 2014-3-14 10:04
如果你调试时能进入中断的话,很有可能说明你的中断Vetor配置错啊,如果什么都没进入说明你配置中断使能 ...

没有进入中断,GPIO_PCR寄存器帮我对一对啊,我怀疑是寄存器配置问题。

我只配置了PCR寄存器,另外还打开了SIM对于的GPIO模块。是不是还有其他寄存器需要配置?

PCR寄存器配置

本帖子中包含更多资源

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

x

出0入0汤圆

 楼主| 发表于 2014-3-15 09:06:55 | 显示全部楼层
问题解决,参考:
http://www.amobbs.com/forum.php? ... p;extra=#pid7385050

出0入0汤圆

发表于 2014-3-17 10:06:12 | 显示全部楼层
bruce_helen 发表于 2014-3-15 07:28
没有进入中断,GPIO_PCR寄存器帮我对一对啊,我怀疑是寄存器配置问题。

我只配置了PCR寄存器,另外还打 ...

下周五下午我没在,抱歉,楼主你不能把你只做一个外部引脚中断例程的代码工程上传上来,我可以帮你看看配置是否有问题,你看这样行不行??

出0入0汤圆

发表于 2014-3-19 17:48:45 | 显示全部楼层
我来贴一个吧,借用超核大侠的代码 (说明:如下代码是基于KEIL MDK下最新的KL25头文件,并且使用KEIL MDK编译)
//外部中断触发方式定义
#define EXTI_IRQ_DISABLE   (0)   //禁止外部中断
#define EXTI_IRQ_DMA_RE    (1)   //DMA上升沿触发
#define EXTI_IRQ_DMA_FE    (2)   //DMA下降沿触发
#define EXTI_IRQ_DNA_EE    (3)   //DMA上升或下降沿触发
#define EXTI_IRQ_LZ        (8)   //逻辑0状态触发,低电平触发
#define EXTI_IRQ_RE        (9)   //上升沿触发
#define EXTI_IRQ_FE        (10)  //下降沿触发
#define EXTI_IRQ_EE        (11)  //上升或下降沿触发
#define EXTI_IRQ_LO        (12)  //逻辑1触发,高电平触发

// 外部中断初始化,KL25只有PORTA和PORTD支持外部中断
void EXTI_Init(GPIO_Type *port, unsigned char index, unsigned char irqc)
{
  PORT_Type *p ;
        switch((uint32_t)port)
         {
          case PTA_BASE:p=PORTA;SIM->SCGC5|=SIM_SCGC5_PORTA_MASK;NVIC_EnableIRQ(PORTA_IRQn);break;  // 开启PORTA口使能时钟,开启内核接受中断,函数来自core_cm0plus.h
          case PTD_BASE:p=PORTD;SIM->SCGC5|=SIM_SCGC5_PORTD_MASK;NVIC_EnableIRQ(PORTD_IRQn);break;        // 开启PORTD口使能时钟
          default : break;
         }         
        p->PCR[index] |=(PORT_PCR_PS_MASK);   // 配置为内部上拉电阻
        p->PCR[index] |=PORT_PCR_PE_MASK;     // 使能上拉  
        p->PCR[index] &=~PORT_PCR_MUX_MASK;   // 配置为GPIO功能  
        p->PCR[index] |=PORT_PCR_MUX(1);        
        port->PDDR &=~(1<<index);            // 配置对应引脚为输入状态
        p->PCR[index] |=PORT_PCR_IRQC(irqc); // 外部中断触发设置
}

// 外部中断函数引用示例
        EXTI_Init(PTA,1,EXTI_IRQ_FE); // PTA1设置为外部中断,采用下降沿触发
        EXTI_Init(PTD,3,EXTI_IRQ_FE); // PTD3设置为外部中断,采用下降沿触发

// 可以设置优先级, 0为最高优先级
        NVIC_SetPriority(PORTD_IRQn, 0);
        NVIC_SetPriority(PORTA_IRQn, 1);

// 中断服务函数示例
////////////////////////////////////////////
//函数名:PORTA_IRQHandler
//功  能:PORTA 外部中断服务
void PORTA_IRQHandler(void)
{
  unsigned char i=31;
        for(i=31;i>0;i--)  //判断哪个引脚的中断发生,i表示哪个引脚发生的中断[0-31]
        {
          if((PORTA->ISFR>>i)==1)break;
        }
        PORTA->PCR[i] |= PORT_PCR_ISF_MASK;     // 清除标志位
        switch(i)
        { //中断处理
          case 0:/* Add your code here*/;break;
          case 1:/* Add your code here*/;break;
    case 2:/* Add your code here*/;break;               
    // ...
    case 31:/* Add your code here */;break;               
          default : break;
        }
}

希望能够帮到您。

出0入0汤圆

 楼主| 发表于 2014-3-19 18:38:15 | 显示全部楼层
FSL_TICS_ZP 发表于 2014-3-17 10:06
下周五下午我没在,抱歉,楼主你不能把你只做一个外部引脚中断例程的代码工程上传上来,我可以帮你看看配 ...

问题解决了,和之前帖子是同一个问题。
是这个函数的没有执行成功。我当时没判断返回值。后面发现在MQX1.h头文件的配置有问题。
_int_install_isr(LDD_ivIndex_INT_PORTA, MMA8451_INT1_isr_service, NULL);

出0入0汤圆

发表于 2014-3-21 09:19:20 | 显示全部楼层
bruce_helen 发表于 2014-3-19 18:38
问题解决了,和之前帖子是同一个问题。
是这个函数的没有执行成功。我当时没判断返回值。后面发现在MQX1. ...

恭喜楼主问题解决,还有一个小建议,以后如果涉及MQX的问题,请在标题处讲到,这样的话,MQX的工程师可以直接回答你啊!!谢谢理解!

出0入0汤圆

 楼主| 发表于 2014-3-21 09:48:50 | 显示全部楼层
FSL_TICS_ZP 发表于 2014-3-21 09:19
恭喜楼主问题解决,还有一个小建议,以后如果涉及MQX的问题,请在标题处讲到,这样的话,MQX的工程师可以 ...


好的,没问题!
飞思卡尔的技术支持做的不错!

出0入0汤圆

发表于 2014-3-21 09:57:28 | 显示全部楼层
bruce_helen 发表于 2014-3-21 09:48
好的,没问题!
飞思卡尔的技术支持做的不错!

谢谢你的鼓励还有感谢你使用飞思卡尔产品,
很高兴收到你对我们工作的认可!!以后有问题,在交流!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-4 03:01

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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