// 捕获相邻边沿间隔:高电平时长决定位值
// 引导码: 高9ms → 低4.5ms
// 位1: 高0.56ms + 低1.69ms ; 位0: 高0.56ms + 低0.56ms
uint32_t last_t = 0;
void capture_isr(void){
uint32_t now = TIM1->CCR1;
uint32_t dt = now - last_t; // 相对上次边沿
last_t = now;
if(dt > 8000 && dt < 11000){ state = START_HI; return; }
switch(state){
case START_HI: if(dt > 4000){ state = BITS; bit = 0; val = 0; } break;
case BITS:
if(dt > 1200 && dt < 2200) val |= (1 << (31-bit)); // 位1
if(++bit >= 32) key_done(val); // 32位完成
break;
}
}