P0/P1/P2功能实现:接入业务组合根(按键/LED/过零/配网/OTA),联动、11B定时、运行记录、灯泡寿命(DP3/DP4/DP25)、CBR0 VM、512分包
This commit is contained in:
@@ -0,0 +1,177 @@
|
||||
/******************************************************************************
|
||||
* @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
|
||||
}
|
||||
Reference in New Issue
Block a user