一、项目功能
本项目使用 433M 无线接收模块 控制 STM32 开发板上的 LED 灯:
- 433M 模块 D0 输出高电平 → PA0 收到信号 → LED 点亮
- 433M 模块 D1 输出高电平 → PA2 收到信号 → LED 熄灭
- 无信号时,LED 保持当前状态不变
二、硬件接线
- 433M 模块 D0 → STM32 PA0
- 433M 模块 D1 → STM32 PA2
- LED → PA1(低电平点亮)
- 模块 VCC → 3.3V / 5V
- 模块 GND → 开发板 GND
三、完整代码
main.c 主程序文件
// STM32 标准库头文件
#include "stm32f10x.h"
// 工程主头文件
#include "main.h"
// LED驱动头文件
#include "led.h"
// 433M无线模块驱动头文件
#include "rf433m.h"
/**
* @brief 主函数,程序上电入口
* @retval int
*/
int main()
{
// 初始化LED引脚 PA1
LED_Init();
// 初始化433M无线模块接收引脚 PA0、PA2
RF433M_Init();
// 默认状态:PA1输出高电平 → LED熄灭
GPIO_SetBits(GPIOA, GPIO_Pin_1);
// 死循环:持续检测433M模块信号
while(1)
{
// 如果 433M D0(PA0)收到高电平信号
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 1)
{
// PA1输出低电平 → 点亮LED
GPIO_ResetBits(GPIOA, GPIO_Pin_1);
}
// 如果 433M D1(PA2)收到高电平信号
else if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2) == 1)
{
// PA1输出高电平 → 熄灭LED
GPIO_SetBits(GPIOA, GPIO_Pin_1);
}
}
}
rf433m.c 433M 模块驱动
// STM32 标准库
#include "stm32f10x.h"
// 433M模块头文件
#include "rf433m.h"
/**
* @brief 433M无线接收模块初始化
* @param 无
* @retval 无
*/
void RF433M_Init(void)
{
// 定义GPIO初始化结构体
GPIO_InitTypeDef RF433M_Initstruct;
// 开启GPIOA时钟(必须开时钟才能用GPIO)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// 配置 PA0 和 PA2 两个引脚
RF433M_Initstruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_2;
// 上拉输入模式:默认高电平,信号触发时为高电平
RF433M_Initstruct.GPIO_Mode = GPIO_Mode_IPU;
// 初始化GPIO
GPIO_Init(GPIOA, &RF433M_Initstruct);
}
led.c LED 驱动
// LED头文件
#include "led.h"
// STM32标准库
#include "stm32f10x.h"
/**
* @brief LED初始化函数
* @param 无
* @retval 无
*/
void LED_Init(void)
{
// 定义GPIO初始化结构体
GPIO_InitTypeDef led_initstruct;
// 开启GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// 配置 PA1 引脚
led_initstruct.GPIO_Pin = GPIO_Pin_1;
// 输出速度 2MHz
led_initstruct.GPIO_Speed = GPIO_Speed_2MHz;
// 推挽输出模式
led_initstruct.GPIO_Mode = GPIO_Mode_Out_PP;
// 初始化GPIO
GPIO_Init(GPIOA, &led_initstruct);
}
rf433m.h 头文件
// 防止头文件重复包含
#ifndef RF433M_H_
#define RF433M_H_
// 433M模块初始化函数声明
void RF433M_Init(void);
#endif
led.h 头文件
// 防止头文件重复包含
#ifndef LED_H_
#define LED_H_
// LED初始化函数声明
void LED_Init(void);
#endif
四、代码
1. 整体逻辑
- PA0:接收 433M 模块 D0 信号 → 控制 LED 点亮
- PA2:接收 433M 模块 D1 信号 → 控制 LED 熄灭
- PA1:控制 LED 亮灭
2. 433M 模块工作原理
433M 接收模块有两路输出:
- D0 有信号 → 输出高电平 → PA0 读到 1 → 点灯
- D1 有信号 → 输出高电平 → PA2 读到 1 → 灭灯
模块无信号时,引脚保持低电平,程序不动作。
注意遥控器上的ABCD按键不一定是按顺序对应的D0,D1,D2,D3
3. 模块化设计
- main.c:主逻辑,判断信号 + 控制 LED
- rf433m.c/h:433M 模块驱动,配置 PA0、PA2 为输入
- led.c/h:LED 驱动,配置 PA1 为输出
4. 关键 GPIO 模式说明
- **PA0、PA2:上拉输入(IPU)**用于接收外部模块信号,稳定可靠
- **PA1:推挽输出(Out_PP)**用于驱动 LED,可输出强高低电平
5. 实验现象
- 433M 发射端按A→ LED 亮
- 433M 发射端按B → LED 灭
- 无操作时 LED 保持状态
我的遥控器的按键恰好是按顺序对应的D0,D1,D2,D3