3.24_433_RX版本:封装RF433模块,完成开机进入TX/RX模式并在开发板验证成功

This commit is contained in:
2026-03-24 16:59:20 +08:00
commit e439dd465e
1311 changed files with 692196 additions and 0 deletions

334
Driver_RF433/Inc/rf433.h Normal file
View File

@ -0,0 +1,334 @@
/**
******************************************************************************
* @file rf433.h
* @brief RF433模块驱动主接口
* @note 基于原e32_demo.h重构保持与原版设备兼容
******************************************************************************
*/
#ifndef __RF433_H__
#define __RF433_H__
#ifdef __cplusplus
extern "C" {
#endif
#include "rf433_config.h"
#include "rf433_hal.h"
#include <stdint.h>
#include <stdbool.h>
/* ============================================================================
* 错误码定义
* ============================================================================ */
typedef enum
{
RF433_OK = 0, // 成功
RF433_ERROR = -1, // 通用错误
RF433_ERROR_BUSY = -2, // 模块忙
RF433_ERROR_TIMEOUT = -3, // 超时
RF433_ERROR_INVALID_PARAM = -4, // 无效参数
RF433_ERROR_NO_MEMORY = -5, // 内存不足
RF433_ERROR_NOT_INIT = -6, // 未初始化
RF433_ERROR_NO_DATA = -7, // 无数据
} rf433_error_t;
/* ============================================================================
* 配置参数枚举与原e32_demo.h保持一致
* ============================================================================ */
typedef enum
{
RF433_OFF = 0x00,
RF433_ON = 0x01,
} rf433_on_off_t;
typedef enum
{
RF433_RADIO_RATE_2400 = 0x02,
RF433_RADIO_RATE_4800 = 0x03,
RF433_RADIO_RATE_9600 = 0x04,
RF433_RADIO_RATE_19200 = 0x05,
RF433_RADIO_RATE_38400 = 0x06,
RF433_RADIO_RATE_62500 = 0x07,
} rf433_radio_rate_t;
typedef enum
{
RF433_UART_8N1 = 0x00,
RF433_UART_8O1 = 0x01,
RF433_UART_8E1 = 0x02,
} rf433_uart_parity_t;
typedef enum
{
RF433_UART_RATE_1200 = 0x00,
RF433_UART_RATE_2400 = 0x01,
RF433_UART_RATE_4800 = 0x02,
RF433_UART_RATE_9600 = 0x03,
RF433_UART_RATE_19200 = 0x04,
RF433_UART_RATE_38400 = 0x05,
RF433_UART_RATE_57600 = 0x06,
RF433_UART_RATE_115200= 0x07,
} rf433_uart_rate_t;
typedef enum
{
RF433_WOR_PERIOD_250MS = 0x00,
RF433_WOR_PERIOD_500MS = 0x01,
RF433_WOR_PERIOD_750MS = 0x02,
RF433_WOR_PERIOD_1000MS = 0x03,
RF433_WOR_PERIOD_1250MS = 0x04,
RF433_WOR_PERIOD_1500MS = 0x05,
RF433_WOR_PERIOD_1750MS = 0x06,
RF433_WOR_PERIOD_2000MS = 0x07,
} rf433_wor_period_t;
typedef enum
{
RF433_TX_POWER_DBM_30 = 0x00,
RF433_TX_POWER_DBM_27 = 0x01,
RF433_TX_POWER_DBM_24 = 0x02,
RF433_TX_POWER_DBM_21 = 0x03,
} rf433_transmit_power_t;
/* ============================================================================
* 配置结构体与原e32_register_t保持一致
* ============================================================================ */
typedef struct
{
/* 00H是固定HEAD无法修改 */
/* ======== 用户参数寄存器 01H ======== */
struct
{
uint8_t address_h; /* 模块地址 (用户参数寄存器地址: 01H、02H) 不同地址的模块无法直接互相通信(广播地址除外); 65535为广播地址用于群发信息 */
}register_1;
/* ======== 用户参数寄存器 02H ======== */
struct
{
uint8_t address_l;
}register_2;
/* ======== 用户参数寄存器 03H ======== */
union {
uint8_t value;
struct
{
rf433_radio_rate_t radio_rate : 3; /* 空中速率 (寄存器地址: 03H Bit2-0) 速率越高,抗干扰性越差,传输距离越近;但传输速率越高,延迟越小 */
rf433_uart_rate_t uart_baud_rate : 3; /* 串口波特率 (寄存器地址: 03H Bit7-5) 省电模式(模式2)是强制固定波特率为9600其他传输模式时为用户设置的串口波特率 */
rf433_uart_parity_t uart_parity : 2; /* 串口校验位 (寄存器地址: 03H Bit4-3) */
}field;
}register_3;
/* ======== 用户参数寄存器 04H ======== */
struct
{
uint8_t channel; /* 信道参数 (寄存器地址: 04H) 相邻信道间隔1MHz模块通信频率与信道有关通信频率 = 起始频率 + (1MHz x 信道参数) */
}register_4;
/* ======== 用户参数寄存器 05H ======== */
union {
uint8_t value;
struct
{
rf433_transmit_power_t tx_power : 2; /* 发射功率 (寄存器地址: 05H Bit1-0) 不同型号的模块的功率值可能不一样,具体值需要参考模块手册 */
rf433_on_off_t packet_fec : 1; /* 前向纠错FEC (寄存器地址: 05H Bit2 ) 收发双方必须一致,否则无法通信。开启后,抗干扰性明显提升,但传输速率会降低 */
rf433_wor_period_t wake_on_radio_period : 3; /* 无线唤醒WOR周期 (寄存器地址: 05H Bit2-0) 收发双方必须设置一致,否则无法通信 */
rf433_on_off_t reserve : 1; /* 保留 IO输出方式*/
rf433_on_off_t specify_target : 1; /* 指定目标传输,也叫定点传输模式 (寄存器地址: 05H Bit7 ) 用户在发送数据时,需要在数据的首字节写入目标地址和信道 */
}field;
}register_5;
}rf433_register_t;
/* ============================================================================
* 数据包结构体与原e32_specify_target_buffer_t保持一致
* ============================================================================ */
typedef struct
{
uint8_t address_h; // 目标地址高字节
uint8_t address_l; // 目标地址低字节
uint8_t channel; // 目标信道
uint8_t data[237]; // 数据最大237字节
} rf433_specify_target_buffer_t;
/* ============================================================================
* 命令枚举与原request_cmd_t保持一致
* ============================================================================ */
typedef enum
{
RF433_REQUEST_CMD_CONFIG = 0x00,
RF433_REQUEST_CMD_NAME ,
RF433_REQUEST_CMD_VERSION ,
} rf433_request_cmd_t;
/* ============================================================================
* 回调函数类型定义
* ============================================================================ */
/**
* @brief 数据接收回调函数类型
* @param data 接收到的数据
* @param length 数据长度
* @param user_data 用户数据
*/
typedef void (*rf433_rx_callback_t)(const uint8_t *data, uint16_t length, void *user_data);
/**
* @brief 发送完成回调函数类型
* @param status 发送状态
* @param user_data 用户数据
*/
typedef void (*rf433_tx_callback_t)(rf433_error_t status, void *user_data);
/* ============================================================================
* 核心API函数
* ============================================================================ */
/**
* @brief 初始化RF433模块
* @param config 初始配置NULL使用默认配置
* @return RF433_OK 成功
* RF433_ERROR 失败
*/
rf433_error_t rf433_init(const rf433_register_t *config);
/**
* @brief 反初始化RF433模块
* @return RF433_OK 成功
*/
rf433_error_t rf433_deinit(void);
/**
* @brief 设置模块配置基于原e32_demo_menu_config
* @param config 配置参数
* @return RF433_OK 成功
* RF433_ERROR_BUSY 模块忙
* RF433_ERROR_TIMEOUT 超时
*/
rf433_error_t rf433_set_config(const rf433_register_t *config);
/**
* @brief 获取模块配置
* @param config 配置参数输出
* @return RF433_OK 成功
* RF433_ERROR_INVALID_PARAM 无效参数
*/
rf433_error_t rf433_get_config(rf433_register_t *config);
/**
* @brief 设置工作模式
* @param mode 工作模式
* @return RF433_OK 成功
* RF433_ERROR_BUSY 模块忙
*/
rf433_error_t rf433_set_work_mode(rf433_work_mode_t mode);
/**
* @brief 复位模块
* @return RF433_OK 成功
*/
rf433_error_t rf433_reset(void);
/* ============================================================================
* 条件编译的TX/RX API
* ============================================================================ */
#if (RF433_MODE == RF433_MODE_TX) || (RF433_MODE == RF433_MODE_BOTH)
/**
* @brief 发送数据透明传输模式基于原e32_demo_transmit
* @param buffer 数据指针
* @param length 数据长度
* @return RF433_OK 成功
* RF433_ERROR_BUSY 模块忙
* RF433_ERROR_TIMEOUT 超时
* RF433_ERROR_INVALID_PARAM 无效参数
*/
rf433_error_t rf433_transmit(uint8_t *buffer, uint16_t length);
/**
* @brief 发送数据包(指定目标模式)
* @param packet 数据包
* @return RF433_OK 成功
* RF433_ERROR_BUSY 模块忙
* RF433_ERROR_TIMEOUT 超时
* RF433_ERROR_INVALID_PARAM 无效参数
*/
rf433_error_t rf433_transmit_packet(const rf433_specify_target_buffer_t *packet);
#endif /* (RF433_MODE == RF433_MODE_TX) || (RF433_MODE == RF433_MODE_BOTH) */
#if (RF433_MODE == RF433_MODE_RX) || (RF433_MODE == RF433_MODE_BOTH)
/**
* @brief 启动接收
* @return RF433_OK 成功
* RF433_ERROR_BUSY 模块忙
*/
rf433_error_t rf433_rx_start(void);
/**
* @brief 停止接收
* @return RF433_OK 成功
*/
rf433_error_t rf433_rx_stop(void);
/**
* @brief 接收数据(阻塞模式)
* @param buffer 数据缓冲区
* @param max_length 最大接收长度
* @param actual_length 实际接收长度
* @param timeout 超时时间ms
* @return RF433_OK 成功
* RF433_ERROR_TIMEOUT 超时
* RF433_ERROR_INVALID_PARAM 无效参数
*/
rf433_error_t rf433_receive(uint8_t *buffer, uint16_t max_length, uint16_t *actual_length, uint32_t timeout);
/**
* @brief 检查是否有数据可读
* @param has_data 是否有数据输出
* @return RF433_OK 成功
*/
rf433_error_t rf433_rx_check_data(bool *has_data);
/**
* @brief 读取数据(非阻塞模式)
* @param buffer 数据缓冲区
* @param max_length 最大读取长度
* @param actual_length 实际读取长度
* @return RF433_OK 成功
* RF433_ERROR_NO_DATA 无数据
* RF433_ERROR_INVALID_PARAM 无效参数
*/
rf433_error_t rf433_rx_read(uint8_t *buffer, uint16_t max_length, uint16_t *actual_length);
/**
* @brief 注册接收回调函数
* @param callback 回调函数
* @param user_data 用户数据
* @return RF433_OK 成功
* RF433_ERROR_INVALID_PARAM 无效参数
*/
rf433_error_t rf433_rx_register_callback(rf433_rx_callback_t callback, void *user_data);
/**
* @brief 注销接收回调函数
* @return RF433_OK 成功
*/
rf433_error_t rf433_rx_unregister_callback(void);
#endif /* (RF433_MODE == RF433_MODE_RX) || (RF433_MODE == RF433_MODE_BOTH) */
#ifdef __cplusplus
}
#endif
#endif /* __RF433_H__ */

