喷淋器 P0 功能实现

This commit is contained in:
2026-09-09 15:03:50 +08:00
parent b880b2e62b
commit 866b522c59
30 changed files with 3773 additions and 25 deletions
+195
View File
@@ -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
}