0 资料
ARM® Generic Interrupt Controller Architecture version 2.0 Architecture Specification
1 边沿触发和电平触发中断的区别
1.1 边沿触发和电平触发中断官方解释
边沿触发(Edge-triggered)
This is an interrupt that is asserted on detection of a rising edge of
an interrupt signal and then, regardless of the state of the signal,
remains asserted until it is cleared by the conditions defined by this
specification.
当检测到中断上升沿信号时会保持asserted状态(挂起状态),无论此后该中断信号如何变化都会保持asserted状态(挂起状态),直到按照GIC指定的操作将中断清除。
电平触发(Level-sensitive)
This is an interrupt that is asserted whenever the interrupt signal level is active, and deasserted whenever the level is not active.
当中断信号处于有效状态时中断处于asserted状态(挂起状态),当该信号处于无效状态(例如清空中断标志)则该中断会变为未激活状态。
asserted状态参考如下:
1.2 边沿触发和电平触发中断实验
1.2.1 中断配置为边沿触发
按照官方的解释来看,GIC配置为边沿触发,在触发了中断后会就会设置中断挂起位,即使后面人为清除中断标志中断仍然挂起。操作步骤如下:
(1)配置中断为边沿触发
(2)测试程序
void irq_test(void)
{
__disable_irq();
SET_BIT(EXTI->SWIER1, 1);
__DMB();
imx_printf("Get exti0 pend 1 : %d\r\n", IRQ_GetPending(EXTI0_IRQn));
if (__HAL_GPIO_EXTI_GET_RISING_IT(GPIO_PIN_0) != 0x00U)
{
__HAL_GPIO_EXTI_CLEAR_RISING_IT(GPIO_PIN_0);
}
HAL_Delay(1000);
imx_printf("Get exti0 pend 2 : %d\r\n", IRQ_GetPending(EXTI0_IRQn));
__enable_irq();
}
测试程序非常简单,在软件触发外部中断后再人为清空中断标志,查看清空中断前后中断挂起位变化。
(3)测试结果
可以看到在清空中断标志前后中断均为挂起状态,和官方解释一致。
1.2.2 中断配置为电平触发
按照官方的解释来看,GIC配置为电平触发,在触发了中断后会就会设置中断挂起位,如果后面人为清除中断标志中断则会变为未激活状态。操作步骤如下:
(1)配置中断为电平触发
(2)测试程序
void irq_test(void)
{
__disable_irq();
SET_BIT(EXTI->SWIER1, 1);
__DMB();
imx_printf("Get exti0 pend 1 : %d\r\n", IRQ_GetPending(EXTI0_IRQn));
if (__HAL_GPIO_EXTI_GET_RISING_IT(GPIO_PIN_0) != 0x00U)
{
__HAL_GPIO_EXTI_CLEAR_RISING_IT(GPIO_PIN_0);
}
HAL_Delay(1000);
imx_printf("Get exti0 pend 2 : %d\r\n", IRQ_GetPending(EXTI0_IRQn));
__enable_irq();
}
测试程序非常简单,在软件触发外部中断后再人为清空中断标志,查看清空中断前后中断挂起位变化。
(3)测试结果
可以看到在清空中断标志前中断为挂起状态,清空后为非挂起状态(未激活状态),和官方解释一致。