Files
JBao_Sprayer_FW/apps/usr_periph/bsp_hw.c
T
wuchuyuan 0dd65e1552 1、喷淋器 P1/P2功能实现
2、红灯按连接态慢闪
2026-09-09 19:57:00 +08:00

196 lines
4.6 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/******************************************************************************
* @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 红灯开关(PA7,低电平亮)
* @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 绿灯开关(PA8,低电平亮)
* @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
}