新手入门
- 积分
- 13
- 金钱
- 13
- 注册时间
- 2025-7-16
- 在线时间
- 1 小时
|
1金钱
BSP_SOX.h文件中:
typedef union {
uint32_t all;
struct {
uint32_t ac_high_temp1 : 1; // 市电高温告警1: 43≤t<48°C, 恢复≤40°C
uint32_t ac_high_temp2 : 1; // 市电高温告警2: 48≤t<67°C, 恢复≤45°C
uint32_t ac_high_temp3 : 1; // 市电高温告警3: t>67°C, 恢复≤60°C
uint32_t ac_low_temp1 : 1; // 市电低温告警1: -15≤t<2°C, 恢复≥8°C
uint32_t ac_low_temp2 : 1; // 市电低温告警2: t<-15°C, 恢复≥8°C
uint32_t battery_high_temp : 1; // 电池模式高温: t>67°C, 恢复<60°C
uint32_t battery_low_temp : 1; // 电池模式低温: t<-15°C, 恢复≥10°C
uint32_t ac_input_overvoltage : 1; // 市电输入过压 >13.2V,灯闪烁 0.5s
uint32_t ac_input_undervoltage : 1; // 市电输入欠压 4.9~10.8V,灯闪烁
uint32_t battery_overvoltage : 1; // 电池过压:关闭充电,SOC=100
uint32_t battery_undervoltage : 1; // 电池欠压:关闭输出,进入休眠
uint32_t output_overload_or_short : 1; // 输出过载或短路(总功率 >21W)
uint32_t output_no_load_timeout : 1; // 无负载30秒休眠(I<50mA, P<0.6W),I>100mA重置
uint32_t ntc_disconnect : 1; // NTC 断线检测
uint32_t single_port_overcurrent : 1; // 单口过流(5V:2.6A, 9V:2.2A, 12V:3.2A)
// 保留位(18 bits)
} bit;
} SystemAlarmFlags;
extern SystemAlarmFlags system_alarms;
typedef struct {
union {
uint8_t data_u8; // 整体访问状态字节
struct {
uint8_t soc_overvoltage_flag : 1; // 过压时触发,用于锁定 SOC=100
uint8_t soc_undervoltage_flag : 1;// 欠压时触发,用于锁定 SOC=0
// 保留位
} bit;
} status;
float current; // 实时电流(单位:mA 或 A,视上下文)
float soc; // 当前电量百分比(0~100)
float charge; // 当前剩余容量(mAh)
} SocData;
extern SocData soc_data; // SOC 全局数据
BSP_SOX.c文件中:
#include "BSP_SOX.h"
SystemAlarmFlags system_alarms;
BSP_led.h文件中:
#include "BSP_SOX.h"
void BSP_led_main(bool mode, SystemAlarmFlags* Alarm, SocData* soc);
BSP_led.c文件中:
void BSP_led_main(bool mode, SystemAlarmFlags* Alarm, SocData* soc)
{
static uint8_t ac_time = 0;
static uint8_t dc_time = 0;
if (mode == 0)//电池模式
{
if (Alarm->all == 0)//没有告警状态
{
led_on_Alarm(mode, soc);
// led_off_Alarm(mode, Alarm, 1);//复位
}
else//有告警
{
// led_on_Alarm(mode, soc);
// if (led_off_Alarm(mode, Alarm, 0))
{
// key_int.key_sys = 3;//长按 休眠
// led_off_Alarm(mode, Alarm, 1);//复位
}
}
if (system_alarms.bit.ac_input_undervoltage || system_alarms.bit.ac_input_overvoltage)//输入欠压 过压
{
if (++dc_time > 5)
{
dc_time = 0;
LED_BLUE = ~LED_BLUE;//蓝灯亮起
}
}
else LED_BLUE = 0;//熄灭
LED_RED = 0;//红灯灭掉
// LED_RED = 1;//红灯亮起
// LED_BLUE = 0;//蓝灯灭掉
ac_time = 0;
}
else//市电模式
{
dc_time = 0;
if (Alarm->all == 0)//没有告警状态
{
led_on_Alarm(mode, soc);
led_off_Alarm(mode, Alarm, 1);//复位
}
else//有告警
{
// led_on_Alarm(mode, soc);
if (led_off_Alarm(mode, Alarm, 0))
{
g_KeyStatus.key_sys = 3;//长按 休眠
led_off_Alarm(mode, Alarm, 1);//复位
}
}
if (system_alarms.bit.ac_input_undervoltage || system_alarms.bit.ac_input_overvoltage)//输入欠压 过压
{
if (++ac_time > 5)
{
ac_time = 0;
LED_BLUE = ~LED_BLUE;//蓝灯亮起
}
}
else LED_BLUE = 1;
LED_RED = 0;//红灯灭掉
}
}
keil为什么会有以下报错呢,我的C++选项卡里已包含路径
..\..\..\..\bsp\BSP_led.h(69): error: #20: identifier "SystemAlarmFlags" is undefined
void BSP_led_main(bool mode, SystemAlarmFlags* Alarm, SocData* soc);
..\..\..\..\bsp\BSP_led.h(69): error: #20: identifier "SocData" is undefined
void BSP_led_main(bool mode, SystemAlarmFlags* Alarm, SocData* soc);
..\..\..\..\bsp\BSP_SOX.c(120): warning: #1035-D: single-precision operand implicitly converted to double-precision
|
|