在线时间12 小时
UID3415316
注册时间2020-4-7
NXP金币0
TA的每日心情 | 慵懒 2020-4-22 08:25 |
---|
签到天数: 1 天 连续签到: 1 天 [LV.1]初来乍到
注册会员

- 积分
- 166
- 最后登录
- 2021-9-15
|
公司最近用KL27的芯片做一个项目,发现使用官方套件里面提供的底层驱动代码时,外部中断引脚使用PTC/PTD时,进不去中断处理函数。下面给出问题所在:主要问题存在于gpio.c这个文件下的GPIO_ITDMAConfig函数下面
下面是这个函数的具体实现:
- void GPIO_ITDMAConfig(uint32_t instance, uint8_t pinIndex, GPIO_ITDMAConfig_Type config, bool status)
- {
- IP_CLK_ENABLE(instance);
- PORT_InstanceTable[instance]->PCR[pinIndex] &= ~PORT_PCR_IRQC_MASK;
-
- if(!status)
- {
- NVIC_DisableIRQ(GPIO_IRQnTable[instance]);
- return;
- }
-
- switch(config)
- {
- case kGPIO_DMA_RisingEdge:
- PORT_InstanceTable[instance]->PCR[pinIndex] |= PORT_PCR_IRQC(1);
- break;
- case kGPIO_DMA_FallingEdge:
- PORT_InstanceTable[instance]->PCR[pinIndex] |= PORT_PCR_IRQC(2);
- break;
- case kGPIO_DMA_RisingFallingEdge:
- PORT_InstanceTable[instance]->PCR[pinIndex] |= PORT_PCR_IRQC(3);
- break;
- case kGPIO_IT_Low:
- PORT_InstanceTable[instance]->PCR[pinIndex] |= PORT_PCR_IRQC(8);
- <font color="#ff0000"> NVIC_EnableIRQ(GPIO_IRQnTable[instance]);</font>
- break;
- case kGPIO_IT_RisingEdge:
- PORT_InstanceTable[instance]->PCR[pinIndex] |= PORT_PCR_IRQC(9);
- <font color="#ff0000"> NVIC_EnableIRQ(GPIO_IRQnTable[instance]);</font>
- break;
- case kGPIO_IT_FallingEdge:
- PORT_InstanceTable[instance]->PCR[pinIndex] |= PORT_PCR_IRQC(10);
- <font color="#ff0000"> NVIC_EnableIRQ(GPIO_IRQnTable[instance]);</font>
- break;
- case kGPIO_IT_RisingFallingEdge:
- PORT_InstanceTable[instance]->PCR[pinIndex] |= PORT_PCR_IRQC(11);
- <font color="#ff0000"> NVIC_EnableIRQ(GPIO_IRQnTable[instance]);</font>
- break;
- case kGPIO_IT_High:
- PORT_InstanceTable[instance]->PCR[pinIndex] |= PORT_PCR_IRQC(12);
- <font color="#ff0000"> NVIC_EnableIRQ(GPIO_IRQnTable[instance]);</font>
- break;
- default:
- break;
- }
复制代码 在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),
};
|
|