Files
433_STM32/docs/integration_guide.md
zhongxuanzhen 71027ebc46 3.27_433:添加UART2调试打印、IO监控、指令解析和继电器控制模块。
能够接收UART2指令控制继电器开关,或向UART2发送四路IO输入状态,并使用轮询方式检测IO状态进行及时反馈。
2026-03-27 10:09:13 +08:00

6.7 KiB
Raw Blame History

/**


  • @file integration_guide.md
  • @brief 应用层模块集成指南
  • @author Application Layer
  • @version 1.0

  • @attention
  • 本文档说明如何将uart2_print、io_monitor、cmd_parser、relay_control
  • 四个模块集成到现有工程中。

*/

应用层模块集成指南

一、文件清单

新增文件

文件路径 说明
Core/Inc/uart2_print.h UART2打印模块头文件
Core/Src/uart2_print.c UART2打印模块实现
Core/Inc/io_monitor.h IO监控模块头文件
Core/Src/io_monitor.c IO监控模块实现
Core/Inc/cmd_parser.h 指令解析模块头文件
Core/Src/cmd_parser.c 指令解析模块实现
Core/Inc/relay_control.h 继电器控制模块头文件
Core/Src/relay_control.c 继电器控制模块实现

需要修改的文件

文件路径 修改内容
Core/Src/main.c 添加头文件引用、初始化调用、主循环任务
Core/Src/usart.c 添加UART2接收中断处理
Core/Src/stm32f1xx_it.c 添加UART2接收缓冲变量

二、main.c 修改说明

2.1 在 USER CODE BEGIN Includes 区域添加

/* USER CODE BEGIN Includes */
#include "rf433.h"
#include "rf433_config.h"
#include "rf433_hal.h"

/* 应用层模块头文件 */
#include "uart2_print.h"
#include "io_monitor.h"
#include "cmd_parser.h"
#include "relay_control.h"

#if (RF433_MODE == RF433_MODE_TX) || (RF433_MODE == RF433_MODE_BOTH)
#include "rf433_tx_app.h"
#endif

#if (RF433_MODE == RF433_MODE_RX) || (RF433_MODE == RF433_MODE_BOTH)
#include "rf433_rx_app.h"
#endif

/* USER CODE END Includes */

2.2 在 USER CODE BEGIN PV 区域添加

/* USER CODE BEGIN PV */
static uint8_t uart2_rx_byte = 0;
/* USER CODE END PV */

2.3 在 USER CODE BEGIN 2 区域修改

  /* USER CODE BEGIN 2 */
  
  /* 初始化应用层模块 */
  UART2_Print_Init();
  IO_Monitor_Init();
  CmdParser_Init();
  Relay_Init();
  
  /* 启动UART2接收中断 */
  HAL_UART_Receive_IT(&huart2, &uart2_rx_byte, 1);
  
  /* 初始化RF433模块 - 使用默认配置 */
  rf433_init(NULL);
   
  /* 启动UART接收 - 使用rf433_hal中的临时变量 */
  HAL_UART_Receive_IT(&huart1, &rf433_uart_rx_tmp, 1);
  
  /* 根据配置模式初始化TX/RX应用层 */
#if (RF433_MODE == RF433_MODE_TX) || (RF433_MODE == RF433_MODE_BOTH)
  /* TX模式初始化 */
  rf433_tx_app_init(NULL);
  rf433_tx_app_start(RF433_DEFAULT_TX_COUNT, RF433_DEFAULT_TX_INTERVAL);
#endif

#if (RF433_MODE == RF433_MODE_RX) || (RF433_MODE == RF433_MODE_BOTH)
  /* RX模式初始化 */
  rf433_rx_app_init(NULL);
  rf433_rx_app_start();
#endif
  
  /* 打印启动信息 */
  UART2_Print_Printf("\r\n========================================\r\n");
  UART2_Print_Printf("E32-433TBH-SC Application Started\r\n");
  UART2_Print_Printf("System Clock: %d MHz\r\n", SystemCoreClock / 1000000);
  UART2_Print_Printf("========================================\r\n");
  
  /* USER CODE END 2 */

