喷淋器 P0 功能实现
This commit is contained in:
@@ -0,0 +1,101 @@
|
||||
/******************************************************************************
|
||||
* @file board_pin.h
|
||||
* @brief CBR2 板级引脚、电平与时序(换板只改本文件)
|
||||
* @author cyWu <1917507415@qq.com>
|
||||
* @date 2026.09.09
|
||||
* @version V1.0.0
|
||||
*
|
||||
* @note 调试 UART0_TX=PC5 在 board_jl701n_demo_cfg.h。
|
||||
* 泵脚成对操作,禁止只开 PC2 或 PA6(PC2 供 5V,PA6 导通泵)。
|
||||
* 本机为 5V 常电、无电池;红灯 PA8 / 绿灯 PA7(低亮),
|
||||
* 与加热垫(PA8 绿 / PA7 红)相反,禁止照抄加热垫灯脚。
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef __BOARD_PIN_H__
|
||||
#define __BOARD_PIN_H__
|
||||
|
||||
#include "asm/gpio.h"
|
||||
|
||||
/*============================================================================*/
|
||||
/* 功能开关:某路硬件异常时可单独关掉,不影响配网 */
|
||||
/* 0 时对应模块 init/run 直接 return,GPIO 不配,日志打一次 xxx disabled */
|
||||
/*============================================================================*/
|
||||
|
||||
#define BOARD_LED_ENABLE 1 /**< 1=红绿状态 LED(PA8 红 / PA7 绿,低亮) */
|
||||
#define BOARD_KEY_ENABLE 1 /**< 1=双键(PB1 喷淋 / PA0 配网,低按下) */
|
||||
#define BOARD_PUMP_ENABLE 1 /**< 1=水泵双脚(PC2 供 5V / PA6 导通,高有效) */
|
||||
#define BOARD_SPRAY_ENABLE 1 /* 喷淋作业引擎;=0 时键/DP 不转泵 */
|
||||
#define BOARD_LINKAGE_ENABLE 0 /* 湿度联动(第 11 章);P2 开 */
|
||||
#define BOARD_TIMER_ENABLE 0 /* 到点喷淋计划(第 12 章);P2 开 */
|
||||
#define BOARD_TH_SCAN_ENABLE 0 /* 断连扫描风扇广播(第 8 章);P2 开 */
|
||||
#define BOARD_RUNREC_ENABLE 0 /* 31 天运行记录(第 14 章);P2 开 */
|
||||
#define BOARD_NVM_ENABLE 0 /* VM 持久化(第 14 章);P1/P2 开 */
|
||||
|
||||
/*============================================================================*/
|
||||
/* GPIO */
|
||||
/*============================================================================*/
|
||||
|
||||
#define BOARD_UART_TX_PIN IO_PORTC_05 /**< 调试 UART TX(cfg: TCFG_UART0_TX_PORT) */
|
||||
#define BOARD_KEY_SPRAY_PIN IO_PORTB_01 /**< 喷淋键,低电平按下,只短按 */
|
||||
#define BOARD_KEY_PAIR_PIN IO_PORTA_00 /**< 配网键,低电平按下,5s / 12s */
|
||||
#define BOARD_LED_RED_PIN IO_PORTA_08 /**< 红灯,低电平亮(与加热垫灯脚相反) */
|
||||
#define BOARD_LED_GREEN_PIN IO_PORTA_07 /**< 绿灯,低电平亮(与加热垫灯脚相反) */
|
||||
#define BOARD_PUMP_PWR_PIN IO_PORTC_02 /**< 泵总供电:高把 5V 导到泵 VCC */
|
||||
#define BOARD_PUMP_SW_PIN IO_PORTA_06 /**< 泵开关:高导通泵;须与 PC2 同开同关 */
|
||||
|
||||
#define BOARD_LED_ON_LEVEL 0 /**< LED 点亮电平:0=低亮 */
|
||||
#define BOARD_PUMP_ON_LEVEL 1 /**< 泵有效电平:1=高导通 */
|
||||
#define BOARD_KEY_ACTIVE_LEVEL 0 /**< 按键有效电平:0=按下为低 */
|
||||
|
||||
/*============================================================================*/
|
||||
/* 按键 / 配对 / OTA */
|
||||
/*============================================================================*/
|
||||
|
||||
/**
|
||||
* 直接作为 key.c 状态机的 keyLongTime/keyLastTime 使用:
|
||||
* PB1 喷淋键:<5s 松手 → SHORT_Event(启/停喷淋);满 5s 后松手 → RELEASE_Event
|
||||
* (无动作,规格书 5.2:按住 ≥5s 无动作);12s 到点 LAST_Event 无动作
|
||||
* PA0 配网键:满 5s → LONG_Event(红灯 100ms 快闪提示);5~12s 间松手 →
|
||||
* RELEASE_Event(提交配对);满 12s → LAST_Event(进 OTA)
|
||||
*/
|
||||
#define BOARD_KEY_SPRAY_SHORT_MS 5000 /**< PB1:短按窗口上限(≥5s 无动作) */
|
||||
#define BOARD_KEY_PAIR_MS 5000 /**< PA0 keyLongTime:满 5s 挂配对提示灯 */
|
||||
#define BOARD_KEY_OTA_MS 12000 /**< PA0 keyLastTime:满 12s 到点直接进 OTA */
|
||||
#define BOARD_KEY_DEBOUNCE_MS 20 /**< 按键消抖(参考值;key.c 内部以 30 为准) */
|
||||
#define BOARD_PAIR_TIMEOUT_MS (120u * 1000u) /**< 配对超时 120s,失败后保持开机 */
|
||||
|
||||
/*============================================================================*/
|
||||
/* LED(红绿独立通道,低亮;事件表见 led_manager.c) */
|
||||
/*============================================================================*/
|
||||
|
||||
#define BOARD_LED_SPRAY_ON_MS 500 /**< 作业绿灯闪:亮 */
|
||||
#define BOARD_LED_SPRAY_OFF_MS 500 /**< 作业绿灯闪:灭 */
|
||||
#define BOARD_LED_FAST_ON_MS 100 /**< 配网红灯快闪:亮 */
|
||||
#define BOARD_LED_FAST_OFF_MS 100 /**< 配网红灯快闪:灭 */
|
||||
#define BOARD_LED_OTA_ON_MS 200 /**< OTA 红绿交替半周期:亮 */
|
||||
#define BOARD_LED_OTA_OFF_MS 200 /**< OTA 红绿交替半周期:灭 */
|
||||
#define BOARD_LED_PAIR_FAIL_MS 200 /**< 配对失败红绿交替半周期 */
|
||||
#define BOARD_LED_PAIR_FAIL_HOLD_MS 3000 /**< 配对失败动画总时长 */
|
||||
|
||||
/*============================================================================*/
|
||||
/* 断连扫描(P2,第 8.2 节) */
|
||||
/*============================================================================*/
|
||||
|
||||
#define BOARD_ADV_SCAN_SLOT_MS 500 /* 重连广播 / 扫描各占一拍 */
|
||||
|
||||
/*============================================================================*/
|
||||
/* 喷淋作业(第 10 章:首次上电 DP7 默认 10s × 3 次 + 间隔 3s) */
|
||||
/*============================================================================*/
|
||||
|
||||
#define BOARD_SPRAY_DEFAULT_DUR_S 10 /**< DP7 默认单次喷淋时长(秒) */
|
||||
#define BOARD_SPRAY_DEFAULT_COUNT 3 /**< DP7 默认喷淋次数 */
|
||||
#define BOARD_SPRAY_DEFAULT_INTERVAL_S 3 /**< DP7 默认喷淋间隔(秒) */
|
||||
|
||||
/*============================================================================*/
|
||||
/* 运行记录(P2,第 14.1 节:31 天 × uint32 秒) */
|
||||
/*============================================================================*/
|
||||
|
||||
#define BOARD_RUN_RECORD_DAYS 31 /**< 记录天数 */
|
||||
#define BOARD_RUN_RECORD_SAVE_SEC 600 /**< 泵实际导通累计 10 分钟写一次 VM */
|
||||
|
||||
#endif /* __BOARD_PIN_H__ */
|
||||
@@ -0,0 +1,195 @@
|
||||
/******************************************************************************
|
||||
* @file bsp_hw.c
|
||||
* @brief 板级 GPIO:红绿 LED、双键、泵双脚(成对切)
|
||||
* @author cyWu <1917507415@qq.com>
|
||||
* @date 2026.09.09
|
||||
* @version V1.0.0
|
||||
* @history
|
||||
* - V1.0.0, 2026.09.09, cyWu, P0 Bring-up 首次发布
|
||||
*
|
||||
* @note 泵两脚 PC2(5V 供) + PA6(导通) 必须同开同关,bsp_pump_set 是
|
||||
* 唯一写泵 GPIO 的出口;上电默认两脚都低,绝不按 VM 自动开泵。
|
||||
******************************************************************************/
|
||||
|
||||
#include "system/includes.h"
|
||||
#include "asm/gpio.h"
|
||||
#include "bsp_hw.h"
|
||||
|
||||
#define LOG_TAG_CONST APP
|
||||
#define LOG_TAG "[BSP_HW]"
|
||||
#define LOG_ERROR_ENABLE
|
||||
#define LOG_INFO_ENABLE
|
||||
#include "debug.h"
|
||||
|
||||
static uint8_t s_initialized;
|
||||
|
||||
/**
|
||||
* @brief 配置 GPIO 为推挽输出
|
||||
* @param pin GPIO 编号
|
||||
* @param value 输出初值(电平)
|
||||
* @return 无
|
||||
*/
|
||||
static void bsp_pin_output(u32 pin, int value)
|
||||
{
|
||||
gpio_set_pull_up(pin, 0);
|
||||
gpio_set_pull_down(pin, 0);
|
||||
gpio_set_die(pin, 1);
|
||||
gpio_direction_output(pin, value);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 配置 GPIO 为数字输入(可内部上拉)
|
||||
* @param pin GPIO 编号
|
||||
* @param pull_up 1=内部上拉,0=不上拉
|
||||
* @return 无
|
||||
*/
|
||||
static void bsp_pin_input(u32 pin, int pull_up)
|
||||
{
|
||||
gpio_direction_output(pin, 1);
|
||||
gpio_set_direction(pin, 1);
|
||||
gpio_set_pull_down(pin, 0);
|
||||
gpio_set_pull_up(pin, pull_up ? 1 : 0);
|
||||
gpio_set_die(pin, 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 写单个输出引脚到指定逻辑电平
|
||||
* @param pin GPIO 编号
|
||||
* @param value 电平值
|
||||
* @return 无
|
||||
*/
|
||||
static void bsp_pin_write(u32 pin, int value)
|
||||
{
|
||||
gpio_direction_output(pin, value);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 初始化 GPIO
|
||||
* @note 上电顺序:泵两脚先保持低(PC2=0 且 PA6=0),灯全灭(由事件表接管)。
|
||||
* @return BSP_HW_OK=成功
|
||||
*/
|
||||
BspHw_Ret_t bsp_hw_init(void)
|
||||
{
|
||||
if (s_initialized) {
|
||||
return BSP_HW_OK;
|
||||
}
|
||||
|
||||
#if BOARD_LED_ENABLE
|
||||
bsp_pin_output(BOARD_LED_RED_PIN, BOARD_LED_ON_LEVEL ? 0 : 1); /* 红灯灭 */
|
||||
bsp_pin_output(BOARD_LED_GREEN_PIN, BOARD_LED_ON_LEVEL ? 0 : 1); /* 绿灯灭 */
|
||||
#else
|
||||
log_info("hw led disabled\n");
|
||||
#endif
|
||||
|
||||
#if BOARD_KEY_ENABLE
|
||||
bsp_pin_input(BOARD_KEY_SPRAY_PIN, 1); /* 上拉输入,低按下 */
|
||||
bsp_pin_input(BOARD_KEY_PAIR_PIN, 1);
|
||||
#else
|
||||
log_info("hw key disabled\n");
|
||||
#endif
|
||||
|
||||
#if BOARD_PUMP_ENABLE
|
||||
/* 泵两脚初始都低:上电绝不喷(规格书 2.2 安全) */
|
||||
bsp_pin_output(BOARD_PUMP_PWR_PIN, BOARD_PUMP_ON_LEVEL ? 0 : 1);
|
||||
bsp_pin_output(BOARD_PUMP_SW_PIN, BOARD_PUMP_ON_LEVEL ? 0 : 1);
|
||||
#else
|
||||
log_info("hw pump disabled\n");
|
||||
#endif
|
||||
|
||||
s_initialized = 1;
|
||||
log_info("hw init led=%d key=%d pump=%d\n",
|
||||
BOARD_LED_ENABLE, BOARD_KEY_ENABLE, BOARD_PUMP_ENABLE);
|
||||
return BSP_HW_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 查询板级硬件是否已初始化
|
||||
* @return BSP_HW_OK=已初始化,BSP_HW_ERR_NOT_INIT=未初始化
|
||||
*/
|
||||
BspHw_Ret_t bsp_hw_get_status(void)
|
||||
{
|
||||
return s_initialized ? BSP_HW_OK : BSP_HW_ERR_NOT_INIT;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 红灯开关(PA8,低电平亮)
|
||||
* @param on 1=亮,0=灭
|
||||
* @return 无
|
||||
*/
|
||||
void bsp_led_red_set(uint8_t on)
|
||||
{
|
||||
#if BOARD_LED_ENABLE
|
||||
bsp_pin_write(BOARD_LED_RED_PIN,
|
||||
on ? BOARD_LED_ON_LEVEL : (BOARD_LED_ON_LEVEL ? 0 : 1));
|
||||
#else
|
||||
(void)on;
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 绿灯开关(PA7,低电平亮)
|
||||
* @param on 1=亮,0=灭
|
||||
* @return 无
|
||||
*/
|
||||
void bsp_led_green_set(uint8_t on)
|
||||
{
|
||||
#if BOARD_LED_ENABLE
|
||||
bsp_pin_write(BOARD_LED_GREEN_PIN,
|
||||
on ? BOARD_LED_ON_LEVEL : (BOARD_LED_ON_LEVEL ? 0 : 1));
|
||||
#else
|
||||
(void)on;
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 红绿全灭
|
||||
* @return 无
|
||||
*/
|
||||
void bsp_led_all_off(void)
|
||||
{
|
||||
bsp_led_red_set(0);
|
||||
bsp_led_green_set(0);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 读喷淋键(PB1)
|
||||
* @return 1=按下,0=未按下
|
||||
*/
|
||||
uint8_t bsp_key_spray_is_pressed(void)
|
||||
{
|
||||
#if BOARD_KEY_ENABLE
|
||||
return (uint8_t)(gpio_read(BOARD_KEY_SPRAY_PIN) == BOARD_KEY_ACTIVE_LEVEL);
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 读配网键(PA0)
|
||||
* @return 1=按下,0=未按下
|
||||
*/
|
||||
uint8_t bsp_key_pair_is_pressed(void)
|
||||
{
|
||||
#if BOARD_KEY_ENABLE
|
||||
return (uint8_t)(gpio_read(BOARD_KEY_PAIR_PIN) == BOARD_KEY_ACTIVE_LEVEL);
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 成对切泵:两脚同开同关
|
||||
* @param on 1=泵转,0=泵停
|
||||
* @return 无
|
||||
*/
|
||||
void bsp_pump_set(uint8_t on)
|
||||
{
|
||||
#if BOARD_PUMP_ENABLE
|
||||
bsp_pin_write(BOARD_PUMP_PWR_PIN,
|
||||
on ? BOARD_PUMP_ON_LEVEL : (BOARD_PUMP_ON_LEVEL ? 0 : 1));
|
||||
bsp_pin_write(BOARD_PUMP_SW_PIN,
|
||||
on ? BOARD_PUMP_ON_LEVEL : (BOARD_PUMP_ON_LEVEL ? 0 : 1));
|
||||
#else
|
||||
(void)on;
|
||||
#endif
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
/******************************************************************************
|
||||
* @file bsp_hw.h
|
||||
* @brief 板级 GPIO:红绿 LED、双键、水泵双脚(低层原语)
|
||||
* @author cyWu <1917507415@qq.com>
|
||||
* @date 2026.09.09
|
||||
* @version V1.0.0
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef __BSP_HW_H__
|
||||
#define __BSP_HW_H__
|
||||
|
||||
#include <stdint.h>
|
||||
#include "board_pin.h"
|
||||
|
||||
typedef enum {
|
||||
BSP_HW_OK = 0,
|
||||
BSP_HW_ERR_NOT_INIT
|
||||
} BspHw_Ret_t;
|
||||
|
||||
/**
|
||||
* @brief 初始化 GPIO:LED 双通道(初始灭)、双键(上拉输入)、泵两脚(初始低)
|
||||
* @return BSP_HW_OK=成功
|
||||
*/
|
||||
BspHw_Ret_t bsp_hw_init(void);
|
||||
|
||||
/**
|
||||
* @brief 查询板级硬件是否已初始化
|
||||
* @return BSP_HW_OK=已初始化,BSP_HW_ERR_NOT_INIT=未初始化
|
||||
*/
|
||||
BspHw_Ret_t bsp_hw_get_status(void);
|
||||
|
||||
/* ═══ 红绿 LED(低电平亮;on 传"亮"语义,内部按 BOARD_LED_ON_LEVEL 取反)═══ */
|
||||
|
||||
/**
|
||||
* @brief 红灯开关(PA8,低亮)
|
||||
* @param on 1=亮,0=灭
|
||||
* @return 无
|
||||
*/
|
||||
void bsp_led_red_set(uint8_t on);
|
||||
|
||||
/**
|
||||
* @brief 绿灯开关(PA7,低亮)
|
||||
* @param on 1=亮,0=灭
|
||||
* @return 无
|
||||
*/
|
||||
void bsp_led_green_set(uint8_t on);
|
||||
|
||||
/**
|
||||
* @brief 红绿全灭
|
||||
* @return 无
|
||||
*/
|
||||
void bsp_led_all_off(void);
|
||||
|
||||
/* ═══ 按键(低按下)═══ */
|
||||
|
||||
/**
|
||||
* @brief 读喷淋键(PB1)
|
||||
* @return 1=按下,0=未按下
|
||||
*/
|
||||
uint8_t bsp_key_spray_is_pressed(void);
|
||||
|
||||
/**
|
||||
* @brief 读配网键(PA0)
|
||||
* @return 1=按下,0=未按下
|
||||
*/
|
||||
uint8_t bsp_key_pair_is_pressed(void);
|
||||
|
||||
/* ═══ 水泵(PC2 供 5V + PA6 导通,**成对操作**)═══ */
|
||||
|
||||
/**
|
||||
* @brief 成对切泵:on=1 时 PC2 与 PA6 同时置高;on=0 时同时拉低
|
||||
* @note ⚠ 禁止只开其中一只脚。本接口是唯一能改泵 GPIO 的出口,
|
||||
* 调用方只准是 app_pump(上层业务经 app_spray 间接请求)。
|
||||
* @param on 1=泵转,0=泵停
|
||||
* @return 无
|
||||
*/
|
||||
void bsp_pump_set(uint8_t on);
|
||||
|
||||
#endif /* __BSP_HW_H__ */
|
||||
Reference in New Issue
Block a user