查看: 3989|回复: 1

[分享] KL27 PORTC/D中断进入问题

[复制链接]
  • TA的每日心情
    慵懒
    2020-4-22 08:25
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    3

    主题

    5

    帖子

    0

    注册会员

    Rank: 2

    积分
    166
    最后登录
    2021-9-15
    发表于 2020-4-21 16:56:38 | 显示全部楼层 |阅读模式
    公司最近用KL27的芯片做一个项目,发现使用官方套件里面提供的底层驱动代码时,外部中断引脚使用PTC/PTD时,进不去中断处理函数。下面给出问题所在:主要问题存在于gpio.c这个文件下的GPIO_ITDMAConfig函数下面
      下面是这个函数的具体实现:
    1. void GPIO_ITDMAConfig(uint32_t instance, uint8_t pinIndex, GPIO_ITDMAConfig_Type config, bool status)
    2. {
    3.     IP_CLK_ENABLE(instance);
    4.     PORT_InstanceTable[instance]->PCR[pinIndex] &= ~PORT_PCR_IRQC_MASK;
    5.    
    6.     if(!status)
    7.     {
    8.         NVIC_DisableIRQ(GPIO_IRQnTable[instance]);
    9.         return;
    10.     }
    11.    
    12.     switch(config)
    13.     {
    14.         case kGPIO_DMA_RisingEdge:
    15.             PORT_InstanceTable[instance]->PCR[pinIndex] |= PORT_PCR_IRQC(1);
    16.             break;
    17.         case kGPIO_DMA_FallingEdge:
    18.             PORT_InstanceTable[instance]->PCR[pinIndex] |= PORT_PCR_IRQC(2);
    19.             break;
    20.         case kGPIO_DMA_RisingFallingEdge:
    21.             PORT_InstanceTable[instance]->PCR[pinIndex] |= PORT_PCR_IRQC(3);
    22.             break;
    23.         case kGPIO_IT_Low:
    24.             PORT_InstanceTable[instance]->PCR[pinIndex] |= PORT_PCR_IRQC(8);
    25. <font color="#ff0000">            NVIC_EnableIRQ(GPIO_IRQnTable[instance]);</font>
    26.             break;
    27.         case kGPIO_IT_RisingEdge:
    28.             PORT_InstanceTable[instance]->PCR[pinIndex] |= PORT_PCR_IRQC(9);
    29. <font color="#ff0000">            NVIC_EnableIRQ(GPIO_IRQnTable[instance]);</font>
    30.             break;
    31.         case kGPIO_IT_FallingEdge:
    32.             PORT_InstanceTable[instance]->PCR[pinIndex] |= PORT_PCR_IRQC(10);
    33. <font color="#ff0000">            NVIC_EnableIRQ(GPIO_IRQnTable[instance]);</font>
    34.             break;
    35.         case kGPIO_IT_RisingFallingEdge:
    36.             PORT_InstanceTable[instance]->PCR[pinIndex] |= PORT_PCR_IRQC(11);
    37. <font color="#ff0000">            NVIC_EnableIRQ(GPIO_IRQnTable[instance]);</font>
    38.             break;
    39.         case kGPIO_IT_High:
    40.             PORT_InstanceTable[instance]->PCR[pinIndex] |= PORT_PCR_IRQC(12);
    41. <font color="#ff0000">            NVIC_EnableIRQ(GPIO_IRQnTable[instance]);</font>
    42.             break;
    43.         default:
    44.             break;
    45.     }
    复制代码
    NVIC_EnableIRQ(GPIO_IRQnTable[instance]);中,我们传参是GPIO_IRQnTable[instance]这个数组中的某一个元素。看一下GPIO_IRQnTable[]这个数组中的值:
    static const IRQn_Type GPIO_IRQnTable[] =
    {
        (IRQn_Type)(PORTA_IRQn+0),  //30
        (IRQn_Type)(PORTA_IRQn+1),  //31
        (IRQn_Type)(PORTA_IRQn+2),  //32
        (IRQn_Type)(PORTA_IRQn+3),  //33
        (IRQn_Type)(PORTA_IRQn+4),  //34
    };
    由于在MKL27Z4.h中定义了中断号,查表可知PORTA_IRQn=30,PORTCD_IRQn=31
    当我们调用函数GPIO_ITDMAConfig(HW_GPIOC,4,kGPIO_IT_FallingEdge,true);此时instance=HW_GPIOC=2。
    所以此时中断使能NVIC_EnableIRQ(32);根本没有定义此个中断号,然而实际PORTCD_IRQn=31。
    由于KL27支持PORTA,PORTC,PORTD三个外部中断,切PORTC,PORTD共用同一个中断号,所以修改GPIO_IRQnTable[] 即可
    修改如下:
    static const IRQn_Type GPIO_IRQnTable[] =
    {
        (IRQn_Type)(PORTA_IRQn+0),
        (IRQn_Type)(PORTA_IRQn+0),
        (IRQn_Type)(PORTA_IRQn+1),
        (IRQn_Type)(PORTA_IRQn+1),
        (IRQn_Type)(PORTA_IRQn+3),
    };







    该会员没有填写今日想说内容.
    回复

    使用道具 举报

    该用户从未签到

    715

    主题

    6374

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    25129
    最后登录
    2025-8-8
    发表于 2020-4-22 14:31:53 | 显示全部楼层
    感谢分享
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-8-9 14:07 , Processed in 0.079003 second(s), 20 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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