1. 项目背景与核心价值
红外通信作为最古老的无线传输技术之一,至今仍在智能家居、工业控制等领域广泛应用。NEC协议因其简单可靠的特性,成为红外遥控器的事实标准协议。这个项目通过STM32F103的定时器捕获功能,实现了对NEC协议红外信号的完整解码过程。
我曾在一个智能家居网关项目中,需要对接7种不同品牌的红外设备。当时市面上常见的红外解码方案要么成本过高,要么灵活性不足。最终选择STM32F103作为解码核心,不仅因为其性价比突出(单价不足10元),更因为它的通用定时器支持PWM输入模式,可以精准捕获红外信号的脉宽特征。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 硬件设计与信号捕获
2.1 红外接收电路搭建
典型的一体化红外接收头(如VS1838B)输出信号是反向的:无信号时输出高电平,收到红外载波时输出低电平。实际接线时需要注意:
- VS1838B的OUT引脚接STM32的GPIO(如PA0)
- VCC接3.3V(部分型号兼容5V)
- GND接地
关键细节:接收头与MCU间建议串联100Ω电阻,可有效抑制信号振铃。我在实测中发现,不加这个电阻时,在1米以上距离解码错误率会上升约15%。
2.2 定时器捕获模式配置
STM32F103的通用定时器(TIM2-TIM5)支持输入捕获功能。以TIM2为例,配置步骤:
- 开启TIM2和GPIOA时钟:
c复制RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
- 配置PA0为浮空输入:
c复制GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
- 定时器基础配置:
c复制TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period = 0xFFFF; // 自动重装载值
TIM_TimeBaseStructure.TIM_Prescaler = 72-1; // 1MHz计数频率
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
- 输入捕获配置(上升沿和下降沿都捕获):
c复制TIM_ICInitTypeDef TIM_ICInitStructure;
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
TIM_I
