/****************************************************************************** * @file bsp_hw.c * @brief 板级 GPIO:红绿 LED、按键、继电器 * @author cyWu <1917507415@qq.com> * @date 2026.09.04 * @version V1.1.0 * @history * - V1.1.0, 2026.09.04, cyWu, 精简注释(单标志不包结构体) * - V1.0.0, 2026.09.04, cyWu, 首次发布 ******************************************************************************/ #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 初始化 GPIO * @note 上电顺序:继电器先保持关(PC3=0),灯全灭(LED_ENABLE 由事件表接管)。 * @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_PIN, 1); /* 上拉输入,低按下 */ #else log_info("hw key disabled\n"); #endif #if BOARD_RELAY_ENABLE bsp_pin_output(BOARD_RELAY_PIN, 0); /* 继电器初始关(PC3=0),开请求等过零 */ #else log_info("hw relay disabled\n"); #endif s_initialized = 1; log_info("hw init led=%d key=%d relay=%d\n", BOARD_LED_ENABLE, BOARD_KEY_ENABLE, BOARD_RELAY_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 gpio_direction_output(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 gpio_direction_output(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_is_pressed(void) { #if BOARD_KEY_ENABLE return (uint8_t)(gpio_read(BOARD_KEY_PIN) == BOARD_KEY_ACTIVE_LEVEL); #else return 0; #endif } /** * @brief 直接写继电器 GPIO(只准 app_relay 在过零/超时路径调用) * @param on 1=吸合,0=断开 * @return 无 */ void bsp_relay_set(uint8_t on) { #if BOARD_RELAY_ENABLE gpio_direction_output(BOARD_RELAY_PIN, on ? BOARD_RELAY_ON_LEVEL : (BOARD_RELAY_ON_LEVEL ? 0 : 1)); #else (void)on; #endif } /** * @brief 读继电器 GPIO 当前电平 * @return 1=吸合,0=断开 */ uint8_t bsp_relay_get(void) { #if BOARD_RELAY_ENABLE return (uint8_t)(gpio_read(BOARD_RELAY_PIN) == BOARD_RELAY_ON_LEVEL); #else return 0; #endif }