使用IDR寄存器的STM32 GPIO中断 这就是我配置EXTI的方式 这就是我的程序在站起来后所做的 这就是我试图处理中断的方式。
这东西不起作用。Idk为什么,但对于PA0,它像一个符咒一样工作,但更改为PB4会停止弹出中断事件 我有一个连接到pin的按钮,该pin更改了上的IDR寄存器 我错过了什么使用IDR寄存器的STM32 GPIO中断 这就是我配置EXTI的方式 这就是我的程序在站起来后所做的 这就是我试图处理中断的方式。,stm32,interrupt,Stm32,Interrupt,这东西不起作用。Idk为什么,但对于PA0,它像一个符咒一样工作,但更改为PB4会停止弹出中断事件 我有一个连接到pin的按钮,该pin更改了上的IDR寄存器 我错过了什么 我使用的是STM32L052系列4-15版本的EXTI IRQ非常少见。也许你可以添加你正在使用的exakt控制器 例如,在STM32F415上,对于IRQ处理程序,它将是EXTI4\u IRQHandler。对于PA0,我相信它必须与这一行相关: void EXTI4_15_IRQHandler(void) { i
我使用的是STM32L052系列4-15版本的EXTI IRQ非常少见。也许你可以添加你正在使用的exakt控制器
例如,在STM32F415上,对于IRQ处理程序,它将是
EXTI4\u IRQHandler
。对于PA0,我相信它必须与这一行相关:
void EXTI4_15_IRQHandler(void)
{
if(!(GPIOB->IDR & GPIO_IDR_ID4)){
state = 0;
} else {
state = 1;
}
EXTI->PR = EXTI_PR_PR4;
}
根据参考手册,PB[x]
(其中x
为4)映射到SYSCFG_EXTICR2的位0-3。因此,在您的情况下,应该是:
SYSCFG->EXTICR[0] &= ~SYSCFG_EXTICR2_EXTI4_PB;
PA0映射到SYSCFG->EXTICR[0]<代码>SYSCFG->EXTICR[0]&=~SYSCFG\u EXTICR2\u EXTI4\u PB表示和
与SYSCFG->EXTICR[0]相反的SYSCFG\u EXTICR2\u EXTI4\u PB的内容
这是0xFE。假设SYSCFG->EXTICR[0]
都是零,那么实际上就是和一堆零,这就是PA0工作的原因
我注意到的另一件事是,在中断处理程序中,我会检查外部中断处理程序标志,而不是GPIO IDR寄存器,以检查按钮是否按下。根据我对问题的理解,您希望按下按钮切换变量状态
。按下按钮会触发中断,因此您可以通过检查IDR寄存器来达到某种目的。在EXTI中断处理程序中,您可以通过挂起寄存器/PR检查它是否是正确的中断。其他EXTI中断看起来像是共享同一个处理程序,因此您需要使用EXTR->PR
寄存器来检查中断右挂起位
以下是我的一些STM32F407代码示例:
SYSCFG->EXTICR[2] &= ~SYSCFG_EXTICR2_EXTI4;
SYSCFG->EXTICR[2] |= SYSCFG_EXTICR2_EXTI4_PB;
每次我按下一个按钮,它就会切换电路板上的LED
对于状态
变量,使用异或操作。它很有用
为了回答这个问题,我使用了STM32L052参考手册和ST网站上的STM32L052.h文件。只需查找STM32CubeL0下载好的,这是我的lib文件行105 88yimph024crmxevdfnlahuewhg0imlxkquee1ybffq它的L052,通过单个处理程序将行从4映射到15
void EXTI4_15_IRQHandler(void)
{
if(!(GPIOB->IDR & GPIO_IDR_ID4)){
state = 0;
} else {
state = 1;
}
EXTI->PR = EXTI_PR_PR4;
}
SYSCFG->EXTICR[0] &= ~SYSCFG_EXTICR2_EXTI4_PB;
SYSCFG->EXTICR[2] &= ~SYSCFG_EXTICR2_EXTI4;
SYSCFG->EXTICR[2] |= SYSCFG_EXTICR2_EXTI4_PB;
#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;
}
}