View File

@ -0,0 +1,133 @@
/**
******************************************************************************
* @file rf433_config.h
* @brief RF433模块配置文件
******************************************************************************
*/
#ifndef __RF433_CONFIG_H__
#define __RF433_CONFIG_H__
#ifdef __cplusplus
extern "C" {
#endif
/* ============================================================================
* 编译模式选择
* ============================================================================ */
/**
* @brief 编译模式选择
* @note 必须在包含此头文件之前定义
* RF433_MODE_TX - 仅编译TX功能
* RF433_MODE_RX - 仅编译RX功能
* RF433_MODE_BOTH - 编译TX和RX功能默认
*/
#define RF433_MODE_TX 1
#define RF433_MODE_RX 2
#define RF433_MODE_BOTH 3
#ifndef RF433_MODE
#define RF433_MODE RF433_MODE_RX
#endif
/* ============================================================================
* 默认配置参数
* ============================================================================ */
/**
* @brief 默认工作模式(运行时选择)
* @note 1: TX模式
* 2: RX模式
* 3: 双模模式
*/
#ifndef RF433_DEFAULT_WORK_MODE
#define RF433_DEFAULT_WORK_MODE RF433_MODE_TX
#endif
/**
* @brief 默认发送间隔ms
*/
#ifndef RF433_DEFAULT_TX_INTERVAL
#define RF433_DEFAULT_TX_INTERVAL 1000
#endif
/**
* @brief 默认发送次数
*/
#ifndef RF433_DEFAULT_TX_COUNT
#define RF433_DEFAULT_TX_COUNT 100
#endif
/* ============================================================================
* 缓冲区大小配置
* ============================================================================ */
/**
* @brief FIFO缓冲区大小
*/
#ifndef RF433_FIFO_SIZE
#define RF433_FIFO_SIZE 1024
#endif
/**
* @brief 最大数据包长度
*/
#ifndef RF433_MAX_PACKET_SIZE
#define RF433_MAX_PACKET_SIZE 237
#endif
/**
* @brief 默认超时时间ms
*/
#ifndef RF433_DEFAULT_TIMEOUT
#define RF433_DEFAULT_TIMEOUT 100
#endif
/* ============================================================================
* 硬件配置
* ============================================================================ */
/**
* @brief 是否使用AUX引脚检测忙状态
* @note 1: 使用AUX引脚推荐
* 0: 使用延时(不推荐)
*/
#ifndef RF433_USE_GPIO_AUX
#define RF433_USE_GPIO_AUX 1
#endif
/**
* @brief AUX引脚忙等待超时时间ms
*/
#ifndef RF433_AUX_TIMEOUT
#define RF433_AUX_TIMEOUT 100
#endif
/* ============================================================================
* 调试配置
* ============================================================================ */
/**
* @brief 是否启用调试输出
*/
#ifndef RF433_DEBUG_ENABLE
#define RF433_DEBUG_ENABLE 0
#endif
/**
* @brief 调试输出函数
*/
#if RF433_DEBUG_ENABLE
#ifndef RF433_DEBUG_PRINTF
#define RF433_DEBUG_PRINTF(fmt, ...) printf("[RF433] " fmt "\r\n", ##__VA_ARGS__)
#endif
#else
#define RF433_DEBUG_PRINTF(fmt, ...)
#endif
#ifdef __cplusplus
}
#endif
#endif /* __RF433_CONFIG_H__ */

