feat(DLD154Pro): RS485 省 Flash 减配 + 固件 V3.05
为节省 Flash 资源,注释掉 RS485 侧一批低频/非核心协议分支与调试打印: - Modbus: FC 0x03(读保持寄存器)/0x10(批量写)/0x11(Report Slave ID)分发禁用; IR 0x0006/0x0007(Variation)/0x000A/0x000B/0x000C 读禁用(Variation 走全数据块 0x010A/0x010B);HR 0x0000–0x0004/0x0009/0x000A 写禁用(FC 0x06 仅剩 0x0010/0x0011/0x0012 有效) - 700BS: 0x3D DIP 查询禁用 + 4 处调试 PRINT 移除 - MB_MAX_READ_REGS 125→40(40×2=80B 与 MB_MAX_DATA_BYTES 匹配,原 60 会越界 40B) - 呼吸灯光耦加速步长 32→64;OTA 跳转前 mDelaymS(5) 移除 - cmcng.h 版本 V3.04 → V3.05(字符串 + SUB 宏同步) 协议文档已同步标注未实现(rs485-modbus V1.8 / rs485-700bs),见 docs commit。
This commit is contained in:
@@ -17,10 +17,10 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#define PRODUCT_MODEL "DLD154Pro"
|
#define PRODUCT_MODEL "DLD154Pro"
|
||||||
#define FIRMWARE_VER "3.04"
|
#define FIRMWARE_VER "3.05"
|
||||||
#define HARDWARE_VER "3.01"
|
#define HARDWARE_VER "3.01"
|
||||||
#define FIRMWARE_VER_MAIN 3
|
#define FIRMWARE_VER_MAIN 3
|
||||||
#define FIRMWARE_VER_SUB 4
|
#define FIRMWARE_VER_SUB 5
|
||||||
|
|
||||||
/* 归一化基数: variation 换算 dL/L 时除以该值 (2^19=524288, 必须与 peripheral_main.c MEASUREMENT_BASE 同步) */
|
/* 归一化基数: variation 换算 dL/L 时除以该值 (2^19=524288, 必须与 peripheral_main.c MEASUREMENT_BASE 同步) */
|
||||||
#define LOOP_MEASURE_BASE 524288L
|
#define LOOP_MEASURE_BASE 524288L
|
||||||
|
|||||||
@@ -39,8 +39,9 @@
|
|||||||
#define MB_FULL_DATA_FRAME_LEN 43
|
#define MB_FULL_DATA_FRAME_LEN 43
|
||||||
|
|
||||||
/* FC 0x03/0x04 读寄存器缓冲 (Modbus 标准: max qty = 0x007D = 125) */
|
/* FC 0x03/0x04 读寄存器缓冲 (Modbus 标准: max qty = 0x007D = 125) */
|
||||||
#define MB_MAX_READ_REGS 125 /* 单次读取最大寄存器数 */
|
/* ⚠ 40/80 匹配: 40 寄存器 × 2B = 80B 缓冲 (2026-08-27 省 Flash 减配, 原 60 会越界 40B) */
|
||||||
#define MB_MAX_DATA_BYTES 250 /* 125 × 2 字节 */
|
#define MB_MAX_READ_REGS 40 //125 /* 单次读取最大寄存器数 */
|
||||||
|
#define MB_MAX_DATA_BYTES 80 //250 /* 40 × 2 字节 */
|
||||||
#define MB_RESP_BUF_SIZE (5 + MB_MAX_DATA_BYTES) /* addr+fc+bc+data+crc */
|
#define MB_RESP_BUF_SIZE (5 + MB_MAX_DATA_BYTES) /* addr+fc+bc+data+crc */
|
||||||
|
|
||||||
/*===========================================================================
|
/*===========================================================================
|
||||||
|
|||||||
@@ -730,7 +730,7 @@ static void simpleProfileChangeCB(uint8_t paramID, uint8_t *pValue, uint16_t len
|
|||||||
// 0x4F, 0x54, 0x41
|
// 0x4F, 0x54, 0x41
|
||||||
// PRINT("jump OTA \n");
|
// PRINT("jump OTA \n");
|
||||||
WWDG_ResetCfg(DISABLE);
|
WWDG_ResetCfg(DISABLE);
|
||||||
mDelaymS(5);
|
// mDelaymS(5);
|
||||||
Jump_OTA();
|
Jump_OTA();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -101,7 +101,7 @@ uint8_t g_rs485_id = 0;
|
|||||||
#define BREATH_HOLD_LOW 3
|
#define BREATH_HOLD_LOW 3
|
||||||
|
|
||||||
/* 光耦有信号时加速参数 (周期 ~1s) */
|
/* 光耦有信号时加速参数 (周期 ~1s) */
|
||||||
#define BREATH_OPTO_DUTY_STEP 32 // 步长 4x → 渐亮/渐灭各 4 步 (~0.5s 周期)
|
#define BREATH_OPTO_DUTY_STEP 64 // 步长 4x → 渐亮/渐灭各 4 步 (~0.5s 周期)
|
||||||
#define BREATH_OPTO_HOLD_TICKS 1 // 保持 50ms
|
#define BREATH_OPTO_HOLD_TICKS 1 // 保持 50ms
|
||||||
|
|
||||||
/* 看门狗超时: Fsys=60MHz, WDOG_CLK=Fsys/131072≈458Hz, 0xFF≈558ms */
|
/* 看门狗超时: Fsys=60MHz, WDOG_CLK=Fsys/131072≈458Hz, 0xFF≈558ms */
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ void rs485_init(void)
|
|||||||
|
|
||||||
RS485_RE_RX(); // 默认接收模式
|
RS485_RE_RX(); // 默认接收模式
|
||||||
_hb_last_ms = mstick(); // 对齐心跳起始时刻,避免首次立即触发
|
_hb_last_ms = mstick(); // 对齐心跳起始时刻,避免首次立即触发
|
||||||
PRINT("RS485: init ok, addr=%d, baud=%d\n", g_rs485_id, RS485_BAUD);
|
// PRINT("RS485: init ok, addr=%d, baud=%d\n", g_rs485_id, RS485_BAUD);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*===========================================================================
|
/*===========================================================================
|
||||||
@@ -126,7 +126,7 @@ static void handle_query_freq(uint8_t addr)
|
|||||||
static void handle_reset_init(uint8_t addr)
|
static void handle_reset_init(uint8_t addr)
|
||||||
{
|
{
|
||||||
SYS_ResetExecute();
|
SYS_ResetExecute();
|
||||||
PRINT("RS485: coil reset init\n");
|
// PRINT("RS485: coil reset init\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 0x3D — 查询拨码 DIP1-5 (DLD154Pro 无物理拨码, 从 BLE 配置映射) */
|
/* 0x3D — 查询拨码 DIP1-5 (DLD154Pro 无物理拨码, 从 BLE 配置映射) */
|
||||||
@@ -222,7 +222,7 @@ static void rs485_process_frame(void)
|
|||||||
uint8_t xorr = _rx_buf[2];
|
uint8_t xorr = _rx_buf[2];
|
||||||
|
|
||||||
if ((stx ^ addr) != xorr) {
|
if ((stx ^ addr) != xorr) {
|
||||||
PRINT("RS485: XOR fail %02X %02X %02X\n", stx, addr, xorr);
|
// PRINT("RS485: XOR fail %02X %02X %02X\n", stx, addr, xorr);
|
||||||
_rx_len = 0;
|
_rx_len = 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -237,9 +237,9 @@ static void rs485_process_frame(void)
|
|||||||
case CMD_QUERY_STATUS: handle_query_status(addr); break;
|
case CMD_QUERY_STATUS: handle_query_status(addr); break;
|
||||||
case CMD_QUERY_FREQ: handle_query_freq(addr); break;
|
case CMD_QUERY_FREQ: handle_query_freq(addr); break;
|
||||||
case CMD_RESET_INIT: handle_reset_init(addr); break;
|
case CMD_RESET_INIT: handle_reset_init(addr); break;
|
||||||
case CMD_QUERY_DIP: handle_query_dip(addr); break;
|
// case CMD_QUERY_DIP: handle_query_dip(addr); break;
|
||||||
default:
|
default:
|
||||||
PRINT("RS485: unknown cmd 0x%02X\n", stx);
|
// PRINT("RS485: unknown cmd 0x%02X\n", stx);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -439,24 +439,24 @@ static uint8_t read_ir_register(uint16_t addr, uint8_t *hi, uint8_t *lo)
|
|||||||
*hi = (uint8_t)(loop1_Origin >> 24); *lo = (uint8_t)(loop1_Origin >> 16); return 1;
|
*hi = (uint8_t)(loop1_Origin >> 24); *lo = (uint8_t)(loop1_Origin >> 16); return 1;
|
||||||
case 0x0005: /* Origin Lo */
|
case 0x0005: /* Origin Lo */
|
||||||
*hi = (uint8_t)(loop1_Origin >> 8); *lo = (uint8_t)(loop1_Origin); return 1;
|
*hi = (uint8_t)(loop1_Origin >> 8); *lo = (uint8_t)(loop1_Origin); return 1;
|
||||||
case 0x0006: /* Variation Hi */
|
// case 0x0006: /* Variation Hi */
|
||||||
var = (int32_t)(loop1_CAPVD - loop1_Origin);
|
// var = (int32_t)(loop1_CAPVD - loop1_Origin);
|
||||||
val32 = (uint32_t)var;
|
// val32 = (uint32_t)var;
|
||||||
*hi = (uint8_t)(val32 >> 24); *lo = (uint8_t)(val32 >> 16); return 1;
|
// *hi = (uint8_t)(val32 >> 24); *lo = (uint8_t)(val32 >> 16); return 1;
|
||||||
case 0x0007: /* Variation Lo */
|
// case 0x0007: /* Variation Lo */
|
||||||
var = (int32_t)(loop1_CAPVD - loop1_Origin);
|
// var = (int32_t)(loop1_CAPVD - loop1_Origin);
|
||||||
val32 = (uint32_t)var;
|
// val32 = (uint32_t)var;
|
||||||
*hi = (uint8_t)(val32 >> 8); *lo = (uint8_t)(val32); return 1;
|
// *hi = (uint8_t)(val32 >> 8); *lo = (uint8_t)(val32); return 1;
|
||||||
case 0x0008: /* FW Version (BCD: v3.01 → 0x0301) */
|
case 0x0008: /* FW Version (BCD: v3.01 → 0x0301) */
|
||||||
*hi = FIRMWARE_VER_MAIN; *lo = FIRMWARE_VER_SUB; return 1;
|
*hi = FIRMWARE_VER_MAIN; *lo = FIRMWARE_VER_SUB; return 1;
|
||||||
case 0x0009: /* HW Version */
|
case 0x0009: /* HW Version */
|
||||||
*hi = HARDWARE_VER_MAIN; *lo = HARDWARE_VER_SUB; return 1;
|
*hi = HARDWARE_VER_MAIN; *lo = HARDWARE_VER_SUB; return 1;
|
||||||
case 0x000A: /* Freq Sens */
|
// case 0x000A: /* Freq Sens */
|
||||||
*hi = 0; *lo = g_loop_cng_unit.sensitvity & 0x0F; return 1;
|
// *hi = 0; *lo = g_loop_cng_unit.sensitvity & 0x0F; return 1;
|
||||||
case 0x000B: /* Condition */
|
// case 0x000B: /* Condition */
|
||||||
*hi = 0; *lo = g_loop_acs_info.condition; return 1;
|
// *hi = 0; *lo = g_loop_acs_info.condition; return 1;
|
||||||
case 0x000C: /* DIP Virtual: bit[7:4]=function_mode, bit[3:0]=fusion_mode */
|
// case 0x000C: /* DIP Virtual: bit[7:4]=function_mode, bit[3:0]=fusion_mode */
|
||||||
*hi = 0; *lo = (g_function_mode << 4) | (g_output_radar_mode & 0x0F); return 1;
|
// *hi = 0; *lo = (g_function_mode << 4) | (g_output_radar_mode & 0x0F); return 1;
|
||||||
|
|
||||||
/* 全数据块 0x0100–0x0112 — 热路径, 直接计算 */
|
/* 全数据块 0x0100–0x0112 — 热路径, 直接计算 */
|
||||||
default:
|
default:
|
||||||
@@ -615,34 +615,34 @@ static void handle_write_single_reg(const uint8_t *rx, uint8_t rx_len)
|
|||||||
|
|
||||||
/* 值校验 & 写入 */
|
/* 值校验 & 写入 */
|
||||||
switch (reg_addr) {
|
switch (reg_addr) {
|
||||||
case 0x0000: /* Sensitivity: 0-3 */
|
// case 0x0000: /* Sensitivity: 0-3 */
|
||||||
if (reg_val > 3) { send_exception(0x06, 0x03); return; }
|
// if (reg_val > 3) { send_exception(0x06, 0x03); return; }
|
||||||
g_loop_cng_unit.sensitvity = (uint8_t)reg_val;
|
// g_loop_cng_unit.sensitvity = (uint8_t)reg_val;
|
||||||
break;
|
// break;
|
||||||
case 0x0001: /* Fusion Mode: 0-6 */
|
// case 0x0001: /* Fusion Mode: 0-6 */
|
||||||
if (reg_val > 6) { send_exception(0x06, 0x03); return; }
|
// if (reg_val > 6) { send_exception(0x06, 0x03); return; }
|
||||||
g_output_radar_mode = (uint8_t)reg_val;
|
// g_output_radar_mode = (uint8_t)reg_val;
|
||||||
g_loop_cng_unit.direction_mode = (g_function_mode << 4) | (g_output_radar_mode & 0x0F);
|
// g_loop_cng_unit.direction_mode = (g_function_mode << 4) | (g_output_radar_mode & 0x0F);
|
||||||
break;
|
// break;
|
||||||
case 0x0002: /* Hold Time: 0-255 */
|
// case 0x0002: /* Hold Time: 0-255 */
|
||||||
g_loop_cng_unit.exist_mode = (uint8_t)reg_val;
|
// g_loop_cng_unit.exist_mode = (uint8_t)reg_val;
|
||||||
g_hold_time = (uint16_t)reg_val * 20 * 5;
|
// g_hold_time = (uint16_t)reg_val * 20 * 5;
|
||||||
break;
|
// break;
|
||||||
case 0x0003: /* Output Delay: 0-255 */
|
// case 0x0003: /* Output Delay: 0-255 */
|
||||||
g_loop_cng_unit.delay_time = (uint8_t)reg_val;
|
// g_loop_cng_unit.delay_time = (uint8_t)reg_val;
|
||||||
break;
|
// break;
|
||||||
case 0x0004: /* Freq Level: 0-1 */
|
// case 0x0004: /* Freq Level: 0-1 */
|
||||||
if (reg_val > 1) { send_exception(0x06, 0x03); return; }
|
// if (reg_val > 1) { send_exception(0x06, 0x03); return; }
|
||||||
g_freq_level = (uint8_t)reg_val;
|
// g_freq_level = (uint8_t)reg_val;
|
||||||
g_loop_cng_unit.loopFreq_Level = g_freq_level + 1;
|
// g_loop_cng_unit.loopFreq_Level = g_freq_level + 1;
|
||||||
break;
|
// break;
|
||||||
case 0x0009: /* BT Timeout: 0-255 */
|
// case 0x0009: /* BT Timeout: 0-255 */
|
||||||
g_max_counter_bt_min = (uint8_t)reg_val;
|
// g_max_counter_bt_min = (uint8_t)reg_val;
|
||||||
g_max_counter_bt_timeout = (uint32_t)reg_val * 60 * 1000;
|
// g_max_counter_bt_timeout = (uint32_t)reg_val * 60 * 1000;
|
||||||
break;
|
// break;
|
||||||
case 0x000A: /* Safe Timeout: 0-255 */
|
// case 0x000A: /* Safe Timeout: 0-255 */
|
||||||
g_loop_cng_unit.loopSafe_Timeout = (uint8_t)reg_val;
|
// g_loop_cng_unit.loopSafe_Timeout = (uint8_t)reg_val;
|
||||||
break;
|
// break;
|
||||||
case 0x0010: /* Auto Rpt Enable: 0-1 */
|
case 0x0010: /* Auto Rpt Enable: 0-1 */
|
||||||
if (reg_val > 1) { send_exception(0x06, 0x03); return; }
|
if (reg_val > 1) { send_exception(0x06, 0x03); return; }
|
||||||
_auto_rpt_enable = (uint8_t)reg_val;
|
_auto_rpt_enable = (uint8_t)reg_val;
|
||||||
@@ -833,11 +833,11 @@ void modbus_poll(void)
|
|||||||
if (crc_rx == crc_calc) {
|
if (crc_rx == crc_calc) {
|
||||||
switch (fc) {
|
switch (fc) {
|
||||||
case 0x02: handle_read_discrete_inputs(rx, len); break;
|
case 0x02: handle_read_discrete_inputs(rx, len); break;
|
||||||
case 0x03: handle_read_holding_regs(rx, len); break;
|
// case 0x03: handle_read_holding_regs(rx, len); break;
|
||||||
case 0x04: handle_read_input_regs(rx, len); break;
|
case 0x04: handle_read_input_regs(rx, len); break;
|
||||||
case 0x06: handle_write_single_reg(rx, len); break;
|
case 0x06: handle_write_single_reg(rx, len); break;
|
||||||
case 0x10: handle_write_multiple_regs(rx, len); break;
|
// case 0x10: handle_write_multiple_regs(rx, len); break;
|
||||||
case 0x11: handle_report_slave_id(rx, len); break;
|
// case 0x11: handle_report_slave_id(rx, len); break;
|
||||||
default: send_exception(fc, 0x01); break;
|
default: send_exception(fc, 0x01); break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user