REFpowerControl_V1 — 制冷电源控制板固件
基于 ArteryTek AT32F403AVGT7 (ARM Cortex-M4F, 240MHz, 1MB Flash, 96KB SRAM) 的 Peltier 半导体制冷控制系统。
┌──────────────────────────────────────────────────────────────────────────┐
│ 应用层 (ucode/) │
│ PID温控 温度管理 注水阀FSM 触摸按键 数码管显示 LED/蜂鸣器 │
│ 液位联锁 传感器输入 DS18B20 设备控制 │
├──────────────────────────────────────────────────────────────────────────┤
│ BSP层 (project/src/) │
│ 主循环(main.c) 中断处理(int.c) 时钟/GPIO/定时器/DMA/USART配置 │
├──────────────────────────────────────────────────────────────────────────┤
│ HAL层 (libraries/drivers/) │
│ AT32F403A_407 标准外设库 (StdPeriph) │
├──────────────────────────────────────────────────────────────────────────┤
│ CMSIS层 (libraries/cmsis/) │
│ Cortex-M4 内核抽象层 启动文件 链接脚本 │
└──────────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────┐
│ TMR4 (1kHz) │
│ TouchKey_Scan() → 4路电容触摸按键消抖与状态机 │
│ SensorInput_Scan() → SER_IN_1/2/3 50ms消抖 │
│ └─ FluidInterlock_Tmr4Tick() → 液位/流量联锁 │
└──────────────┬──────────────────────────┬───────────┘
│ │
▼ ▼
┌──────────────────────────┐ ┌─────────────────────────┐
│ TMR3 (1kHz) │ │ TMR1 (10kHz) │
│ DigitTube_Scan() │ │ LED_Thread() │
│ → 数码管扫描 │ │ → LED闪烁+蜂鸣器 │
└──────────────────────────┘ └─────────────────────────┘
┌─────────────────────────────────────────────────────┐
│ main.c 超循环 │
│ │
│ while(1) { │
│ TouchKey_EventProcess(); // 按键事件 │
│ ValveControl_Process(); // 注水阀FSM │
│ │
│ if (DS18B2O 温度就绪) { │
│ TempControl_Compute(); // PID+风扇/水泵 │
│ DigitTube_DisplayTemp(); // 刷新显示 │
│ } │
│ } │
└─────────────────────────────────────────────────────┘
① wk_system_clock_config() 系统时钟 (HICK+PLL→240MHz)
② wk_periph_clock_config() 外设时钟使能 (GPIO A/B/C/D/E, TMR1-5, USART1, DMA1)
③ wk_debug_config() 释放JTAG/SWD调试引脚
④ wk_nvic_config() 中断优先级分组 + 使能各中断
⑤ wk_timebase_init() SysTick延时基准 (us/ms)
⑥ wk_gpio_config() GPIO初始化
⑦ wk_dma1_channel1/2_init() USART1 DMA配置
⑧ wk_usart1_init() USART1 115200/8N1
⑨ wk_tmr1~5_init() 定时器初始化
⑩ 业务模块初始化:
DeviceControl_Init() → 7路设备GPIO (默认关闭)
SensorInput_Init() → 传感器消抖状态清零
FluidInterlock_Init() → 液位联锁定时参数
ValveControl_Init() → 注水阀FSM复位
TouchKey_Init() → 按键状态清零
DigitTube_Init() → 数码管GPIO+定时器
TempControl_Init() → 温控器初始化 (风扇/水泵默认关)
CoolingPID_Init() → PID参数初始化 (Kp=10, Ki=0.5, Kd=2)
DS18B20_Init() → DS18B20传感器搜索
LED_PowerIndicator_Set(0) → 电源指示灯默认关
BEEP_Control(1000, 1) → 开机蜂鸣器提示
HEXT (8MHz) ─┐
├── PLL(x60) ──→ SCLK = 240MHz ──→ AHB = 240MHz
HICK (8MHz) ─┘ │
┌───────┴───────┐
▼ ▼
APB1=120MHz APB2=120MHz
(TMR2~5: 240M) (TMR1: 240M)
模块1: PID温度控制 (Cooling PID)
增量式 PID 控制器,计算 Peltier 制冷片的目标占空比,通过 PWM 输出驱动。
CoolingPID_Compute()
├─ 联锁检查: 水泵未允许 或 SER2无效 → 关闭PID, 占空比=0
├─ 滞回判定: 温度 > 12°C → 激活PID
│ 温度 < 4°C → 停用PID
├─ PID计算 (Ki有下界钳位0, 无负积分):
│ error = target(8°C) - current_temp
│ integral += error (上限50.0, 下限0.0)
│ derivative = error - prev_error
│ output = Kp*error + Ki*integral + Kd*derivative (钳位0~100)
├─ 占空比映射: output < 20% → 输出0; 否则输出output%
└─ CoolingPID_SetPWMDuty() → 写TMR2_CH4 CCR
外设
用途
TMR2
PWM 发生器 (1kHz, CH4)
SW_REF (PB11)
PWM 输出引脚 → Peltier 驱动 (GPIO 复用模式, 配置在 wk_tmr2_init)
注: SW_REF 的 GPIO 配置在 wk_tmr2_init() 中完成 (GPIO_MODE_MUX + GPIO 重映射 TMR2_GMUX_10),不在 wk_gpio_config 中处理。
信号
端口
引脚
复用功能
SW_REF
GPIOB
11
TMR2_CH4 (PWM输出), IO 重映射 TMR2_GMUX_10
文件
说明
ucode/cooling_pid.h
结构体定义、常量宏、函数声明
ucode/cooling_pid.c
PID 算法实现、PWM 输出控制
函数
调用位置
说明
CoolingPID_Init()
main.c 初始化
设置默认 Kp/Ki/Kd, 目标温度8°C, 关闭PWM输出
CoolingPID_Compute()
temp_control.c → TempControl_Compute()
核心PID计算,含联锁检查+滞回+防积分饱和
CoolingPID_SetPWMDuty()
本文件内部
写TMR2_CH4 CCR寄存器,控制占空比
宏
值
说明
COOLING_PID_TARGET_TEMP
8.0°C
PID 目标温度
COOLING_PID_ON_THRESHOLD
12.0°C
PID 开启温度
COOLING_PID_OFF_THRESHOLD
4.0°C
PID 关闭温度
COOLING_PID_MIN_DUTY
20%
最小有效占空比
COOLING_PID_MAX_DUTY
100%
最大占空比
COOLING_PID_INTEGRAL_MAX
50.0
积分上限 (抗饱和)
COOLING_PID_DEFAULT_KP
10.0
比例系数
COOLING_PID_DEFAULT_KI
0.5
积分系数
COOLING_PID_DEFAULT_KD
2.0
微分系数
协调 PID 控制器与风扇/水泵的开关控制,根据温度滞回阈值决策。
TempControl_Compute()
├─ 更新当前温度
├─ 滞回控制:
│ 温度 > 12°C → 开启风扇1、水泵1
│ 温度 < 4°C → 关闭风扇1、水泵1
│ 中间区域 → 保持当前状态
├─ 水泵1受液位联锁约束 (wpump1_allowed)
└─ 调用 CoolingPID_Compute() 计算PID
外设
用途
SW_FAN_1 (PA12)
风扇1 控制输出
SW_WPUMP_1 (PA15)
水泵1 控制输出
信号
端口
引脚
有效电平
SW_FAN_1
GPIOA
12
低电平=开启 (GPIO复位)
SW_WPUMP_1
GPIOA
15
低电平=开启 (GPIO复位)
文件
说明
ucode/temp_control.h
TempController_t 结构体, 函数声明
ucode/temp_control.c
温度管理调度, 风扇/水泵GPIO直操
函数
调用位置
说明
TempControl_Init()
main.c 初始化
清零状态, 关风扇/水泵
TempControl_Enable()
初始化后
预留启用接口
TempControl_Disable()
—
强制关风扇/水泵 + PID
TempControl_Compute()
main.c 主循环
核心控制: 滞回判定 + GPIO输出 + PID调用
模块3: 注水阀控制 (Valve Control)
基于 SER_IN_1 (PD12) 液位信号,通过 6 状态 FSM 控制 SW_VALVE_1 (PD15) 阀门。上电初始化阶段和系统运行阶段采用不同的时间阈值。
┌──────────────────────────────────────────────┐
│ │
▼ │
┌──────────┐ SER_IN_1=H ┌────────────────┐ │
│ INIT │────────────→│ INIT_HIGH_WAIT │ │
│ (关阀) │←─消抖复位──│ (等待H持续1s) │ │
└──────────┘ └───────┬────────┘ │
│ H持续≥1s │
▼ │
┌──────────┐ ┌────────────────┐ │
│ RUNNING │←────────────│ OPEN │ │
│ (等待H) │ SER_IN_1=H│ (开阀成功) │ │
└─────┬────┘ (RUN阶段) └───────┬────────┘ │
│ │ │
│ SER_IN_1=H │ SER_IN_1=L │
▼ ▼ │
┌──────────┐ ┌────────────────┐ │
│RUNNING_ │────────────→│ OPEN_LOW_WAIT │ │
│HIGH_WAIT │ H持续≥10s │ (等待L持续5s) │ │
│(等待H) │ 开阀 └───────┬────────┘ │
└──────────┘ │ L持续≥5s │
▼ │
┌──────────┐──────────────────────┘
│ RUNNING │
└──────────┘
阶段
条件
阈值
动作
初始化
SER_IN_1=H 持续
1000ms (1s)
开阀 → OPEN
初始化
SER_IN_1=L 持续
50ms (消抖)
回 INIT
运行
脱离 OPEN 后
立即进入
OPEN_LOW_WAIT
开阀后
SER_IN_1=L 持续
5000ms (5s)
关阀 → RUNNING
运行
SER_IN_1=H 持续
10000ms (10s)
开阀 → OPEN
运行
SER_IN_1=L 持续
50ms (消抖)
回 RUNNING
外设
用途
SER_IN_1 (PD12)
液位传感器输入 (低电平=有液)
SW_VALVE_1 (PD15)
阀门控制输出
信号
端口
引脚
有效电平
SER_IN_1
GPIOD
12
低=有液; 高=无液
SW_VALVE_1
GPIOD
15
低电平=开阀
文件
说明
ucode/valve_control.h
6状态枚举, 时间阈值宏, 函数声明
ucode/valve_control.c
FSM实现, 读取SER_IN_1, 控制SW_VALVE_1
函数
调用位置
说明
ValveControl_Init()
main.c 初始化
状态→INIT, 关阀
ValveControl_Process()
main.c 主循环
读取SER_IN_1电平, 驱动6状态FSM
ValveControl_ForceClose()
外部调用
强制复位到INIT并关阀
ValveControl_IsValveOpen()
查询接口
返回当前阀门开关状态
函数
用途
valve_read_ser_in1()
读取SER_IN_1 GPIO电平
valve_set_output()
设置SW_VALVE_1 GPIO
valve_state_init_handler()
INIT 状态处理
valve_state_init_high_wait_handler()
INIT_HIGH_WAIT 状态处理
valve_state_open_handler()
OPEN 状态处理 (过渡到 OPEN_LOW_WAIT)
valve_state_open_low_wait_handler()
OPEN_LOW_WAIT 状态处理
valve_state_running_handler()
RUNNING 状态处理
valve_state_running_high_wait_handler()
RUNNING_HIGH_WAIT 状态处理
模块4: 液位/流量联锁 (Fluid Flow Interlock)
检测液位 (SER_IN_1) 和流量/联锁信号 (SER_IN_2),控制制冷系统是否允许运行。低电平有效,1s 消抖确认,周期性检测,超时报警。
SER_IN_1 液位检测:
在 TMR4 中断中每 1ms 采样:
┌─ SER_IN_1=低(有液) → liquid_streak++ → ≥1000次 → liquid_ok=1
└─ SER_IN_1=高(无液) → dry_streak++ → ≥1000次 → liquid_ok=0, no_liquid=1
检测周期:
前5次: 每30秒检测一次 (DETECT_INTERVAL_FIRST)
之后: 每60秒检测一次 (DETECT_INTERVAL_LATER)
SER_IN_2 流量联锁:
┌─ SER_IN_2=低(有效) → valid_streak++ → ≥1000次 → ser2_low_level=1
└─ SER_IN_2=高(无效) → invalid_streak++ → ≥1000次 → ser2_low_level=0
报警状态机:
无液持续时间 ≥ 5分钟 → ALARM_ACTIVE (蜂鸣器1s间隔交替鸣响)
报警持续时间 ≥ 3分钟 → ALARM_SILENT (蜂鸣器静音)
有液恢复 → ALARM_IDLE (清除报警)
报警时主循环显示 Err 99
外设
用途
SER_IN_1 (PD12)
液位检测输入 (低电平=有液)
SER_IN_2 (PD13)
流量/联锁输入 (低电平=允许)
信号
端口
引脚
有效电平
SER_IN_1
GPIOD
12
低=有液
SER_IN_2
GPIOD
13
低=有效(允许制冷)
文件
说明
ucode/fluid_flow_interlock.h
状态查询接口声明
ucode/fluid_flow_interlock.c
液位检测、流量联锁、报警状态机实现
函数
调用位置
说明
FluidInterlock_Init()
main.c 初始化
计算定时器tick频率, 清零所有状态
FluidInterlock_Tmr4Tick()
sensor_input.c → SensorInput_Scan()
每1ms执行: 液位/流量消抖+检测周期+报警状态机
FluidInterlock_IsWpump1Allowed()
main.c → TempControl_Compute()
返回 s_liquid_ok
FluidInterlock_IsSer2Valid()
main.c → TempControl_Compute()
返回 s_ser2_low_level
FluidInterlock_IsAlarmActive()
main.c 主循环
返回报警状态, 用于数码管显示Err
FluidInterlock_CoolingAllowed()
综合接口
同时检查液位+流量
宏
值
说明
SER1_DEBOUNCE_TICKS
1s (1000 ticks)
液位消抖时间
SER2_DEBOUNCE_TICKS
1s (1000 ticks)
流量消抖时间
DETECT_INTERVAL_FIRST
30s
前5次检测间隔
DETECT_INTERVAL_LATER
60s
后续检测间隔
ALARM_NO_LIQUID_TICKS
5min (300s)
无液报警触发时间
ALARM_DURATION_TICKS
3min (180s)
报警持续时间
ALARM_BEEP_TOGGLE_TICKS
1s
报警蜂鸣器切换间隔
4 通道电容触摸按键检测,含消抖、短按判定、TOUCH_1 (电源键) 5 秒锁定保护。
TouchKey_Scan() [TMR4中断, 1ms周期]
├─ touch1_lock_process() — 锁定计时
├─ 对每个按键:
│ ├─ 锁定中: 跳过TOUCH_1
│ └─ key_state_machine() → 消抖状态机:
│ RELEASE → DEBOUNCE(30次消抖) → PRESS
│ PRESS持续 ≥ TOUCH1_SHORT_PRESS_TIME(5000)
│ → 切换电源状态, 控制M_POWER_C, 更新LED
└─ TOUCH_1触发后 → 锁定30000次扫描 (~30s)
TouchKey_EventProcess() [main.c主循环]
└─ 处理待处理的短按事件 → TouchKeyShortpressevent()
外设
用途
TOUCH_1 (PA8)
电源键: 5s长按切换总电源
TOUCH_2 (PC9)
预留
TOUCH_3 (PC8)
预留
TOUCH_4 (PC7)
预留
信号
端口
引脚
有效电平
GPIO 上拉
TOUCH_1
GPIOA
8
低电平=按下 (RESET)
PULL_UP
TOUCH_2
GPIOC
9
低电平=按下
PULL_UP
TOUCH_3
GPIOC
8
低电平=按下
PULL_UP
TOUCH_4
GPIOC
7
低电平=按下
PULL_UP
注: 触摸按键 GPIO 配置为 GPIO_PULL_UP 输入模式,确保未触摸时引脚为高电平。
文件
说明
ucode/touch_key.h
按键编号、事件枚举、状态结构体定义
ucode/touch_key.c
消抖、状态机、锁定、事件处理
函数
调用位置
说明
TouchKey_Init()
main.c 初始化
清零所有按键状态
TouchKey_Scan()
TMR4_GLOBAL_IRQHandler()
中断扫描: 消抖+状态机+锁定
TouchKey_EventProcess()
main.c 主循环
事件派发: 电源开关控制
TouchKeyShortpressevent()
本文件内部
按键事件处理 (当前框架预留)
宏
值
说明
DEBOUNCE_COUNT
30
消抖采样次数 (30ms)
SHORT_PRESS_TIME
150
普通键短按判定 (150ms)
TOUCH1_SHORT_PRESS_TIME
5000
TOUCH_1 短按判定 (5s)
TOUCH1_LOCK_TIME
30000
TOUCH_1 锁定时间 (~30s)
3 位 6 引脚查理复用 (Charlieplexing) 数码管驱动,通过 TMR3 中断定时扫描实现动态显示。支持温度值显示、错误码显示、单位切换。
DigitTube_Scan() [TMR3中断, 1kHz → 每~450Hz完成一轮全扫描]
├─ g_scan_counter++ (全局扫描计数器, 供main.c做2s定时)
├─ 计算当前扫描位置 scan_pos (digit×7 + seg)
├─ 每轮扫描: 3位数 × 7段 = 21个扫描位
├─ 扫描结束后: 显示LED小数点 (Q1=°C, Q2=°F)
├─ 错误模式: 显示 "Err" 字符
└─ 正常模式: 显示数值 (2位或3位, 消隐前导零)
引脚
端口
引脚
初始电平
DTUBE_1
PD9
低
DTUBE_2
PD8
低
DTUBE_3
PB15
低
DTUBE_4
PB14
低
DTUBE_5
PB13
低
DTUBE_6
PB12
低
注: 所有数码管引脚初始化为低电平,由扫描函数 DigitTube_Scan() 动态切换为推挽输出。
外设
用途
TMR3
扫描定时器 (1kHz 中断)
GPIOB 12-15 + GPIOD 8-9
6引脚数码管驱动
文件
说明
ucode/digit_tube.h
引脚宏、段码定义、函数声明
ucode/digit_tube.c
查理复用扫描、段码表、显示控制
函数
调用位置
说明
DigitTube_Init()
main.c 初始化
初始化数码管GPIO + TMR3定时器
DigitTube_Scan()
TMR3_GLOBAL_IRQHandler()
中断扫描: 每个中断点亮一个段
DigitTube_DisplayTemp()
main.c 主循环
设置温度值 + 单位LED
DigitTube_DisplayErrorCode()
main.c 联锁报警
显示错误码 (强制3位, 前导零)
DigitTube_ClearErrorCode()
main.c 正常状态
恢复2位显示模式
DigitTube_ToggleUnit()
外部调用
°C/°F 切换 + 数值换算
数字
段码 (abcdefg)
0
0x3F
1
0x06
2
0x5B
3
0x4F
4
0x66
5
0x6D
6
0x7D
7
0x07
8
0x7F
9
0x6F
错误码: E=0x79, r=0x50, r=0x50
双路 DS18B20 温度传感器驱动,1-Wire 协议,非阻塞采集模式。
DS18B20_NonBlockingProcess()
├─ 状态机: IDLE → CONVERTING (启动转换) → READ (读取结果)
├─ CONVERTING: 等待 200ms 转换完成
├─ READ: 读取两个传感器温度 → 计算平均值
└─ 更新全局温度数据 g_sensor_data
主循环中每 2s 触发一次读取:
if (elapsed >= DS18B20_UPDATE_INTERVAL_TICKS(2000ms)) {
DS18B20_NonBlockingProcess()
current_temp = DS18B20_GetValidTemp()
TempControl_Compute(&temp_controller, current_temp, ...)
DigitTube_DisplayTemp(DS18B20_GetValidDisplayValue())
}
外设
用途
TEMP_1 (PD11)
DS18B20 传感器1 数据线 (1-Wire)
TEMP_2 (PD10)
DS18B20 传感器2 数据线 (1-Wire)
信号
端口
引脚
说明
TEMP_1 (DS18B20_2)
GPIOD
11
1-Wire 开漏通信
TEMP_2 (DS18B20_1)
GPIOD
10
1-Wire 开漏通信
文件
说明
ucode/DS18B20.h
设备结构体, 命令宏, 非阻塞状态枚举
ucode/DS18B20.c
1-Wire时序, 温度采集, 平均值计算, 全局数据管理
函数
调用位置
说明
DS18B20_Init()
main.c 初始化
搜索总线上的DS18B20设备
DS18B20_NonBlockingProcess()
main.c 主循环
非阻塞采集状态机
DS18B20_GetValidTemp()
main.c 主循环
获取有效温度平均值
DS18B20_GetValidDisplayValue()
main.c 主循环
获取显示用温度值
GlobalSensorData_Init()
main.c 初始化
清零全局传感器数据
模块8: 设备控制 (Device Control)
7 路设备 GPIO 的底层控制接口,提供统一的 control_device() API。
control_device(device_code, switch_state)
├─ 参数校验: device_code≥DEVICE_NUM 或 state 非法 → 返回
└─ GPIO操作:
DEVICE_STATE_HIGH → gpio_bits_set()
DEVICE_STATE_LOW → gpio_bits_reset()
设备宏
设备名
GPIO
默认电平
DEVICE_SW_FAN_1 (0)
风扇1
PA12
高(关)
DEVICE_SW_FAN_2 (1)
风扇2
PA11
高(关)
DEVICE_SW_WPUMP_1 (2)
水泵1
PA15
高(关)
DEVICE_M_POWER_C (3)
总电源
PC11
低(关)
DEVICE_SW_WPUMP_2 (4)
水泵2
PC10
高(关)
DEVICE_SW_VALVE_1 (5)
阀门1
PD15
高(关)
DEVICE_SW_VALVE_2 (6)
阀门2
PC6
高(关)
文件
说明
ucode/device_control.h
设备编号宏定义
ucode/device_control.c
设备GPIO映射表 + 初始化 + control_device()
函数
调用位置
说明
DeviceControl_Init()
main.c 初始化
配置7路GPIO为推挽输出, 默认关闭(高电平), M_POWER_C特殊处理为低
control_device()
touch_key.c 等
统一设备控制接口
注: SW_REF (PB11) 已从设备控制中移除,现由 cooling_pid 模块直接通过 TMR2_CH4 PWM 控制。
模块9: LED + 蜂鸣器 (LED & BEEP)
5 路 LED 控制和蜂鸣器驱动。LED 低电平点亮,蜂鸣器高电平鸣响。
LED_Thread() [TMR1中断, 10kHz → 实际每4000次翻转一次LED1]
├─ LED1: 周期闪烁 (LED1_FLASH_TIME=4000次 ≈ 0.4s @10kHz)
├─ 电源指示灯闪烁: POWER_BLINK_PERIOD=5000次
│ 电源开 → 闪烁 LED_POWER_C
│ 电源关 → 闪烁 LED2
└─ BEEP_Process(): 蜂鸣器状态机
状态0=停止 → 状态1=鸣响 → 状态2=间隔 → 循环count次 → 停止
BEEP_Control(on_time_ms, count):
├─ on_time_ms × 4 = 鸣响周期数
└─ 启动蜂鸣器状态机 (鸣响=间隔=on_time_ms×4)
信号
端口
引脚
有效电平
LED1
GPIOE
14
低电平=点亮 (默认点亮)
LED2
GPIOC
13
低电平=点亮
LED3
GPIOC
14
低电平=点亮
LED4
GPIOC
15
低电平=点亮
LED5
GPIOA
0
低电平=点亮
LED_POWER_C
GPIOB
10
低电平=电源指示
BEEP
GPIOC
12
高电平=鸣响 (默认低电平关闭)
文件
说明
ucode/led_beep.h
LED翻转宏, 蜂鸣器控制宏, 函数声明
ucode/led_beep.c
LED闪烁线程, 蜂鸣器状态机, 电源指示
函数
调用位置
说明
LED_Thread()
TMR1_OVF_TMR10_IRQHandler()
LED1周期闪烁 + 电源指示灯闪烁 + 蜂鸣器处理
LED_SetState()
外部调用
设置指定LED亮/灭 (1~5)
LED_Toggle()
外部调用
翻转指定LED
BEEP_Control()
main.c 初始化
启动蜂鸣器定时鸣响
BEEP_Process()
LED_Thread() 内部
蜂鸣器状态机控制
LED_PowerIndicator_Set()
touch_key.c
电源指示灯 (联动 M_POWER_C)
LED_PowerIndicator_BlinkStart()
touch_key.c
电源键按下时LED闪烁提示
LED_PowerIndicator_BlinkStop()
touch_key.c
停止闪烁
模块10: 传感器输入 (Sensor Input)
3 通道传感器输入消抖处理,50ms 消抖时间,为液位/流量联锁模块提供稳定的输入信号。
SensorInput_Scan() [TMR4中断, 1ms周期]
└─ 对每个通道 (SER_IN_1/2/3):
├─ 读取GPIO原始电平
├─ 电平与当前状态不一致 → debounce_count++
│ debounce_count ≥ 50 → 确认状态变化
└─ 电平一致 → 清零 debounce_count, 增加稳定计数
└─ 最后调用 FluidInterlock_Tmr4Tick()
外设
用途
SER_IN_1 (PD12)
液位检测
SER_IN_2 (PD13)
流量/联锁
SER_IN_3 (PD14)
预留传感器
信号
端口
引脚
说明
SER_IN_1
GPIOD
12
液位检测 (低=有液)
SER_IN_2
GPIOD
13
流量/联锁 (低=有效)
SER_IN_3
GPIOD
14
预留
文件
说明
ucode/sensor_input.h
传感器编号, 消抖时间宏, 状态结构体
ucode/sensor_input.c
GPIO读取, 消抖算法, 扫描调度
函数
调用位置
说明
SensorInput_Init()
main.c 初始化
清零3通道传感器状态
SensorInput_Scan()
TMR4_GLOBAL_IRQHandler()
每1ms扫描: 消抖 + 触发联锁
SensorInput_GetState()
外部查询
获取指定通道消抖后状态
定时器
PSC
ARR
频率
功能
中断服务函数
TMR1
23
999
10kHz (0.1ms)
LED闪烁 + 蜂鸣器
TMR1_OVF_TMR10_IRQHandler() → LED_Thread()
TMR2
23
9999
1kHz (1ms)
PWM输出 (CH4)
TMR2_GLOBAL_IRQHandler()
TMR3
23
9999
1kHz (1ms)
数码管扫描
TMR3_GLOBAL_IRQHandler() → DigitTube_Scan()
TMR4
23
9999
1kHz (1ms)
触摸按键 + 传感器+联锁
TMR4_GLOBAL_IRQHandler() → TouchKey_Scan() + SensorInput_Scan()
TMR5
23
9999
1kHz (1ms)
预留 (中断未使能)
—
注: 所有定时器时钟 = APB时钟 × 2 = 240MHz (因 APB1/APB2 分频=2, 定时器时钟自动倍频)
中断
优先级(主/子)
说明
DMA1_CH1
0/1
USART1_TX DMA
DMA1_CH2
0/1
USART1_RX DMA
TMR1_OVF_TMR10
0/2
LED/蜂鸣器线程
TMR2_GLOBAL
0/1
PWM控制
TMR3_GLOBAL
1/3
数码管扫描 (最低优先级)
TMR4_GLOBAL
0/0
最高优先级: 触摸按键+传感器
USART1
0/0
串口通信
注: NVIC 优先级分组 = NVIC_PRIORITY_GROUP_2 (2位抢占, 2位子优先级)
TMR4_GLOBAL_IRQHandler (1ms, 最高优先级)
├── TouchKey_Scan()
│ ├── touch1_lock_process() — TOUCH_1 锁定计时
│ └── key_state_machine(0~3) — 4路按键状态机
└── SensorInput_Scan()
├── sensor_debounce_process(0~2) — 3路传感器消抖
└── FluidInterlock_Tmr4Tick()
├── SER_IN_1 液位检测 (1s消抖+周期检测)
├── SER_IN_2 流量联锁 (1s消抖)
└── 无液报警状态机
TMR3_GLOBAL_IRQHandler (1ms)
└── DigitTube_Scan()
└── 6引脚Charlieplexing扫描
TMR1_OVF_TMR10_IRQHandler (0.1ms)
├── LED_Thread()
│ ├── LED1 周期闪烁 (4000次翻转)
│ ├── 电源指示灯闪烁 (5000次翻转)
│ └── BEEP_Process() — 蜂鸣器状态机
MCU: AT32F403AVGT7 (LQFP100, Cortex-M4F)
调试器: J-Link (SWD)
外部晶振: 8MHz (HEXT)
Keil MDK v5 (推荐)
打开 project/MDK_V5/REFpowerControl_V1.uvprojx
编译器: ARMCC V5.06 update 6 (build 750)
编译并下载
Artery Workbench
打开 REFpowerControl_V1.ATWP
编译并下载
J-Link SWD, 配置见 project/MDK_V5/JLinkSettings.ini
USART1: 115200bps, 8N1, DMA 模式
BSP层 (project/src/): Artery Workbench 生成的初始化代码,不添加业务逻辑
业务层 (ucode/): 所有业务逻辑模块在此目录,与 BSP 解耦
新模块: 在 ucode/ 下创建 .c/.h,在 uvprojx 中添加文件引用,在 main.c 中包含头文件并调用初始化/主循环函数
定义于 project/inc/at32f403a_407_conf.h:
已启用
已禁用
CRM, DEBUG, DMA, FLASH, GPIO, MISC, PWC, TMR, USART
ACC, ADC, BPR, CAN, CRC, DAC, EMAC, EXINT, I2C, RTC, SDIO, SPI, USB, WDT, WWDT, XMC
版本
日期
说明
V1.0.0
2026-03
基于 AT32F403A 的初版固件
V1.1.0
2026-04-24
完成模块移植: PID, 阀门, 触摸按键, 数码管, DS18B20, LED/蜂鸣器等
V2.0.0
2026-05-15
注水阀重构: 3状态→6状态FSM, TMR4中断驱动
V2.1.0
2026-05-25
新增 cooling_pid PID 模块; TMR2_CH4 PWM 移至 wk_tmr2_init; SW_REF 从 device_control 移除; 触摸按键改为上拉输入; 数码管默认电平修正; NVIC 优先级重构; 新增 TMR5; 液位超时报警 + DS18B20 10位分辨率