使用CMSIS编写C语言按键控制LED翻转功能失效问题求助
故障排查及修复方案
1. 现有代码存在的问题
- GPIO配置参数错误
- 按键侧
GPIOC->MODER &= ~(00 << 26)为无效代码:0左移26位后仍为0,取反后为全1,与操作不会修改MODER寄存器对应位,无法保证PC13进入输入模式 - 按键未配置稳定上下拉:当前PUPDR配置仅清除了第26位,最终PC13为浮空输入,引脚电平容易受干扰,按键状态读取不稳定
- LED侧
GPIOA->PUPDR &= ~(00 << 10)同样为无效代码,不会修改PUPDR寄存器对应位
- 按键侧
- 主逻辑无翻转操作
按键按下时执行的GPIOA->ODR = 0b0100000是固定将PA5引脚置为高电平,每次触发只会点亮LED,没有电平翻转逻辑 - 缺少按键消抖处理:机械按键按下/释放时会产生数毫秒的电平抖动,容易导致单次按键被识别为多次触发
2. 修复后的代码
2.1 按键配置(PC13,默认上拉,按键按下为低电平)
//Configure Port C pin 13 (Button) RCC->AHBENR |= 0x80000; // 开启GPIOC时钟 GPIOC->MODER &= ~(3U << 26); // 清空PC13 MODER位,设置为输入模式 GPIOC->PUPDR &= ~(3U << 26); GPIOC->PUPDR |= (1U << 26); // PC13配置为上拉输入
2.2 LED配置(PA5,推挽输出)
RCC->AHBENR |= 0x20000; // 开启GPIOA时钟 GPIOA->MODER &= ~(3U << 10); GPIOA->MODER |= (1U << 10); // PA5设置为通用输出模式 GPIOA->OTYPER &= ~(1U << 5); // 推挽输出 GPIOA->PUPDR &= ~(3U << 10); // 无上下拉
2.3 主逻辑(带消抖,按下翻转LED)
如果未使用HAL库,可将HAL_GetTick()替换为自定义的系统计时变量,或在按键按下后加10~20ms的硬件延时实现消抖
// 定义全局变量或静态变量 uint8_t button_down = 0; uint32_t debounce_tick = 0; // 主循环中执行 if((GPIOC->IDR & (1 << 13)) == 0) { if(!button_down && (HAL_GetTick() - debounce_tick > 20)) { // 20ms消抖 GPIOA->ODR ^= (1 << 5); // 翻转PA5电平 debounce_tick = HAL_GetTick(); } button_down = 1; } else { button_down = 0; }
内容的提问来源于stack exchange,提问作者Jessy
相关产品推荐
相关产品推荐

