STM32 GPIO使用IDR寄存器中断


/* Configure EXTI interupt PB4 */
SYSCFG->EXTICR[0] &= ~SYSCFG_EXTICR2_EXTI4_PB; 
EXTI->IMR |= EXTI_IMR_IM4;                                                                          //Interrupt Mask on line 2  */
EXTI->RTSR |= EXTI_RTSR_RT4;                                                                        
EXTI->FTSR |= EXTI_FTSR_FT4;                                                                        
NVIC_EnableIRQ(EXTI4_15_IRQn);                                                                          //Załączenie przerwania na pinie zasilania
NVIC_SetPriority(EXTI4_15_IRQn,1); 

这就是我配置EXTI的方式

GPIOB->MODER =      (0U << GPIO_MODER_MODE4_Pos);
GPIOB->PUPDR =      (1U << GPIO_PUPDR_PUPD4_Pos);

这就是我管理别针的方法

while(1)
{
if(state == 0){
ServoToggle(0, 100, 255);
delay(1000);
} else {
ServoToggle(0, 115, 255);
delay(1000);
ServoToggle(0, 60, 255);
delay(1000);
}
delay(1);
}

这是我的程序在起立后所做的

void EXTI4_15_IRQHandler(void)
{
if(!(GPIOB->IDR & GPIO_IDR_ID4)){
state = 0;
} else {
state = 1;
} 
EXTI->PR = EXTI_PR_PR4;
}

这就是我试图处理中断的方式

这个东西不起作用。我知道为什么,但对于PA0来说,它就像一个魅力,但更改为PB4会停止弹出中断事件。

我有一个连接到引脚的按钮,可以在按下时更改IDR寄存器。

我错过了什么?

我使用的是STM32L052系列

对于PA0,我认为它必须使用以下行:

SYSCFG->EXTICR[0] &= ~SYSCFG_EXTICR2_EXTI4_PB;

根据参考手册,PB[x](其中x为4(被映射到SYSCFG_EXTICR2的位0-3。所以在你的情况下应该是:

SYSCFG->EXTICR[2] &= ~SYSCFG_EXTICR2_EXTI4;
SYSCFG->EXTICR[2] |= SYSCFG_EXTICR2_EXTI4_PB;

PA0被映射到SYSCFG->EXTICR[0]。SYSCFG->EXTICR[0] &= ~SYSCFG_EXTICR2_EXTI4_PB;表示ANDSYSCFG->EXTICR[0]的内容与SYSCFG_EXTICR2_EXTI4_PB的倒数其为0xFE。假设SYSCFG->EXTICR[0]都是零,那么你本质上只是AND的一堆零,因此PA0起作用。

我注意到的另一件事是,在您的中断处理程序中,我会检查外部中断处理程序标志,而不是GPIO IDR寄存器,以检查按钮是否被按下。根据我对这个问题的理解,您想要按下按钮来切换变量state。按下按钮会触发中断,所以你无论如何都会通过检查IDR寄存器来达到目的。在EXTI中断处理程序中,您可以通过挂起寄存器/PR检查它是否是正确的中断。其他EXTI中断看起来共享相同的处理程序,因此您希望使用EXTR->PR寄存器来检查正确的挂起位。

以下是我的一些STM32F407代码作为示例:

#define PORTD_ALL 0x0000F000
void EXTI0_IRQHandler(void){
// Check for EXTI 0 flag
if((EXTI->PR & EXTI_PR_PR0) == EXTI_PR_PR0){
// Toggle all LED on board
GPIOD->ODR ^= PORTD_ALL;
// Clear interupt pending request
EXTI->PR = EXTI_PR_PR0;
}
}

每次我按下一个按钮,它就会切换板上的LED

对于state变量,请使用XOR运算。它非常有用。

为了回答这个问题,我使用了STM32L052参考手册和ST网站上的STM32L052.h文件。只需查找STM32CubeL0下载

4-15的EXTI IRQ非常罕见。也许你可以添加你正在使用的exakt控制器?

例如,在STM32F415上,它将是用于IRQ处理程序的EXTI4_IRQHandler

最新更新