2.4 在 USER CODE BEGIN 3 区域修改

    /* USER CODE BEGIN 3 */
    
    /* 应用层任务处理 */
    UART2_Print_Task();
    IO_Monitor_Task();
    CmdParser_Task();
    
#if (RF433_MODE == RF433_MODE_TX) || (RF433_MODE == RF433_MODE_BOTH)
    /* TX任务 */
    rf433_tx_app_task();
#endif

#if (RF433_MODE == RF433_MODE_RX) || (RF433_MODE == RF433_MODE_BOTH)
    /* RX任务 */
    rf433_rx_app_task();
#endif
    
    /* USER CODE END 3 */

2.5 在 USER CODE BEGIN 4 区域添加

/* USER CODE BEGIN 4 */

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if (huart->Instance == USART1)
    {
        /* 调用RF433模块的UART接收回调 */
        rf433_hal_uart_rxcplt_callback();
    }
    else if (huart->Instance == USART2)
    {
        /* 喂入指令解析器 */
        CmdParser_FeedByte(uart2_rx_byte, HAL_GetTick());
        
        /* 重新启动接收 */
        HAL_UART_Receive_IT(&huart2, &uart2_rx_byte, 1);
    }
}

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
    if (huart->Instance == USART2)
    {
        /* 调用UART2打印模块的发送完成回调 */
        UART2_Print_TxCpltCallback();
    }
}

/* USER CODE END 4 */

三、usart.c 修改说明

3.1 删除原有的 HAL_UART_RxCpltCallback 函数

原有的回调函数在 USER CODE BEGIN 1 区域,需要删除:

/* USER CODE BEGIN 1 */
// 删除以下代码
// void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
// {
//     if (huart->Instance == USART1)
//     {
//         rf433_hal_uart_rxcplt_callback();
//     }
// }
/* USER CODE END 1 */

改为:

/* USER CODE BEGIN 1 */
/* UART回调函数已移至main.c统一管理 */
/* USER CODE END 1 */

四、Keil工程配置

4.1 添加源文件到工程

  1. 打开Keil工程 MDK-ARM/project.uvprojx
  2. 在Project窗口中右键点击 Application/User/Core 分组
  3. 选择 Add Existing Files...
  4. 添加以下文件:
    • Core/Src/uart2_print.c
    • Core/Src/io_monitor.c
    • Core/Src/cmd_parser.c
    • Core/Src/relay_control.c

4.2 添加头文件路径

  1. 点击工程设置图标(魔术棒)
  2. 切换到 C/C++ 标签页
  3. Include Paths 中确认 Core/Inc 已在路径中

五、测试验证

5.1 编译工程

编译应无错误,如有警告请检查:

  • 头文件路径是否正确
  • 源文件是否已添加到工程

5.2 下载运行

下载程序后通过串口调试助手连接UART2115200bps应看到

========================================
E32-433TBH-SC Application Started
System Clock: 72 MHz
========================================
[UART2] Init OK, buffer size: 256
[IO] Init OK, initial states: 0x00
[CMD] Init OK
[RELAY] Init OK, state=OFF

5.3 指令测试

发送以下指令测试:

$RL,1,1*FF\r\n     打开继电器1
$RL,1,0*FF\r\n     关闭继电器1
$DI,0*FF\r\n       查询所有DI状态
$DI,1*FF\r\n       查询DI1状态
$ECHO*FF\r\n       心跳测试

六、注意事项

  1. 不要修改HAL初始化代码MX_GPIO_InitMX_USARTx_UART_Init 等函数由CubeMX生成不应手动修改

  2. 中断优先级UART1优先级为0UART2优先级为1UART3优先级为2已按计划配置

  3. 调试开关:各模块开头有 DEBUG_xxx设为1启用调试日志设为0禁用

  4. 缓冲区大小UART2_TX_BUFFER_SIZE 默认256字节可根据需要调整

  5. 去抖参数IO_DEBOUNCE_COUNT 默认3次IO_SCAN_PERIOD_MS 默认10ms