433 lines
16 KiB
Markdown
433 lines
16 KiB
Markdown
# DLD154Pro 开发日志
|
||
|
||
> MCU: CH591R (RISC-V, BLE) @60MHz | 线圈通道: 1路 | 调试口: RS485 / BLE
|
||
|
||
---
|
||
|
||
## 2026-07-28 (傍晚) — 光耦参与模式下 LEDA 同步继电器状态
|
||
|
||
光耦参与模式 (MODE 2-6) 下,绿色 LED 原先跟随线圈 `FLAG_IN`/`FLAG_OUT` 变化,
|
||
在雷达单独触发(如人车混行防砸窗口)时 LED 不亮。修正为:
|
||
|
||
- TMR1 ISR 50ms 块末尾,`g_output_radar_mode >= 2` 且正常运行(非断开/非稳定期)时,
|
||
LEDA 直接跟随 `g_loop_acs_info.relay1_state`
|
||
- 断开/稳定期 200ms 闪烁优先级不变(5ms 段优先处理)
|
||
|
||
> 效果:继电器吸合→绿灯亮,继电器释放→绿灯灭,与线圈或雷达触发源无关。
|
||
|
||
---
|
||
|
||
## 2026-07-28 (午后) — 光耦输出模式完整实现:6 种融合逻辑 + 状态机
|
||
|
||
### 架构
|
||
|
||
`opt_input_poll()` 处理光耦输入 → 产出 `g_opt_trigger` (1=有效) → TMR1 ISR 继电器输出段 `case 0` 根据 `g_output_radar_mode` 做融合判决。
|
||
|
||
```
|
||
光耦 PB10 → 3样本多数表决防抖 → opt_input_poll() → g_opt_trigger
|
||
↓
|
||
线圈 VD_FLAG/FLAG_OUT → coil_sig ──────────→ 融合判决 → RLY1
|
||
↑
|
||
g_output_radar_mode
|
||
```
|
||
|
||
### 各模式实现
|
||
|
||
| 模式 | 值 | `opt_input_poll()` | 继电器 `case 0` 融合公式 |
|
||
|------|-----|-------------------|--------------------------|
|
||
| LOOP_X_RESET | 0 | 光耦复位 (400ms低→上升沿→SYS_ResetExecute) | `coil_sig` |
|
||
| LOOP_ONLY | 1 | return, g_opt_trigger=0 | `coil_sig` |
|
||
| RADAR_ONLY | 2 | g_opt_trigger = 光耦信号 | `g_opt_trigger` |
|
||
| LOOP_OR_RADAR | 3 | g_opt_trigger = 光耦信号 | `coil_sig \|\| g_opt_trigger` |
|
||
| LOOP_AND_RADAR | 4 | g_opt_trigger = 光耦信号 | `coil_sig && g_opt_trigger` |
|
||
| HUMAN_VD_MIX | 5 | 状态机 (见下) | `coil_sig \|\| g_opt_trigger` |
|
||
| ETC | 6 | 状态机 (见下) | `coil_sig \|\| g_opt_trigger` |
|
||
|
||
> 注: `coil_sig = (loop1_VD_FLAG | loop1_FLAG_OUT)` — 含离开脉冲保持
|
||
|
||
### HUMAN_VD_MIX 状态机 (人车混行防砸)
|
||
|
||
```
|
||
IDLE (雷达屏蔽, 仅线圈)
|
||
│ 线圈检测到车
|
||
▼
|
||
ARMED (雷达解禁, 线圈||雷达)
|
||
│ 两者均释放
|
||
▼
|
||
WINDOW (3s 防砸窗口)
|
||
│ 雷达触发 → g_opt_trigger=1 → 继电器吸合, 窗口复位
|
||
│ 线圈上线 → 回到 ARMED
|
||
│ 3s 超时无触发 → 回到 IDLE, 落杆
|
||
```
|
||
|
||
定时参数: `OPT_VM_WINDOW_TICK = 600` (600×5ms = 3s)
|
||
|
||
### ETC 状态机
|
||
|
||
```
|
||
IDLE (雷达屏蔽, 仅线圈)
|
||
│ 线圈检测到车
|
||
▼
|
||
ARMED (雷达解禁, 线圈||雷达)
|
||
│ 两者均释放
|
||
▼
|
||
DEBOUNCE (500ms 防抖)
|
||
│ 线圈/雷达重新触发 → 回到 ARMED
|
||
│ 500ms 超时 → 回到 IDLE, 落杆
|
||
```
|
||
|
||
定时参数: `OPT_ETC_DEBOUNCE_TICK = 100` (100×5ms = 500ms)
|
||
|
||
### 光耦防抖
|
||
|
||
所有非复位模式共用 3 样本多数表决 (`OPT_DEBOUNCE_CNT=6`): 最近 3 次采样中 ≥2 票即判定有效,等效 ~30ms 消抖。
|
||
|
||
### 文件变更
|
||
|
||
| 文件 | 变更 |
|
||
|------|------|
|
||
| `peripheral_main.c` | +`g_opt_trigger` 全局变量, `opt_input_poll()` 重写 (120→180行), TMR1 ISR `case 0` 融合判决 |
|
||
| `cmcng.h` | +`extern uint8_t g_opt_trigger` |
|
||
|
||
---
|
||
|
||
## 2026-07-28 — 光耦输出模式升级:`DLD_OUTPUT_MODE` 枚举 + `direction_mode` 低四位取值
|
||
|
||
### 背景
|
||
|
||
光耦输入功能从原来的「二值化开关」(使能/复位)升级为 **7 种输出模式**,
|
||
由 `direction_mode` 字节的低四位选择。`g_fm_radar_input_disable`(来自 `function_mode` bit1)
|
||
更名为 `g_output_radar_mode`,语义从布尔值变为枚举值。
|
||
|
||
### `DLD_OUTPUT_MODE` 枚举
|
||
|
||
```c
|
||
typedef enum _DLD_OUTPUT_MODE
|
||
{
|
||
OUTPUT_MODE_LOOP_X_RESET = 0, // 光耦输入为复位信号,仅地感检测输出
|
||
OUTPUT_MODE_LOOP_ONLY, // 仅地感,光耦输入无效
|
||
OUTPUT_MODE_RADAR_ONLY, // 仅光耦(雷达输出接光耦输入),地感无效
|
||
OUTPUT_MODE_LOOP_OR_RADAR, // 地感或雷达
|
||
OUTPUT_MODE_LOOP_AND_RADAR, // 地感和雷达
|
||
OUTPUT_MODE_HUMAN_VD_MIX, // 人车混行防砸:有车后光耦/地感"或",离场 3s 内光耦有效持续防砸
|
||
OUTPUT_MODE_ETC, // ETC:有车后光耦/地感"或",光耦断开需 500ms 防抖才释放继电器
|
||
}DLD_OUTPUT_MODE;
|
||
```
|
||
|
||
### 变量与取值变更
|
||
|
||
| 项目 | 旧 | 新 |
|
||
|------|-----|-----|
|
||
| 全局变量名 | `g_fm_radar_input_disable` | `g_output_radar_mode` |
|
||
| 符号类型 | bit (0/1) | `uint8_t` (0~6) |
|
||
| 取值来源 | `(function_mode >> 1) & 0x01` | `direction_mode & 0x0F` |
|
||
| 解析位置 | `peripheral_main.c:para_store_init()` + `dbn_ble_srv.c:unpack_pkg_set_cjq_param()` | 同上 |
|
||
| BLE 回读字段 | `g_function_mode` | `g_loop_cng_unit.direction_mode` (完整 8 位) |
|
||
| `opt_input_poll` 门控 | `if (g_fm_radar_input_disable == 0)` → 雷达模式 return | `if (g_output_radar_mode)` → 非 0 模式 return |
|
||
|
||
### 实现状态
|
||
|
||
| 模式 | 状态 | 说明 |
|
||
|------|------|------|
|
||
| 0 — LOOP_X_RESET | ✅ 已实现 | PB10 低电平 ≥400ms(80 tick×5ms)后上升沿 `SYS_ResetExecute()` 芯片复位 |
|
||
| 1~6 | ❌ 未实现 | `opt_input_poll()` 中直接 return |
|
||
|
||
### 文件变更
|
||
|
||
| 文件 | 变更 |
|
||
|------|------|
|
||
| `storage.h` | +`DLD_OUTPUT_MODE` 枚举 (7 种模式) |
|
||
| `cmcng.h` | `g_fm_radar_input_disable` → `g_output_radar_mode` |
|
||
| `peripheral_main.c` | 变量更名 + 解析路径改 `direction_mode & 0x0F` |
|
||
| `dbn_ble_srv.c` | 同上 + BLE 回读改用 `direction_mode` 完整字段 |
|
||
|
||
---
|
||
|
||
## 2026-07-22 — BLE 新增 RS485 地址/波特率读写 + 空闲关蓝牙超时 + 功能码细分
|
||
|
||
### 新增 BLE 命令
|
||
|
||
**`CMD_DBN_RW_UART_BAUD (0x31)`** — 读写 RS485 通信参数:
|
||
|
||
| 字节偏移 | 字段 | 说明 |
|
||
|---------|------|------|
|
||
| [4] | RW | 0=读, 1=写 |
|
||
| [5] | BT_close_min | 蓝牙空闲超时关闭时间 (分钟), 0=不关闭 |
|
||
| [6:8] | baud_rate | RS485 波特率 (3 字节, little-endian) |
|
||
| [9] | rs485_id | RS485 从机地址 (1-247) |
|
||
| [10:12] | reserved | 预留 |
|
||
|
||
- 读:返回当前存储值 + status=0
|
||
- 写:写入 RAM 并持久化到 DataFlash (`ADDR_BT_Close_TIMEOUT_Offset` 起 5 字节)
|
||
|
||
### Flash 存储布局
|
||
|
||
```
|
||
0x10 ADDR_BT_Close_TIMEOUT_Offset 1B 蓝牙空闲超时 (分钟)
|
||
0x11 Addr_RS485_Baud_Offset 3B RS485 波特率 (LE32)
|
||
0x14 Addr_RS485_ID_Offset 1B RS485 从机地址
|
||
```
|
||
|
||
出厂默认:RS485 ID=1, 波特率=9600, 蓝牙超时=0(不关闭)
|
||
|
||
### 功能码细分 (g_function_mode)
|
||
|
||
`g_function_mode` 取自 `direction_mode` 高 4 位,低 2 位细分:
|
||
|
||
| bit | 字段 | 0 | 1 |
|
||
|-----|------|---|---|
|
||
| bit0 | `g_fm_700bs_disable` | **700BS 协议** | Modbus 协议 |
|
||
| bit1 | `g_fm_radar_input_disable` | **光耦输入使能** | 光耦输入复位 |
|
||
|
||
> RS485 将支持两种协议:700BS(后续上传)和 Modbus。通过小程序设置 `direction_mode` 高 4 位的 bit0 切换。
|
||
|
||
### 文件变更
|
||
|
||
| 文件 | 变更 |
|
||
|------|------|
|
||
| `dbn_ble_srv.h` | +`CMD_DBN_RW_UART_BAUD 0x31` |
|
||
| `cmcng.h` | +extern 声明: `fm_700bs_disable`, `fm_radar_input_disable`, uart/bt 配置 |
|
||
| `storage.h` | +Flash 地址宏: BT_timeout, RS485_baud, RS485_ID |
|
||
| `peripheral_main.c` | +全局变量定义, factory_dev 默认值, para_store_init 恢复 |
|
||
| `dbn_ble_srv.c` | +`CMD_DBN_RW_UART_BAUD` handler, unpack 中解析 function_mode bits |
|
||
|
||
### 待办
|
||
|
||
- [ ] RS485 700BS 协议定义
|
||
- [ ] RS485 Modbus 协议定义
|
||
- [ ] RS485 串口中断收发实现 (UART0)
|
||
- [ ] 蓝牙空闲超时自动关闭逻辑
|
||
|
||
---
|
||
|
||
## 2026-07-21 — 灵敏度等级与 ΔL/L 的物理关系分析
|
||
|
||
### 参数表
|
||
|
||
```c
|
||
// sens_in: 进入阈值, sens_out: 离开阈值 (0=最低, 3=最高)
|
||
SensTable = { 108, 54, 28, 14 }; // 进入
|
||
SensTable1 = { 81, 32, 16, 12 }; // 离开
|
||
```
|
||
|
||
### 计算链路
|
||
|
||
**Step 1:阈值差值**
|
||
```c
|
||
loop1_dlt_ORG = (Origin * sens) >> 16; // = Origin × sens / 65536
|
||
```
|
||
|
||
**Step 2:进入判定**
|
||
```c
|
||
if (CAPVD < Origin - dlt_ORG) // ← ΔCAPVD / Origin > sens / 65536
|
||
```
|
||
|
||
**Step 3:CAPVD → 电感**
|
||
|
||
线圈振荡频率 `f ∝ 1/√L`,周期 `T ∝ √L`。测量窗 CAPVD 正比于平均周期:
|
||
|
||
```
|
||
ΔCAPVD / Origin = ΔT / T₀ = (√L - √L₀) / √L₀
|
||
```
|
||
|
||
对微小变化泰勒展开:`dT/T ≈ dL/(2L)`,即:
|
||
|
||
```
|
||
ΔL / L ≈ 2 × ΔCAPVD / Origin
|
||
```
|
||
|
||
**Step 4:最终 ΔL/L 公式**
|
||
|
||
```
|
||
ΔL/L_entry = 2 × sens_in / 65536
|
||
ΔL/L_exit = 2 × sens_out / 65536
|
||
```
|
||
|
||
### 灵敏度等级对应 ΔL/L
|
||
|
||
| 等级 | sens_in | ΔL/L 进入 | sens_out | ΔL/L 离开 | 迟滞比 |
|
||
|------|---------|----------|----------|----------|--------|
|
||
| 低 (0) | 108 | **0.330%** | 81 | **0.247%** | 1.33 |
|
||
| 中 (1) | 54 | **0.165%** | 32 | **0.098%** | 1.69 |
|
||
| 高 (2) | 28 | **0.085%** | 16 | **0.049%** | 1.75 |
|
||
| 最高(3) | 14 | **0.043%** | 12 | **0.037%** | 1.17 |
|
||
|
||
### 物理验证
|
||
|
||
典型 100μH 线圈:
|
||
- 现代轿车经过:ΔL/L ≈ 5%–15%,任一灵敏度均能可靠触发
|
||
- 高灵敏度 0.085%:足够敏感,需注意温漂(~20°C 引起约 0.1% 的感量偏移)和邻道串扰
|
||
- 迟滞比 1.33–1.75:防止车辆边界状态反复跳变,低灵敏度迟滞最小
|
||
|
||
### 快速换算
|
||
|
||
`sens` 值直接对应 **千分之 2×sens 的感量变化百分比**——除以 1000 就是 ΔL/L(%)。
|
||
|
||
---
|
||
|
||
## 2026-07-21 (午后) — 修复灵敏度 bug + 有限存在时间 + 版本号
|
||
|
||
### BLE 灵敏度无法修改
|
||
|
||
**根因:** 硬件适配时删了 `poll_sens_key()`,在 `INIT_VD()` 中硬编码了 `g_freq_sens = 2`,
|
||
但未在 BLE 参数解包 `unpack_pkg_set_cjq_param()` 中同步更新,导致小程序修改灵敏度无效。
|
||
|
||
**修复:**
|
||
- `peripheral_main.c`: `g_freq_sens` 从 `INIT_VD()` 移到 `para_store_init()`,
|
||
从存储的 `g_loop_cng_unit.sensitvity` 读取:`(sensitvity > 0) ? (sensitvity - 1) : 0`
|
||
- `dbn_ble_srv.c`: `unpack_pkg_set_cjq_param()` 中同样增加 `g_freq_sens` 同步更新,
|
||
确保 BLE 小程序实时修改后立即生效
|
||
|
||
### 有限存在时间公式对齐
|
||
|
||
`dbn_ble_srv.c` 中 `g_hold_time` 计算写的是 `exist_mode * 30 * 20`,
|
||
但 `para_store_init()` 中用的是 `exist_mode * 20 * 5`(50ms tick)。
|
||
统一为 `20 * 5`(对应参数值 × 100ms × 5s 基础周期)。
|
||
|
||
### 版本号
|
||
|
||
- 固件: `4.01` → `3.00`
|
||
- 硬件: `1.00` → `3.01`
|
||
|
||
---
|
||
|
||
## 2026-07-21 — 项目初始化:从 DLD110SV4 复制基线 + 按硬件资源文档调整 IO
|
||
|
||
### 背景
|
||
|
||
DLD154Pro 是 DLD110SV4 的硬件升级版(同 MCU CH591R),核心变更:
|
||
- 继电器 双路→单路(删 RLY2)
|
||
- 删除拨码开关(灵敏度改由小程序设置)
|
||
- 线圈调频 两级→一级(删 PA13 FLEVEL_L)
|
||
- 新增 RS485 接口(PA14/PA15/PA13,协议待定)
|
||
- 新增光耦输入(PB10,逻辑待定)
|
||
- 指示灯从单色→双色(LEDA 绿 + LEDB 红呼吸灯)
|
||
- DEBUG UART0 被 RS485 占用,删除全部
|
||
|
||
### 仓库
|
||
|
||
- 远程: http://118.178.252.17:3000/wangfq/DLD154Pro
|
||
- 本地: `/home/wfq/projects/vd_detector/DLD154Pro`
|
||
- commit `5f5f697`: init 基线
|
||
- commit `91ba844`: feat 硬件适配
|
||
|
||
### IO 宏重定义
|
||
|
||
| 引脚 | 旧(DLD110SV4) | 新(DLD154Pro) |
|
||
|------|--------------|---------------|
|
||
| PA8 | RLY1 (存在) | RLY1 (存在,不变) |
|
||
| PB23 | RLY2 (功能/脉冲) | **LEDB (红色呼吸灯)** |
|
||
| PA12 | FLEVEL_H (33nF) | FLEVEL (33nF,一级) |
|
||
| PA13 | FLEVEL_L (10nF) | **UART0_RE (RS485 方向)** |
|
||
| PA14 | KEY_SA1 / DEBUG_TX | **UART0_TX (RS485)** |
|
||
| PA15 | KEY_SA2 / DEBUG_RX | **UART0_RX (RS485)** |
|
||
| PB10 | - | **IN_1 (光耦输入)** |
|
||
| PB22 | LEDA (绿色) | LEDA (绿色,不变) |
|
||
|
||
### 删除项
|
||
|
||
- `RLY2_ON/OFF` 宏及全部 RLY2 输出逻辑
|
||
- `KEY_SA1/KEY_SA2` 宏及 `poll_sens_key()` 函数
|
||
- `FLEVEL_L_LOW/HIGH`, `FLEVEL_H_LOW/HIGH` → 改为 `FLEVEL_LOW/HIGH`
|
||
- `g_flag_output`, `g_xn_counter` 全局变量
|
||
- DEBUG UART0 初始化 (`gpio_uart_init` 中 `#ifdef DEBUG` 块)
|
||
- `Main_Circulation` 中 `#ifdef DEBUG` PRINT 块
|
||
- TMR1_ISR 中 `_cnt` / `g_flag_output` DEBUG 定时器
|
||
- TMR0_ISR 中 `g_xn_counter` DEBUG 计数器
|
||
- `para_store_init()` 中频率四档 switch → 双档 if/else
|
||
|
||
### 新增/预留
|
||
|
||
- RS485 引脚宏: `RS485_TX_PIN`, `RS485_RX_PIN`, `RS485_RE_PIN`, `RS485_RE_TX()`, `RS485_RE_RX()`(仅初始化引脚,协议待定)
|
||
- 光耦输入宏: `OPT_IN1`(仅初始化 PB10 输入上拉,逻辑待定)
|
||
- LEDB 宏: `LEDB_ON/OFF`(PB23,低电平有效)
|
||
- `g_freq_sens = 2` 默认最高灵敏度(取代 poll_sens_key 拨码逻辑)
|
||
|
||
### 继电器输出简化
|
||
|
||
| 模式 | 旧 (双继电器) | 新 (单继电器) |
|
||
|------|-------------|---------------|
|
||
| case 0: 存在输出 | RLY1 跟随 VD, RLY2 跟随 VD | RLY1 跟随 VD |
|
||
| case 1: 进入脉冲 | RLY2=存在, RLY1=进入脉冲 | RLY1=进入脉冲 |
|
||
| case 2: 离开脉冲 | RLY2=存在, RLY1=离开脉冲 | RLY1=离开脉冲 |
|
||
| default | RLY2=存在 | RLY1=存在 |
|
||
|
||
### 保留(协议兼容)
|
||
|
||
- `storage.h` 的 `Loop_ACS_Info.relay2_cng/relay2_state` 字段保留,默认值=0
|
||
- `dbn_ble_srv.c:468` 上报字节 relay2 位自动为 0(字段初始化为 0 后无写入)
|
||
|
||
### 待办
|
||
|
||
- [x] RS485 通信协议定义 + UART0 中断/收发实现 ~~(2026-07-24 完成)~~
|
||
- [ ] 光耦输入逻辑(与其他检测器联动 / 综合判断)
|
||
- [ ] IAP/OTA 项目文件中的 DLD110S 引用更新(`592OnlyUpdateApp_*`)
|
||
- [ ] `.mrs/` 工作区文件清理(大量 DLD110S 历史快照)
|
||
|
||
---
|
||
|
||
## 2026-07-23~24 — RS485 700BS 协议实现 & 四级灵敏度
|
||
|
||
### RS485 700BS 从机协议
|
||
|
||
| 项目 | 说明 |
|
||
|------|------|
|
||
| 物理层 | RS485 半双工, 9600 8N1, PA14=TX PA15=RX PA13=RE |
|
||
| 帧格式 | 主机 3 字节 (STX ADDR XOR), 从机 3~9 字节变长 |
|
||
| 心跳 | 空闲 5s / 故障(线圈断开) 1s / 事件(car_state翻转)立即 |
|
||
| 命令 | 0xFA 查询状态, 0x1B 查询频率, 0x2C 复位线圈, 0x3D 查询DIP |
|
||
|
||
**文件:** `APP/rs485_700bs.c` (新增), `APP/include/rs485_700bs.h` (新增)
|
||
|
||
### 踩坑记录
|
||
|
||
1. **UART0 API 不兼容** — CH592 SDK 中 `UART0_GetITFlag()` 是无参宏(非函数),`UART0_ClearITFlag()` 不存在。改用 `switch(UART0_GetITFlag())` 标准模式,参考 UART1 例程。
|
||
|
||
2. **`while(R8_UART0_TFC == 0)` 死循环** — TX FIFO 空时条件永真,主循环卡死导致地感不工作。修正为 `!= 0`(等 FIFO 空再写下一字节)。
|
||
|
||
3. **`rs485_init()` 从未被调用** — `gpio_uart_init()` 只写了注释 `/* 由 rs485_init() 统一初始化 */` 但未实际调用,UART0/GPIO 未配置。修复:替换注释为函数调用。
|
||
|
||
4. **频率始终为 0** — `g_loop_acs_info.frequent` 只在 BLE 报告路径 `usart_packet_processing_acs_loop` 中更新,BLE 断开时永不执行 → freq=0。
|
||
|
||
5. **频率非实时** — 改用 `g_loop_acs_info.loop_capvd` 仍有问题:该值被 `flag_change` 门控冻结(上电/车辆进出时 `flag_change=1`→capvd 不更新,清零只在 BLE 报告路径)。最终方案:直接使用 `loop1_CAPVD`(`vd1_task()` 每次实时 IIR 滤波值),不经过 BLE 通道。
|
||
|
||
**最终频率计算:**
|
||
```c
|
||
freq = (uint64_t)FREQ_SYS * loop1_LPCNT / loop1_CAPVD + 360
|
||
```
|
||
|
||
### 四级灵敏度
|
||
|
||
`MAX_LOOP_SENS_AMOUNT`: 3 → 4
|
||
|
||
新增第四档:进入阈值 14, 离开阈值 12 (ΔL/L≈0.04%),适用于极高灵敏度场景(如摩托车/小型车辆检测)。需注意温漂影响——20°C 温度变化可引起约 0.1% 感量偏移,第四档信噪比余量仅约 2:1。
|
||
|
||
---
|
||
|
||
## 2026-07-24 (傍晚) — 光耦输入复位功能 & mstick() 时间单位修正
|
||
|
||
### 光耦输入复位 (`opt_input_poll`)
|
||
|
||
| 项目 | 说明 |
|
||
|------|------|
|
||
| 引脚 | PB10 (IN_1), 内部上拉, 光耦干接点输入 |
|
||
| 使能条件 | `g_fm_radar_input_disable == 1` |
|
||
| 触发逻辑 | 干接点接通(PB10=0) ≥500ms → 断开(上升沿) → `SYS_ResetExecute()` |
|
||
| 消抖 | <500ms 短脉冲上升沿清零计时, 不触发 |
|
||
|
||
**关键修复:PB10 数字输入使能**
|
||
|
||
`R32_PIN_CONFIG2` 寄存器中 `RB_PIN_PB10_15_DIS` 默认置位(关闭数字输入省电)。`GPIOB_ModeCfg(..., GPIO_ModeIN_PU)` 只配置了上下拉和方向,数字输入通路在更底层被掐断。修复:`R32_PIN_CONFIG2 &= ~(1UL << 26)`。
|
||
|
||
### mstick() 时间单位修正
|
||
|
||
`mstick()` = `TimingDelayInc`,在 TMR1 ISR (5ms 间隔) 中递增。**单位是 5ms/tick,不是毫秒。**
|
||
|
||
| 位置 | 原来 | 修正后 | 实际时间 |
|
||
|------|------|--------|---------|
|
||
| `opt_input_poll` 阈值 | `>= 500` | `>= 100` | 500ms |
|
||
| `RS485_HEARTBEAT_MS` | 5000 | 1000 | 5s |
|
||
| `RS485_FAULT_MS` | 1000 | 200 | 1s |
|
||
|
||
> 帧超时 `mstick() - _rx_last_tick > 10`(=50ms)保留未改,对 9600 波特率够用。
|