中断不触发
Interrupts do not fire
问题将很快被删除。犯了一个愚蠢的错误,这些 IRQ 应该由按钮触发。我的意思是问他们为什么不自己开火。
未触发中断处理程序。这是一本书的代码
大多数情况下。电路板基于:stm32f411RE Nucleo。
该代码适用于 f429,但根据我的研究,它看起来应该是
很好。
编辑:
添加此行会触发它,但只会触发一次:
EXTI->SWIER = EXTI_SWIER_SWIER0|EXTI_SWIER_SWIER2;
所以我需要以某种方式为此重置一个标志。
但是为什么原来的硬件中断没有触发。
int main(void)
{
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN | RCC_AHB1ENR_GPIOBEN;
RCC->APB2ENR = RCC_APB2ENR_SYSCFGEN;
__DSB();
GPIOA->MODER |= GPIO_MODER_MODE5_0;
GPIOB->PUPDR |= GPIO_PUPDR_PUPD2_0;
SYSCFG->EXTICR[0] = SYSCFG_EXTICR1_EXTI0_PB | SYSCFG_EXTICR1_EXTI2_PB ;
EXTI->FTSR = EXTI_FTSR_TR2;
EXTI->RTSR = EXTI_RTSR_TR0;
EXTI->IMR = EXTI_IMR_MR0 | EXTI_IMR_MR2;
NVIC_EnableIRQ(EXTI0_IRQn);
NVIC_EnableIRQ(EXTI2_IRQn);
while (1);
}
/* main */
void EXTI0_IRQHandler(void)
{
if ( EXTI->PR & EXTI_PR_PR0)
{
EXTI->PR = EXTI_PR_PR0;
GPIOA->ODR ^= GPIO_ODR_OD5; }
}
void EXTI2_IRQHandler(void)
{
if ( EXTI->PR & EXTI_PR_PR2)
{
EXTI->PR = EXTI_PR_PR2;
GPIOA->ODR ^= GPIO_ODR_OD5;
}
}
您还必须清除 NVIC 中挂起的 IRQ,例如
NVIC_ClearPendingIRQ(EXTI0_IRQn);
此外,您需要确保中断向量 table 具有适合您的处理程序的正确条目。通常中断向量table在启动文件中,但这取决于你的系统。
问题将很快被删除。犯了一个愚蠢的错误,这些 IRQ 应该由按钮触发。我的意思是问他们为什么不自己开火。
未触发中断处理程序。这是一本书的代码 大多数情况下。电路板基于:stm32f411RE Nucleo。
该代码适用于 f429,但根据我的研究,它看起来应该是 很好。
编辑: 添加此行会触发它,但只会触发一次:
EXTI->SWIER = EXTI_SWIER_SWIER0|EXTI_SWIER_SWIER2;
所以我需要以某种方式为此重置一个标志。 但是为什么原来的硬件中断没有触发。
int main(void)
{
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN | RCC_AHB1ENR_GPIOBEN;
RCC->APB2ENR = RCC_APB2ENR_SYSCFGEN;
__DSB();
GPIOA->MODER |= GPIO_MODER_MODE5_0;
GPIOB->PUPDR |= GPIO_PUPDR_PUPD2_0;
SYSCFG->EXTICR[0] = SYSCFG_EXTICR1_EXTI0_PB | SYSCFG_EXTICR1_EXTI2_PB ;
EXTI->FTSR = EXTI_FTSR_TR2;
EXTI->RTSR = EXTI_RTSR_TR0;
EXTI->IMR = EXTI_IMR_MR0 | EXTI_IMR_MR2;
NVIC_EnableIRQ(EXTI0_IRQn);
NVIC_EnableIRQ(EXTI2_IRQn);
while (1);
}
/* main */
void EXTI0_IRQHandler(void)
{
if ( EXTI->PR & EXTI_PR_PR0)
{
EXTI->PR = EXTI_PR_PR0;
GPIOA->ODR ^= GPIO_ODR_OD5; }
}
void EXTI2_IRQHandler(void)
{
if ( EXTI->PR & EXTI_PR_PR2)
{
EXTI->PR = EXTI_PR_PR2;
GPIOA->ODR ^= GPIO_ODR_OD5;
}
}
您还必须清除 NVIC 中挂起的 IRQ,例如
NVIC_ClearPendingIRQ(EXTI0_IRQn);
此外,您需要确保中断向量 table 具有适合您的处理程序的正确条目。通常中断向量table在启动文件中,但这取决于你的系统。