View File

@ -0,0 +1,217 @@
/**
******************************************************************************
* @file rf433_hal.h
* @brief RF433硬件抽象层接口
* @note 基于原e32_hal.c重构保持与原版设备兼容
******************************************************************************
*/
#ifndef __RF433_HAL_H__
#define __RF433_HAL_H__
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
#include <stdbool.h>
/* ============================================================================
* HAL配置宏
* ============================================================================ */
/**
* @brief 是否使用AUX引脚检测忙状态
* @note 1: 使用AUX引脚推荐
* 0: 使用延时(不推荐)
*/
#ifndef RF433_USE_GPIO_AUX
#define RF433_USE_GPIO_AUX 1
#endif
/**
* @brief AUX引脚忙等待超时时间ms
*/
#ifndef RF433_AUX_TIMEOUT
#define RF433_AUX_TIMEOUT 100
#endif
/* ============================================================================
* 错误码定义
* ============================================================================ */
typedef enum
{
RF433_HAL_OK = 0, // 成功
RF433_HAL_ERROR = -1, // 通用错误
RF433_HAL_ERROR_TIMEOUT = -2, // 超时
RF433_HAL_ERROR_INVALID_PARAM = -3, // 无效参数
RF433_HAL_ERROR_BUSY = -4, // 模块忙
} rf433_hal_error_t;
/* ============================================================================
* 工作模式枚举与原e32_hal.h保持一致
* ============================================================================ */
typedef enum
{
RF433_WORK_MODE_TRANSPARENT = 0x00, // 一般模式(透明传输)
RF433_WORK_MODE_WAKE_ON_RADIO_MASTER = 0x01, // WOR主模式
RF433_WORK_MODE_WAKE_ON_RADIO_SLAVE = 0x02, // WOR从模式
RF433_WORK_MODE_CONFIG_AND_SLEEP = 0x03, // 配置/睡眠模式
} rf433_work_mode_t;
/* ============================================================================
* HAL初始化函数
* ============================================================================ */
/**
* @brief 初始化硬件抽象层
* @return RF433_HAL_OK 成功
* RF433_HAL_ERROR 失败
*/
rf433_hal_error_t rf433_hal_init(void);
/**
* @brief 反初始化硬件抽象层
* @return RF433_HAL_OK 成功
*/
rf433_hal_error_t rf433_hal_deinit(void);
/* ============================================================================
* UART通信函数
* ============================================================================ */
/**
* @brief UART发送数据基于原e32_hal_uart_tx
* @param buffer 数据缓冲区
* @param length 数据长度
* @return RF433_HAL_OK 成功
* RF433_HAL_ERROR_TIMEOUT 超时
*/
rf433_hal_error_t rf433_hal_uart_tx(uint8_t *buffer, uint16_t length);
/**
* @brief UART接收数据中断模式
* @param data 接收到的数据
* @param length 数据长度
* @note 此函数由UART中断回调调用
*/
void rf433_hal_uart_rx_callback(uint8_t *data, uint16_t length);
/**
* @brief UART接收完成回调函数由HAL_UART_RxCpltCallback调用
* @retval 无
*/
void rf433_hal_uart_rxcplt_callback(void);
/* ============================================================================
* GPIO控制函数
* ============================================================================ */
/**
* @brief 等待AUX引脚变为空闲基于原e32_hal_aux_wait
* @return RF433_HAL_OK 成功
* RF433_HAL_ERROR_TIMEOUT 超时
*/
rf433_hal_error_t rf433_hal_aux_wait(void);
/**
* @brief 设置工作模式基于原e32_hal_work_mode
* @param mode 工作模式
* @return RF433_HAL_OK 成功
* RF433_HAL_ERROR_TIMEOUT 超时
*/
rf433_hal_error_t rf433_hal_set_work_mode(rf433_work_mode_t mode);
/**
* @brief 复位模块基于原e32_hal_reset
* @return RF433_HAL_OK 成功
*/
rf433_hal_error_t rf433_hal_reset(void);
/* ============================================================================
* FIFO操作函数
* ============================================================================ */
/**
* @brief 写入FIFO
* @param data 数据指针
* @param length 数据长度
* @return RF433_HAL_OK 成功
* RF433_HAL_ERROR_FULL FIFO满
*/
rf433_hal_error_t rf433_hal_fifo_write(const uint8_t *data, uint16_t length);
/**
* @brief 读取FIFO
* @param data 数据缓冲区
* @param length 期望读取长度
* @param actual_length 实际读取长度
* @return RF433_HAL_OK 成功
* RF433_HAL_ERROR_EMPTY FIFO空
*/
rf433_hal_error_t rf433_hal_fifo_read(uint8_t *data, uint16_t length, uint16_t *actual_length);
/**
* @brief 获取FIFO数据长度
* @param length 数据长度输出
* @return RF433_HAL_OK 成功
*/
rf433_hal_error_t rf433_hal_fifo_get_length(uint16_t *length);
/**
* @brief 清空FIFO
* @return RF433_HAL_OK 成功
*/
rf433_hal_error_t rf433_hal_fifo_clear(void);
/* ============================================================================
* 定时器回调函数
* ============================================================================ */
/**
* @brief 1ms定时器回调用于超时检测
* @note 此函数需要在1ms定时器中断中调用
*/
void rf433_hal_1ms_callback(void);
/* ============================================================================
* 兼容函数声明(用于保持与原代码的兼容性)
* ============================================================================ */
/**
* @brief UART接收超时1ms回调兼容原uart1_rx_timeout_1ms_callback
* @note 此函数需要在1ms定时器中断中调用
*/
void uart1_rx_timeout_1ms_callback(void);
/**
* @brief UART等待响应阻塞模式兼容原uart1_wait_response_blocked
* @param buffer 数据缓冲区
* @param length 数据长度输出
* @note 与main.h中的声明保持一致返回void
*/
void uart1_wait_response_blocked(uint8_t *buffer, uint16_t *length);
/**
* @brief UART检查接收完成兼容原uart1_check_rx_done
* @param buffer 数据缓冲区
* @param length 数据长度输出uint32_t*与main.h中的声明保持一致
* @return true 接收到数据
* false 无数据
*/
bool uart1_check_rx_done(uint8_t *buffer, uint32_t *length);
/**
* @brief 检查接收完成标志用于RF433应用层
* @return true 接收完成
* false 接收未完成
*/
bool rf433_hal_check_rx_done(void);
#ifdef __cplusplus
}
#endif
#endif /* __RF433_HAL_H__ */