STM32F1寄存器操作LED常亮不闪烁,调试时PA5引脚电平正常跳转问题求助
问题根因
核心问题是空循环延时函数被编译器优化:
你定义的delay函数中循环变量未加volatile修饰,Keil默认开启优化时会判定该循环无有效操作,直接删除整个循环逻辑,导致delay函数实际执行时间只有几个时钟周期,PA5引脚每秒翻转数十万次,人眼无法识别到闪烁,只会觉得LED常亮。调试模式下编译器会关闭部分优化,所以你能在寄存器界面看到电平正常跳转。
你当前的GPIO初始化、BSRR寄存器操作逻辑本身没有问题,操作BSRR用|=虽然冗余但不影响功能,因为BSRR寄存器是写1有效、写0无影响。
修复方案
- 给延时函数的循环变量添加
volatile修饰,禁止编译器优化该部分逻辑:
void delay(unsigned int ms){ volatile unsigned int i, j; for(i = 0; i < ms; i++) for(j = 0; j < 20000; j++); }
- (可选优化)BSRR寄存器可以直接赋值,无需或操作,写法更简洁:
while(1){ GPIOA->BSRR = (1<<5); // 置位PA5 delay(200); GPIOA->BSRR = (1<<21); // 复位PA5 delay(200); }
如果修改后延时时间不符合预期,可以根据你的系统时钟频率调整内层循环的20000参数,匹配实际需要的延时长度。
内容的提问来源于stack exchange,提问作者Rewesesre
相关产品推荐
相关产品推荐

