| 
 
新手入门 
 
	积分14金钱14 注册时间2025-7-16在线时间2 小时 | 
 
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
 
 
 | 
 |