shuichan_old/STM32F103_App1/HardWare/RELAY/relay.h

102 lines
3.2 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.

#ifndef RELAY_H
#define RELAY_H
#include "main.h"
/* 4路继电器控制引脚定义: PB7, PB8, PC0, PC2 */
#define Relay1_Pin GPIO_PIN_7
#define Relay2_Pin GPIO_PIN_8
#define Relay3_Pin GPIO_PIN_0
#define Relay4_Pin GPIO_PIN_2
#define Relay1_Port GPIOB
#define Relay2_Port GPIOB
#define Relay3_Port GPIOC
#define Relay4_Port GPIOC
/* 继电器控制宏, 高电平吸合, 低电平释放 */
#define Relay1_ON HAL_GPIO_WritePin(Relay1_Port, Relay1_Pin, GPIO_PIN_SET)
#define Relay1_OFF HAL_GPIO_WritePin(Relay1_Port, Relay1_Pin, GPIO_PIN_RESET)
#define Relay2_ON HAL_GPIO_WritePin(Relay2_Port, Relay2_Pin, GPIO_PIN_SET)
#define Relay2_OFF HAL_GPIO_WritePin(Relay2_Port, Relay2_Pin, GPIO_PIN_RESET)
#define Relay3_ON HAL_GPIO_WritePin(Relay3_Port, Relay3_Pin, GPIO_PIN_SET)
#define Relay3_OFF HAL_GPIO_WritePin(Relay3_Port, Relay3_Pin, GPIO_PIN_RESET)
#define Relay4_ON HAL_GPIO_WritePin(Relay4_Port, Relay4_Pin, GPIO_PIN_SET)
#define Relay4_OFF HAL_GPIO_WritePin(Relay4_Port, Relay4_Pin, GPIO_PIN_RESET)
/* 4路继电器反馈输入引脚定义: PB6, PB9, PC1, PC3 */
#define Relay1_FB_Pin GPIO_PIN_6
#define Relay2_FB_Pin GPIO_PIN_9
#define Relay3_FB_Pin GPIO_PIN_1
#define Relay4_FB_Pin GPIO_PIN_3
#define Relay1_FB_Port GPIOB
#define Relay2_FB_Port GPIOB
#define Relay3_FB_Port GPIOC
#define Relay4_FB_Port GPIOC
/* 反馈电平定义: 继电器吸合后反馈输出高电平, 释放后输出低电平 */
#define FB_ACTIVE GPIO_PIN_SET
#define FB_INACTIVE GPIO_PIN_RESET
/* 手动模式检测引脚: PA8, 高电平=手动模式, 低电平=正常模式 */
#define MANUAL_MODE_Pin GPIO_PIN_8
#define MANUAL_MODE_Port GPIOA
#define MANUAL_MODE_ACTIVE GPIO_PIN_SET
/* 反馈检测总开关: 0=禁用反馈检测, 任何情况都返回正常 */
#define RELAY_FB_ENABLE 1
/* 继电器反馈状态枚举 */
typedef enum {
RELAY_OK = 0, /* 反馈正常 */
RELAY_FAIL_OPEN, /* 反馈未正常吸合 */
RELAY_FAIL_STUCK, /* 反馈未正常释放 */
RELAY_UNKNOWN /* 未知状态 */
} RelayStatus;
/* 继电器初始化 */
void relayInit(void);
/* 网络连接成功后, 从 EEPROM 恢复继电器上一次状态 */
void relayRestoreState(void);
/* 执行MQTT下发的继电器控制命令 */
void relayAction(uint8_t *data);
#define relay_action relayAction
/* 上报继电器状态到平台 */
void relayStatueUpdata(void);
/* 读取 PA8 手动模式输入: 1=手动模式, 0=正常模式 */
int relayIsManualMode(void);
/* 读取指定继电器反馈引脚原始电平 */
GPIO_PinState relayReadFb(uint8_t ch);
/* 设置指定继电器开关状态(只写 GPIO + Relay_State不碰 EEPROM/网络) */
void relaySet(uint8_t ch, uint8_t on);
/* 请求一次状态上报(置 relay_report_pending由主循环延时统一上报 */
void relayRequestReport(void);
/* 命令执行后状态上报标志, 主循环检测到后延时上报 */
extern volatile uint8_t relay_report_pending;
extern volatile uint32_t relay_report_tick;
/* 继电器命令响应阶段控制:
0: 空闲
1: 已动作, 等待反馈稳定
2: 反馈已读, 已发送 response 和 status, 结束
*/
extern volatile uint8_t relay_cmd_stage;
extern volatile uint32_t relay_cmd_tick;
extern volatile uint8_t relay_cmd_ch;
extern volatile GPIO_PinState relay_cmd_fb_before;
extern char relay_cmd_id[20];
/* 运行继电器命令响应状态机,由主循环每轮调用 */
void relayCmdProcess(void);
#endif