STM32C0x使用外部中断无法触发LED翻转问题求助
STM32C0外部中断无响应问题修复
你的代码存在几处关键配置错误,导致按键触发中断时无反应,以下是问题点和修复方案:
核心问题1:SYSCFG时钟被错误关闭
enableInterrupt函数中,你在配置EXTI引脚映射前使能了SYSCFG时钟,但随后立刻关闭了它。SYSCFG负责EXTI与GPIO引脚的映射关联,配置后关闭时钟会导致映射失效,EXTI无法识别PA1的触发信号。
修复:删除关闭SYSCFG时钟的语句:
// 删掉这行:RCC->APBENR2 &= ~(1);
核心问题2:EXTI引脚映射寄存器选错
PA1对应的EXTI线路是EXTI1,其引脚映射由EXTICR[0]寄存器的bit4bit7控制,你错误地修改了`EXTICR[1]`(对应EXTI4EXTI7),导致PA1没有被关联到EXTI1。
修复:修改为正确的寄存器配置:
// 配置EXTI1映射到GPIOA EXTI->EXTICR[0] &= ~(0xF << 4); EXTI->EXTICR[0] |= 0x0 << 4;
核心问题3:中断标志位清除方式错误
EXTI的RPR1寄存器是写1清除挂起标志,你用&= ~(1 << 1)的方式无法清除标志,会导致中断触发后一直处于挂起状态,后续无法响应新的触发。
修复:在中断服务函数中改为写1清除:
void EXTI0_1_IRQHandler(void){ if(EXTI->RPR1 & (1 << 1)){ // 先确认是EXTI1的中断 GPIOA->ODR ^= 1; EXTI->RPR1 |= (1 << 1); // 写1清除挂起标志 } }
额外优化:输入引脚PUPDR配置规范
虽然轮询能工作,但配置下拉电阻时未先清零对应位,可能因默认值导致异常,建议补充清零操作:
}else{ GPIOA->PUPDR &= ~(0b11 << (2*pin)); // 先清零 GPIOA->PUPDR |= (0b10 << (2*pin)); // 设置下拉 }
修复后的完整代码
void enablePinGPIOPortA(unsigned short pin , short isInput); void enableInterrupt(void); int main(void){ enablePinGPIOPortA(0 , 0); enablePinGPIOPortA(1 , 1); enableInterrupt(); while(1); } void enablePinGPIOPortA(unsigned short pin , short isInput){ RCC->IOPENR |= RCC_IOPENR_GPIOAEN; GPIOA->MODER &= ~(0b11 << 2*pin); if(!isInput){ GPIOA->MODER |= 0b01 << 2*pin; }else{ GPIOA->PUPDR &= ~(0b11 << (2*pin)); GPIOA->PUPDR |= (0b10 << (2*pin)); } } void enableInterrupt(){ RCC->APBENR2 |= 1; EXTI->EXTICR[0] &= ~(0xF << 4); EXTI->EXTICR[0] |= 0x0 << 4; EXTI->RTSR1 |= (1 << 1); EXTI->IMR1 |= (1 << 1); NVIC_EnableIRQ(EXTI0_1_IRQn); } void EXTI0_1_IRQHandler(void){ if(EXTI->RPR1 & (1 << 1)){ GPIOA->ODR ^= 1; EXTI->RPR1 |= (1 << 1); } }
内容的提问来源于stack exchange,提问作者Ganesh Dagadi
相关产品推荐
相关产品推荐

