liyi 1 год назад
Родитель
Сommit
230386c3eb
30 измененных файлов с 2014 добавлено и 285 удалено
  1. 40 1
      truing_control/PDU-AC/common/common.c
  2. 148 15
      truing_control/PDU-AC/common/common.h
  3. 183 5
      truing_control/PDU-AC/hardware/detection/detection.c
  4. 3 1
      truing_control/PDU-AC/hardware/detection/detection.h
  5. 401 0
      truing_control/PDU-AC/hardware/eeprom/eeprom.c
  6. 18 0
      truing_control/PDU-AC/hardware/eeprom/eeprom.h
  7. 70 0
      truing_control/PDU-AC/hardware/flash/flash.c
  8. 26 0
      truing_control/PDU-AC/hardware/flash/flash.h
  9. 43 0
      truing_control/PDU-AC/hardware/fwdgt/fwdgt.c
  10. 20 0
      truing_control/PDU-AC/hardware/fwdgt/fwdgt.h
  11. 1 1
      truing_control/PDU-AC/hardware/haddr/haddr.c
  12. 0 18
      truing_control/PDU-AC/hardware/key/key.c
  13. 0 17
      truing_control/PDU-AC/hardware/key/key.h
  14. 31 0
      truing_control/PDU-AC/hardware/led/led.c
  15. 23 0
      truing_control/PDU-AC/hardware/led/led.h
  16. 43 0
      truing_control/PDU-AC/hardware/lock/lock.c
  17. 30 0
      truing_control/PDU-AC/hardware/lock/lock.h
  18. 47 14
      truing_control/PDU-AC/hardware/relay/relay.c
  19. 175 0
      truing_control/PDU-AC/hardware/timer/timer.c
  20. 18 0
      truing_control/PDU-AC/hardware/timer/timer.h
  21. 171 0
      truing_control/PDU-AC/hardware/uart/uart.c
  22. 20 0
      truing_control/PDU-AC/hardware/uart/uart.h
  23. 57 36
      truing_control/PDU-AC/modbus/BARE/port/port.c
  24. 3 3
      truing_control/PDU-AC/modbus/BARE/port/portserial.c
  25. 187 124
      truing_control/PDU-AC/prj/ctrl_board.uvguix.Gowon
  26. 131 32
      truing_control/PDU-AC/prj/ctrl_board.uvoptx
  27. 34 4
      truing_control/PDU-AC/prj/ctrl_board.uvprojx
  28. 2 1
      truing_control/PDU-AC/user/board_cfg.h
  29. 11 11
      truing_control/PDU-AC/user/gd32e23x_it.c
  30. 78 2
      truing_control/PDU-AC/user/main.c

+ 40 - 1
truing_control/PDU-AC/common/common.c

@@ -1 +1,40 @@
-#include "common.h"
+#include "common.h"
+#include "board_cfg.h"
+
+
+typedef union {
+	uint8_t 	data[500];
+	uint16_t 	relay_status[15];
+	delay_t   input_delay[12];
+	threshold_t input[3];
+	threshold_t output[12];
+	uint16_t    input_over_func[3];
+	uint16_t    output_over_func[12];
+}read_data_t;
+
+
+void read_config_from_eeprom(void)
+{
+	board_t *board = get_board();
+	/* read status of relay */
+	board->read_eeprom(EEPROM_RELAY_STARTUS_ADDR,(uint8_t *)(&board->relay_staging_staus[0]),sizeof(uint16_t) * RelaySlaveChaNum);
+	/* read delay of relay */
+	board->read_eeprom(EEPROM_DELAY_ADDR,(uint8_t *)(&board->md_data.rw_data.delay_chn[0]),sizeof(delay_t) * RelaySlaveChaNum);
+	
+#if SURPPORT_2_PT
+	/* read input threshold */
+	board->read_eeprom(EEPROM_THRESHOLD_INPUT_ADDR,(uint8_t *)(&board->md_data.rw_data.th_in[0]),sizeof(threshold_t) * 2);
+	for(int i = 0; i < 2;i++)
+		board->check_threshold(THRESHOLD_IN,i);
+	/* input over func */
+	board->read_eeprom(EEPROM_INPUT_OVER_FUNC_ADDR,(uint8_t *)(&board->md_data.rw_data.over_fun_in[0]),sizeof(uint16_t) * 2);
+#else
+	/* read input threshold */
+	board->read_eeprom(EEPROM_THRESHOLD_INPUT_ADDR,(uint8_t *)(&board->md_data.rw_data.th_in[0]),sizeof(threshold_t) * 1);
+	board->check_threshold(THRESHOLD_IN,0);
+	/* input over func */
+	board->read_eeprom(EEPROM_INPUT_OVER_FUNC_ADDR,(uint8_t *)(&board->md_data.rw_data.over_fun_in[0]),sizeof(uint16_t) * 1);
+#endif
+	board->read_eeprom(EEPROM_INPUT_OVER_FUNC_ADDR,(uint8_t *)(&board->md_data.rw_data.over_func_out[0]),sizeof(uint16_t) * RelaySlaveChaNum);
+	
+}

+ 148 - 15
truing_control/PDU-AC/common/common.h

@@ -1,5 +1,5 @@
 /*********************************************************************************************************
-* Module   : common.h
+* Module   : common
 * Abstract : defined data structure! 
 * Version  : 1.0.0
 * Author   : Leopul(COPYRIGHT 2025 ~ 2027 Leopul. All rights reserved.)
@@ -20,6 +20,12 @@
 #define START_REGISTER            4000
 
 
+#define START_RW_REGISTER         4284
+
+
+//#define 
+
+
 
 #define MAX_CHANNEL              	9
 #define MAX_INPUT_CAHNNEL         3
@@ -91,8 +97,8 @@
 #define   SET_FREQ_MIN_EN(reg)        			((reg) |= FREQ_MIN_EN)
 
 
-#define   UNSET_VOLTAGE_MAX_EN(reg)        	((reg) &= VOLTAGLE_MAX_DIS_EN)
-#define   UNSET_VOLTAGE_MIN_EN(reg)        	((reg) &= VOLTAGLE_MIN_DIS_EN)
+#define   UNSET_VOLTAGE_MAX_EN(reg)        	((reg) &= VOLTAGE_MAX_DIS_EN)
+#define   UNSET_VOLTAGE_MIN_EN(reg)        	((reg) &= VOLTAGE_MIN_DIS_EN)
 #define   UNSET_CURRENT_MAX_EN(reg)        	((reg) &= CURRENT_MAX_DIS_EN)
 #define   UNSET_POWER_MAX_EN(reg)        		((reg) &= POWER_MAX_DIS_EN)
 #define   UNSET_CONSUMER_MAX_EN(reg)        ((reg) &= CONSUMER_MAX_DIS_EN)
@@ -109,6 +115,17 @@
 #define  SET_WANNING_FREQ_MIN(reg)       		((reg) |= FREQ_MIN)
 
 
+#define  UNSET_WANNING_VOLTAGE_MAX(reg)       ((reg) &= (~VOLTAGE_MAX))
+#define  UNSET_WANNING_VOLTAGE_MIN(reg)       ((reg) &= (~VOLTAGE_MIN))
+#define  UNSET_WANNING_CURRENT_MAX(reg)       ((reg) &= (~CURRENT_MAX))
+#define  UNSET_WANNING_POWER_MAX(reg)         ((reg) &= (~POWER_MAX))
+#define  UNSET_WANNING_CONSUMER_MAX(reg)      ((reg) &= (~CONSUMER_MAX))
+#define  UNSET_WANNING_FREQ_MAX(reg)       		((reg) &= (~FREQ_MAX))
+#define  UNSET_WANNING_FREQ_MIN(reg)       		((reg) &= (~FREQ_MIN))
+
+
+
+
 
 #define  IS_OVERFUNC_VOLTAGE_MAX(reg)       ((reg) & VOL_MAX_OVER_FUNC)
 #define  IS_OVERFUNC_VOLTAGE_MIN(reg)				((reg) & VOL_MIN_OVER_FUNC)
@@ -120,12 +137,53 @@
 
 
 
+// EEPROM 
+#define EEPROM_RELAY_STARTUS_ADDR          		(0)
+#define EEPROM_RELAY_BYTES                		(2)
+#define EEPROM_RELAY_COUNT_MAX            		(64)         /* 2 page */
+
+#define EEPROM_DELAY_ADDR                     (64)
+#define EEPROM_DELAY_BYTES                		(2)
+#define EEPROM_DELAY_COUNT_MAX                (64)				 /* 2 page */
+
+
+#define EEPROM_THRESHOLD_INPUT_ADDR           (128)
+#define EEPROM_THRESHOLD_INPUT_BYTES          (4)
+#define EEPROM_THRESHOLD_INPUT_MAX            (64)					/* 2 page */
+
+#define EEPROM_THRESHOLD_OUTPUT_ADDR          (192)
+#define EEPROM_THRESHOLD_OUTPUT_BYTES         (4)
+#define EEPROM_THRESHOLD_OUTPUT_MAX           (256)         /* 8 page */
+
+#define EEPROM_INPUT_OVER_FUNC_ADDR           (448)
+#define EEPROM_INPUT_OVER_FUNC_BYTES          (2)
+#define EEPROM_INPUT_OVER_FUNC_MAX            (32)					/* 1 page */
+
+
+#define EEPROM_OUTPUT_OVER_FUNC_ADDR          (480)      
+#define EEPROM_OUTPUT_OVER_FUNC_BYTES         (2)
+#define EEPROM_OUTPUT_OVER_FUNC_MAX           (32)          /* 1 page */
+
+
+
+
+#define THRESHOLD_IN             							0
+#define THRESHOLD_OUT            							1
+
+
+#define Default_Consum_Max   (4000000000)
+#define Default_Voltage_Max  (1000000000)
+#define Default_Current_Max  (1000000000)
+#define Default_Power_Max		 (1000000000)
+
+#define THRESHOULD_JUDGMENT    		(50)
+
 #pragma pack (2)
 typedef struct {
 	uint32_t uniq_3;
 	uint32_t uniq_2;
 	uint32_t uniq_1;
-	uint16_t dev_chn;
+	uint32_t dev_chn;
 	uint16_t version[6];
 	uint16_t date[16];
 }board_info_t;
@@ -142,6 +200,10 @@ typedef struct {
 	uint16_t resever;
 }elect_info_t;
 
+typedef struct{
+	elect_info_t info[3];
+}elect_3_info_t;
+
 
 typedef struct {
 	uint16_t delay_open;
@@ -160,36 +222,81 @@ typedef struct{
 	uint32_t reserve4;
 }threshold_t;
 
+
+
 typedef struct {
 	uint16_t 						dev_chn;
 	board_info_t				b_info;
 	elect_info_t        ele_in[MAX_INPUT_CAHNNEL];
 	elect_info_t        ele_out[MAX_CHANNEL];
 	//// todo
+	elect_3_info_t      ele_3_out[3];
+	////
 	uint16_t            detection;
+}r_data_t;
+
+
+
+typedef struct {
 	uint16_t            relay_status[MAX_CHANNEL];
 	uint16_t            combin_relay_status[3];
 	uint16_t            zero_relay_status[3];
-	delay_t             out_chn[MAX_CHANNEL];
+	delay_t             delay_chn[MAX_CHANNEL];
   delay_t             combin_chn[3];
 	threshold_t         th_in[MAX_INPUT_CAHNNEL];
 	threshold_t         th_out[MAX_CHANNEL];
 	//// todo
-	uint16_t            over_func[MAX_CHANNEL];
+	threshold_t         th_3_out[3];
+	////
+	uint16_t            over_fun_in[3];
+	uint16_t            over_func_out[MAX_CHANNEL];
 	uint16_t            combin_over_func[3];
+}rw_data_t;
+
+typedef struct {
+	r_data_t r_data;
+	rw_data_t rw_data;
 }mod_data_t;
 
 #pragma pack ()
 
 
+typedef struct {
+	uint8_t flag;
+	uint16_t start_addr;
+	uint16_t lenth;
+	uint8_t  data[72];
+}eeprom_write_cache_t;
+
+
+typedef struct {
+	uint16_t start_addr;
+	uint16_t lenth;
+	uint8_t  data[72];
+}w_eeprom_data_t;
+
+
+typedef struct {
+#define QUEUE_MAX     10
+	uint8_t  front;
+	uint8_t  rear;
+	w_eeprom_data_t data[QUEUE_MAX];
+	uint8_t (*is_empty)();
+	uint8_t (*is_full)();
+	uint8_t (*en_queue)(w_eeprom_data_t *d);
+	uint8_t (*de_queue)(w_eeprom_data_t *d);
+}queue_t;
+
+
 
 typedef struct {
 	mod_data_t md_data;
 	uint8_t 	all_switch_stu;
+	uint8_t   all_switch_count;
 	#define 	ALL_IDLE     0
 	#define 	ALL_ON       1
 	#define 	ALL_OFF      2
-	uint8_t 	flag_led;													
+	uint8_t 	flag_1s;													
 	uint8_t   eeprom_write_flag;
 	uint8_t   jlink_flag;																				/* jugement jlink insert and programe process       */
 	uint8_t   erase_consumer_flag; 															/* erase consumer and all successful this flag is 0 */
@@ -197,10 +304,19 @@ typedef struct {
 	uint8_t   out_wanning_en[MAX_CHANNEL];
 	uint8_t   in_wanning_en[MAX_INPUT_CAHNNEL];
 	uint8_t   over_func[MAX_CHANNEL];
-	uint8_t   relay_staging_staus[MAX_CHANNEL];
+	uint16_t  relay_staging_staus[MAX_CHANNEL];
+#if (POWER_TYPE == POWER_AC_3_3)
+	uint16_t  relay_combin_staging_status[3];
+#endif
+#if (ZERO_CONTRL != ZERO_LINE_CTRL_NO)
+	uint16_t  relay_zero_staging_status[3];
+#endif
 	uint8_t   haddr;
 	uint8_t   detection_1_value;
 	uint32_t  detection_1_count;
+	uint32_t  timer_count;
+	//eeprom_write_cache_t cache[16];
+	queue_t    q_cache;
 #if SURPPORT_2_PT
 	uint8_t   detection_2_value;
 	uint32_t  detection_2_count;
@@ -228,21 +344,39 @@ typedef struct {
 	uint8_t handle_status[MAX_CHANNEL];  						/* Save the state before the power failure  */
 	#if SURPPORT_2_PT
 		uint8_t  handle_input_pt[2];										/* recode input status  */
+		uint8_t  count1;
+		uint8_t  count2;
 		uint8_t  input_1_en;
 		uint8_t  input_2_en;
-		uint32_t input_1_10ms_count;
-		uint32_t input_2_10ms_count;
+		uint16_t input_1_10ms_count;
+		uint16_t input_2_10ms_count;
 	#else
 		uint8_t  handle_input_pt[1];
 	#endif
 #endif
 
+#if SUPPORT_SELF_LOCK
+	#if (RelaySlaveChaNum >= 1)
+		void (*read_key_1)();
+	#endif
+	#if (RelaySlaveChaNum >= 2)
+		void (*read_key_2)();
+	#endif
+	#if (RelaySlaveChaNum >= 3)	
+	void (*read_key_3)();
+	#endif
+	#if (RelaySlaveChaNum >= 4)
+	void (*read_key_4)();
+	#endif
+#endif
+
 	void (*open)(uint8_t channel);
 	void (*close)(uint8_t channel);
 	void (*read_ele)(uint8_t channel);
 	void (*led_flash)();
-	void (*read_eeprom)(uint16_t addr,uint16_t lenth);
-	void (*check_wanning)(uint8_t channel);
+	void (*read_eeprom)(uint16_t addr,uint8_t *r_buff,uint16_t lenth);
+	void (*write_eeprom)(uint16_t addr,uint8_t *w_buff,uint16_t lenth);
+	void (*check_out_wanning)(uint8_t channel);
 	void (*detection)();
 	void (*opt_detection)();
 	void (*erase_consumer)();
@@ -252,12 +386,11 @@ typedef struct {
 	void (*feed_dog)();
 	void (*lock)();
 	void (*unlock)();
+	void (*check_threshold)(uint8_t in_out,uint8_t channel);
+	void (*relay_sync)();
 }board_t;
 
 
-
-
-
 board_t *get_board();
 
 #endif

+ 183 - 5
truing_control/PDU-AC/hardware/detection/detection.c

@@ -3,7 +3,7 @@
 * Abstract : 
 * Version  : 1.0.0
 * Author   : Leopul(COPYRIGHT 2025 ~ 2027 Leopul. All rights reserved.)
-* Complete : 2025-04-18
+* Complete : 2025-04-08
 * Content  : None
 * Note     : None
 *********************************************************************************************************/
@@ -12,6 +12,7 @@
 #include "gd32e23x.h"
 #include "common.h"
 #include "board_cfg.h"
+#include "relay.h"
 
 
 
@@ -38,7 +39,30 @@ static board_t *board = 0;
 	#define DERECTION_2_EXTI_IO               EXTI_SOURCE_PIN3
 #endif
 
+
+
+#define KEY_RST_RCU     		RCU_GPIOC
+#define KEY_RST_IO          GPIOC
+#define KEY_RST             GPIO_PIN_14
+
+#define KEY_RST_EXTI_SOURCE      			EXTI_SOURCE_GPIOC
+#define KEY_RST_EXTI                  EXTI_14
+#define KEY_RST_EXTI_IO               EXTI_SOURCE_PIN14
+
+
+#define KEY_TEST_RCU     			RCU_GPIOB
+#define KEY_TEST_IO          	GPIOB
+#define KEY_TEST             	GPIO_PIN_2
+
+#define KEY_TEST_EXTI_SOURCE      		 EXTI_SOURCE_GPIOB
+#define KEY_TEST_EXTI                  EXTI_2
+#define KEY_TEST_EXTI_IO               EXTI_SOURCE_PIN2
+
+
+
 static void get_detection(void);
+static void detection_opt(void);
+
 
 void detection_init(void)
 {
@@ -54,16 +78,63 @@ void detection_init(void)
 #if SURPPORT_2_PT
 	rcu_periph_clock_enable(DETECTION_2_RCU);
 	gpio_mode_set(DETECTION_2_IO, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, DETECTION_2);
-	nvic_irq_enable(EXTI4_15_IRQn,2);
+	nvic_irq_enable(EXTI2_3_IRQn,2);
 	syscfg_exti_line_config(DETECIION_2_EXTI_SOURCE,DERECTION_2_EXTI_IO);
 	exti_init(DERECTION_2_EXTI,EXTI_INTERRUPT,EXTI_TRIG_FALLING);
 	exti_interrupt_flag_clear(DERECTION_2_EXTI);	
 #endif	
 	board->detection = get_detection;
+	board->opt_detection = detection_opt;
+	
+}
+void key_init(void)
+{
+#if SUPPORT_ALL_ON_OFF
+	rcu_periph_clock_enable(RCU_CFGCMP);
+	rcu_periph_clock_enable(KEY_RST_RCU);
+	gpio_mode_set(KEY_RST_IO, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, KEY_RST);
+	nvic_irq_enable(EXTI4_15_IRQn,2);
+	syscfg_exti_line_config(KEY_RST_EXTI_SOURCE,KEY_RST_EXTI_IO);
+	exti_init(KEY_RST_EXTI,EXTI_INTERRUPT,EXTI_TRIG_FALLING);
+	exti_interrupt_flag_clear(KEY_RST_EXTI);
+	
+	rcu_periph_clock_enable(KEY_TEST_RCU);
+	gpio_mode_set(KEY_TEST_IO, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, KEY_TEST);
+	nvic_irq_enable(EXTI2_3_IRQn,2);
+	syscfg_exti_line_config(KEY_TEST_EXTI_SOURCE,KEY_TEST_EXTI_IO);
+	exti_init(KEY_TEST_EXTI,EXTI_INTERRUPT,EXTI_TRIG_FALLING);
+	exti_interrupt_flag_clear(KEY_TEST_EXTI);
+
+#elif SUPPORT_SELF_LOCK
+	
+	
+	
+#endif
 	
 }
 
+
+
 void EXTI4_15_IRQHandler(void){
+#if SUPPORT_ALL_ON_OFF
+	if(RESET != exti_interrupt_flag_get(KEY_RST_EXTI))
+	{
+		if(board)
+		{
+			if(gpio_input_bit_get(KEY_TEST_IO,KEY_TEST) != 0)
+			{
+				for(int i = 0; i < RelaySlaveChaNum;i++)
+				{
+					board->relay_staging_staus[i] = RELAY_CLOSE;
+				}
+				board->all_switch_stu = ALL_OFF;
+				board->timer_count = 0;
+				//todo write to eeprom cache
+			}
+			exti_interrupt_flag_clear(KEY_RST_EXTI);
+		}
+	}
+#endif
 	if(RESET != exti_interrupt_flag_get(DERECTION_1_EXTI))
 	{
 		if(board)
@@ -75,9 +146,47 @@ void EXTI4_15_IRQHandler(void){
 	}
 }
 
-#if SURPPORT_2_PT
+
 void EXTI2_3_IRQHandler(void)
 {
+#if SUPPORT_ALL_ON_OFF
+	if(RESET != exti_interrupt_flag_get(KEY_TEST_EXTI))
+	{
+		if(board)
+		{
+			if(gpio_input_bit_get(KEY_RST_IO,KEY_RST) != 0)
+			{
+#if (SURPPORT_2_PT)
+				uint8_t val = (RelaySlaveChaNum % 2) ? (RelaySlaveChaNum/2 + 1) : (RelaySlaveChaNum/2);
+				if(board->md_data.r_data.detection & 0X1)
+				{
+					for(int i = 0; i < val;i++)
+					{
+						board->relay_staging_staus[i] = RELAY_OPEN;
+					}
+				}
+				if(board->md_data.r_data.detection & 0X2)
+				{
+					for(int i = val; i < RelaySlaveChaNum;i++)
+					{
+						board->relay_staging_staus[i] = RELAY_OPEN;
+					}
+				}		
+#else	
+				for(int i = 0; i < RelaySlaveChaNum;i++)
+				{
+					board->relay_staging_staus[i] = RELAY_OPEN;
+				}
+#endif
+				board->all_switch_stu = ALL_ON;
+				board->timer_count = 0;
+				//todo  write to eeprom cache
+			}
+			exti_interrupt_flag_clear(KEY_TEST_EXTI);
+		}
+	}
+#endif	
+#if SURPPORT_2_PT
 	if(RESET != exti_interrupt_flag_get(DERECTION_2_EXTI))
 	{
 		if(board)
@@ -87,8 +196,9 @@ void EXTI2_3_IRQHandler(void)
 		}
 		exti_interrupt_flag_clear(DERECTION_2_EXTI);
 	}	
-}
 #endif
+}
+
 static void get_detection()
 {
 	if(board)
@@ -104,8 +214,76 @@ static void get_detection()
 			data  |= (1 << 1);
 		}		
 #endif
-		board->md_data.detection = data;
+		board->md_data.r_data.detection = data;
 	}
 }
 
+static void detection_opt(void)
+{
+	if(board)
+	{
+#if RELAY_REMENBER
+	#if SURPPORT_2_PT
+			if(board->md_data.r_data.detection & 0x1)
+			{
+				if(board->handle_input_pt[0] == 0)
+				{
+					board->handle_input_pt[0] = 1;
+					uint8_t val = (RelaySlaveChaNum % 2) ? (RelaySlaveChaNum / 2 + 1) : (RelaySlaveChaNum / 2);
+					for(uint8_t k = 0; k < val;k++)
+					{
+						board->relay_staging_staus[k] = board->handle_status[k];
+					}
+					board->input_1_10ms_count = 0;
+					board->input_1_en = 1;
+				}
+			}else
+			{
+				if(board->handle_input_pt[0] == 1)
+				{
+					uint8_t val = (RelaySlaveChaNum % 2) ? (RelaySlaveChaNum / 2 + 1) : (RelaySlaveChaNum/2);
+					for(uint8_t k = 0; k < val;k++)
+					{
+						board->handle_status[k] = board->md_data.rw_data.relay_status[k];
+						board->relay_staging_staus[k] = RELAY_CLOSE;
+						board->close(k);
+					}
+					board->handle_input_pt[0] = 0;
+				}
+			}
+			if(board->md_data.r_data.detection & 0x2)
+			{
+				if(board->handle_input_pt[1] == 0)
+				{
+					board->handle_input_pt[1] = 1;
+					uint8_t val = (RelaySlaveChaNum % 2) ? (RelaySlaveChaNum / 2 + 1) : (RelaySlaveChaNum/2);
+					for(uint8_t k = val; k < RelaySlaveChaNum;k++)
+					{
+						board->relay_staging_staus[k] = board->handle_status[k];
+					}
+					board->input_2_10ms_count = 0;
+					board->input_2_en = 1;
+				}
+			}else
+			{
+				if(board->handle_input_pt[1] == 1)
+				{
+					uint8_t val = (RelaySlaveChaNum % 2) ? (RelaySlaveChaNum / 2 + 1) : (RelaySlaveChaNum/2);
+					for(uint8_t k = val; k < RelaySlaveChaNum;k++)
+					{
+						board->handle_status[k] = board->md_data.rw_data.relay_status[k];
+						board->relay_staging_staus[k] = RELAY_CLOSE;
+						board->close(k);
+					}
+					board->handle_input_pt[1] = 0;
+				}
+			}		
+	#else
+			
+	#endif
+#else
+		
+		
 #endif
+	}
+}

+ 3 - 1
truing_control/PDU-AC/hardware/detection/detection.h

@@ -3,7 +3,7 @@
 * Abstract : 
 * Version  : 1.0.0
 * Author   : Leopul(COPYRIGHT 2025 ~ 2027 Leopul. All rights reserved.)
-* Complete : 2025-04-18
+* Complete : 2025-04-08
 * Content  : None
 * Note     : None
 *********************************************************************************************************/
@@ -14,6 +14,8 @@
 
 
 void detection_init(void);
+void key_init(void);
+
 
 
 

+ 401 - 0
truing_control/PDU-AC/hardware/eeprom/eeprom.c

@@ -0,0 +1,401 @@
+#include "eeprom.h"
+#include "board_cfg.h"
+#include "gd32e23x.h"
+#include "common.h"
+#include "systick.h"
+
+#define ACK       1   
+#define NACK      0   
+
+#define IIC_WP_PIN          GPIO_PIN_13
+
+#define IIC_DATA_IO         GPIOF
+#define IIC_SDA_PIN         GPIO_PIN_0
+#define IIC_SCL_PIN         GPIO_PIN_1
+
+
+
+#define IIC_READ_SDA()      gpio_input_bit_get(IIC_DATA_IO, IIC_SDA_PIN) 
+
+#define IIC_SCL_SET         gpio_bit_set(IIC_DATA_IO, IIC_SCL_PIN) 
+#define IIC_SCL_CLR         gpio_bit_reset(IIC_DATA_IO, IIC_SCL_PIN) 
+
+#define IIC_SDA_SET         gpio_bit_set(IIC_DATA_IO, IIC_SDA_PIN)  
+#define IIC_SDA_CLR         gpio_bit_reset(IIC_DATA_IO, IIC_SDA_PIN)  
+
+#define AT24C01    127           
+#define AT24C02    255
+#define AT24C04    511
+#define AT24C08    1023
+#define AT24C16    2047
+#define AT24C32    4095
+#define AT24C64    8191
+#define AT24C128   16383
+#define AT24C256   32767
+
+#define USER_DEFINE_EEPROM_TYPE    AT24C64 
+
+
+
+
+static void 				iic_init(void);
+static void 				iic_start_signal(void);
+static void 				iic_stop_signal(void);
+static void 				iic_send_byte(uint8_t data);
+static uint8_t 			iic_read_byte(uint8_t ack); 
+static uint8_t      iic_wait_ack(void);
+static void         iic_send_ack(void);
+static void         iic_send_nack(void);
+
+
+static uint8_t      eeprom_read_1_byte(uint16_t addr);
+static void         eeprom_write_1_byte(uint16_t addr,uint8_t data);
+
+static void         eeprom_write(uint16_t w_addr,uint8_t *data,uint16_t lenth); 
+static void         eeprom_read(uint16_t r_addr,uint8_t *data,uint16_t lenth);
+static void 				check_threshold(uint8_t in_out,uint8_t channel);
+
+
+static inline void iic_set_sda_input()
+{
+	gpio_mode_set(IIC_DATA_IO, GPIO_MODE_INPUT, GPIO_PUPD_NONE, IIC_SDA_PIN);
+}
+
+static inline void iic_set_sda_output()
+{
+	gpio_mode_set(IIC_DATA_IO, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, IIC_SDA_PIN);
+	gpio_output_options_set(IIC_DATA_IO, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, IIC_SDA_PIN);
+}
+
+
+
+void eeprom_init(void)
+{
+	board_t *board = get_board();
+	iic_init();
+	board->read_eeprom = eeprom_read;
+	board->write_eeprom = eeprom_write;
+	board->check_threshold = check_threshold;
+}
+
+
+static void iic_init(void)
+{
+	rcu_periph_clock_enable(RCU_GPIOC);
+	gpio_mode_set(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_13);
+	gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13);		  				/* WP */
+	gpio_bit_reset(GPIOC, GPIO_PIN_13);
+	
+	rcu_periph_clock_enable(RCU_GPIOF);
+	gpio_mode_set(IIC_DATA_IO, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_0);
+	gpio_output_options_set(IIC_DATA_IO, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, IIC_SDA_PIN);				/* SDA */
+	
+	gpio_mode_set(IIC_DATA_IO, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_1);                 	/* SCL */
+	gpio_output_options_set(IIC_DATA_IO, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, IIC_SCL_PIN);
+}
+/*****************************************************************************************
+*    start data transport signal
+*								1 2    3     4
+*									__________
+*        SCL : __/          \_____
+*              ________ 
+*        SDA :         \___________
+******************************************************************************************/
+static void iic_start_signal(void)
+{
+	iic_set_sda_output();
+	IIC_SDA_SET;
+	IIC_SCL_SET;
+	DelayNus(4);
+	IIC_SDA_CLR;
+	DelayNus(4);
+	IIC_SCL_CLR;
+}
+
+/*****************************************************************************************
+*    stop data transport signal
+*								1 2    3     4
+*									     _______________
+*        SCL :  ______/
+*               __        ____________
+*        SDA :    \______/
+*                   ^
+*                   |
+*                 
+******************************************************************************************/
+static void iic_stop_signal(void)
+{
+	iic_set_sda_output();
+	IIC_SCL_CLR;
+	IIC_SDA_CLR;
+	DelayNus(4);
+	IIC_SCL_SET;
+	IIC_SDA_SET;
+	DelayNus(4);
+}
+/*****************************************************************************************
+*     						iic send 1 byte  
+*                 1 2     3      4
+*                          ______  
+*           SCL:  ________/      \______
+*                 ______________________
+*           SDA:  \\\___________________
+*
+******************************************************************************************/
+static void iic_send_byte(uint8_t data)
+{
+	iic_set_sda_output();
+	IIC_SCL_CLR;
+	uint8_t t = 8;
+	do{
+		if(data & 0x80)
+		{
+			IIC_SDA_SET;
+		}else
+		{
+			IIC_SDA_CLR;
+		}
+		data <<= 1;
+		DelayNus(2);
+		IIC_SCL_SET;
+		DelayNus(2);
+		IIC_SCL_CLR;
+		DelayNus(2);
+	}while(--t);
+}
+/*****************************************************************************************
+*          						read 1 byte
+*                    1  2    3  4
+*                       ______
+*           SCL: ______/      \___
+*                ____________________
+*           SDA: \\\\______________\\\
+*
+******************************************************************************************/
+static uint8_t iic_read_byte(uint8_t ack)
+{
+	uint8_t t = 8;
+	uint8_t receive = 0;
+	iic_set_sda_input();
+	do{
+		IIC_SCL_CLR;
+		DelayNus(2);
+		IIC_SCL_SET;
+		if(IIC_READ_SDA())
+		{
+			receive |= 1;
+		}
+		receive <<= 1;
+		DelayNus(1);
+	}while(--t);
+	if(NACK == ack)
+	{
+		iic_send_nack();
+	}else{
+		iic_send_ack();
+	}
+	return receive;
+}
+/*****************************************************************************************
+*                wait ack signal
+*                _______|____
+*           SCL:        |    \_________
+*                _______|     
+*           SDA:         \_____________
+*
+******************************************************************************************/
+static uint8_t iic_wait_ack(void)
+{
+	uint8_t err_time = 0;
+	iic_set_sda_input();
+	while(IIC_READ_SDA())
+	{
+		err_time++;
+		if(err_time >250)
+		{
+			iic_stop_signal();
+			return 1;
+		}
+	}
+	IIC_SCL_CLR;
+	return 0;
+}
+/*****************************************************************************************
+*                send ack signal
+*                 1 2     3      4
+*                         ______
+*           SCL: ________/      \______ 
+*                __     
+*           SDA:   \___________________
+******************************************************************************************/
+static void iic_send_ack(void)
+{
+	IIC_SCL_CLR;
+	iic_set_sda_output();
+	IIC_SDA_CLR;
+	DelayNus(2);
+	IIC_SCL_SET;
+	DelayNus(2);
+	IIC_SCL_CLR;
+}
+
+/*****************************************************************************************
+*                send nack signal
+*               1 2     3      4
+*                        ______
+*          SCL: ________/      \______ 
+*               ______________________
+*          SDA: __/
+******************************************************************************************/
+static void iic_send_nack(void)
+{
+	IIC_SCL_CLR;
+	iic_set_sda_output();
+	IIC_SDA_SET;
+	DelayNus(2);
+	IIC_SCL_SET;
+	DelayNus(2);
+	IIC_SCL_CLR;	
+}
+
+static uint8_t eeprom_read_1_byte(uint16_t addr)
+{
+	uint8_t temp =0;
+	iic_start_signal();
+	if(USER_DEFINE_EEPROM_TYPE > AT24C16)
+	{
+		iic_send_byte(0XA0);
+		iic_wait_ack();
+		iic_send_byte(addr >> 8);
+	}else
+	{
+		iic_send_byte(0XA0 + ((addr / 256) << 1));
+	}
+	iic_wait_ack();
+	iic_send_byte(addr % 256);
+	iic_wait_ack();
+	iic_start_signal();
+	iic_send_byte(0XA1);
+	iic_wait_ack();
+	temp = iic_read_byte(0);
+	iic_stop_signal();
+	return temp;
+}
+
+static void  eeprom_write_1_byte(uint16_t addr,uint8_t data)
+{
+	iic_start_signal();
+	if(USER_DEFINE_EEPROM_TYPE > AT24C16)
+	{
+		iic_send_byte(0XA0);
+		iic_wait_ack();
+		iic_send_byte(addr >> 8);
+	}else
+	{
+		iic_send_byte(0XA0 + ((addr / 256) << 1));
+	}
+	iic_wait_ack();
+	iic_send_byte(addr % 256);
+	iic_wait_ack();
+	
+	iic_send_byte(data);
+	iic_wait_ack();
+	iic_stop_signal();
+	DelayNms(7);
+}
+static void eeprom_write(uint16_t w_addr,uint8_t *data,uint16_t lenth)
+{
+	while(lenth)
+	{
+		eeprom_write_1_byte(w_addr,*data);
+		w_addr++;
+		data++;
+		lenth--;
+	}
+}
+static void eeprom_read(uint16_t r_addr,uint8_t *data,uint16_t lenth)
+{
+	while(lenth)
+	{
+		*data = eeprom_read_1_byte(r_addr);
+		data++;
+		r_addr++;
+		lenth--;
+	}
+}
+
+
+static void check_threshold(uint8_t in_out,uint8_t channel)
+{
+	if(in_out == THRESHOLD_IN)
+	{
+		board_t *board = get_board();
+		if(channel < 3)
+		{
+			if(board->md_data.rw_data.th_in[channel].th_voltage_max > Default_Voltage_Max) board->md_data.rw_data.th_in[channel].th_voltage_max  = 0;
+			if(board->md_data.rw_data.th_in[channel].th_voltage_min > Default_Voltage_Max) board->md_data.rw_data.th_in[channel].th_voltage_min  = 0;
+			if(board->md_data.rw_data.th_in[channel].th_current_max > Default_Current_Max) board->md_data.rw_data.th_in[channel].th_current_max  = 0;
+			if(board->md_data.rw_data.th_in[channel].th_power_max > Default_Power_Max)     board->md_data.rw_data.th_in[channel].th_power_max    = 0;
+			if(board->md_data.rw_data.th_in[channel].th_consumer_max > Default_Consum_Max) board->md_data.rw_data.th_in[channel].th_consumer_max = 0;
+			
+			if(board->md_data.rw_data.th_in[channel].th_voltage_max <= THRESHOULD_JUDGMENT) 
+				UNSET_VOLTAGE_MAX_EN(board->in_wanning_en[channel]);
+			else 
+				SET_VOLTAGE_MAX_EN(board->in_wanning_en[channel]);
+			if(board->md_data.rw_data.th_in[channel].th_voltage_min <= THRESHOULD_JUDGMENT) 
+				UNSET_VOLTAGE_MIN_EN(board->in_wanning_en[channel]);
+			else 
+				SET_VOLTAGE_MIN_EN(board->in_wanning_en[channel]);
+			
+			if(board->md_data.rw_data.th_in[channel].th_current_max <= THRESHOULD_JUDGMENT) 
+				UNSET_CURRENT_MAX_EN(board->in_wanning_en[channel]);
+			else 
+				SET_CURRENT_MAX_EN(board->in_wanning_en[channel]);
+			
+			if(board->md_data.rw_data.th_in[channel].th_power_max <= THRESHOULD_JUDGMENT) 
+				UNSET_POWER_MAX_EN(board->in_wanning_en[channel]);
+			else 
+				SET_POWER_MAX_EN(board->in_wanning_en[channel]);
+			
+			if(board->md_data.rw_data.th_in[channel].th_consumer_max <= THRESHOULD_JUDGMENT) 
+				UNSET_CONSUMER_MAX_EN(board->in_wanning_en[channel]);
+			else 
+				SET_CONSUMER_MAX_EN(board->in_wanning_en[channel]);			
+		}
+	}else if(in_out == THRESHOLD_OUT)
+	{
+		board_t *board = get_board();
+		if(channel < RelaySlaveChaNum)
+		{
+			if(board->md_data.rw_data.th_out[channel].th_voltage_max > Default_Voltage_Max) board->md_data.rw_data.th_out[channel].th_voltage_max  = 0;
+			if(board->md_data.rw_data.th_out[channel].th_voltage_min > Default_Voltage_Max) board->md_data.rw_data.th_out[channel].th_voltage_min  = 0;
+			if(board->md_data.rw_data.th_out[channel].th_current_max > Default_Current_Max) board->md_data.rw_data.th_out[channel].th_current_max  = 0;
+			if(board->md_data.rw_data.th_out[channel].th_power_max > Default_Power_Max)     board->md_data.rw_data.th_out[channel].th_power_max    = 0;
+			if(board->md_data.rw_data.th_out[channel].th_consumer_max > Default_Consum_Max) board->md_data.rw_data.th_out[channel].th_consumer_max = 0;
+			
+			if(board->md_data.rw_data.th_out[channel].th_voltage_max <= THRESHOULD_JUDGMENT) 
+				UNSET_VOLTAGE_MAX_EN(board->out_wanning_en[channel]);
+			else 
+				SET_VOLTAGE_MAX_EN(board->in_wanning_en[channel]);
+			if(board->md_data.rw_data.th_out[channel].th_voltage_min <= THRESHOULD_JUDGMENT) 
+				UNSET_VOLTAGE_MIN_EN(board->out_wanning_en[channel]);
+			else 
+				SET_VOLTAGE_MIN_EN(board->out_wanning_en[channel]);
+			
+			if(board->md_data.rw_data.th_out[channel].th_current_max <= THRESHOULD_JUDGMENT) 
+				UNSET_CURRENT_MAX_EN(board->out_wanning_en[channel]);
+			else 
+				SET_CURRENT_MAX_EN(board->out_wanning_en[channel]);
+			
+			if(board->md_data.rw_data.th_out[channel].th_power_max <= THRESHOULD_JUDGMENT) 
+				UNSET_POWER_MAX_EN(board->out_wanning_en[channel]);
+			else 
+				SET_POWER_MAX_EN(board->out_wanning_en[channel]);
+			
+			if(board->md_data.rw_data.th_out[channel].th_consumer_max <= THRESHOULD_JUDGMENT) 
+				UNSET_CONSUMER_MAX_EN(board->out_wanning_en[channel]);
+			else 
+				SET_CONSUMER_MAX_EN(board->out_wanning_en[channel]);				
+		}
+	}
+}

+ 18 - 0
truing_control/PDU-AC/hardware/eeprom/eeprom.h

@@ -0,0 +1,18 @@
+#ifndef __EEPROM_H_
+#define __EEPROM_H_
+
+
+
+
+
+
+
+
+
+void eeprom_init(void);
+
+
+
+
+
+#endif

+ 70 - 0
truing_control/PDU-AC/hardware/flash/flash.c

@@ -0,0 +1,70 @@
+#include "flash.h"
+#include "gd32e23x.h"
+
+void flash_erase_meta()
+{
+	fmc_unlock();
+	fmc_flag_clear(FMC_FLAG_END | FMC_FLAG_WPERR | FMC_FLAG_PGERR);
+	fmc_page_erase(META_DATA);
+	fmc_flag_clear(FMC_FLAG_END | FMC_FLAG_WPERR | FMC_FLAG_PGERR);
+	fmc_lock();
+}
+
+void flash_write_meta(const META_DATA_S *meta_data)
+{
+	fmc_unlock();
+	uint32_t address = META_DATA;
+	uint32_t *data = (uint32_t*)(meta_data);
+	uint32_t data0 = 0;
+	for(int i = 0; i < sizeof(META_DATA_S);i++)
+	{
+		data0 = *data;
+		fmc_word_program(address,data0);
+		data ++;
+		fmc_flag_clear(FMC_FLAG_END | FMC_FLAG_WPERR | FMC_FLAG_PGERR);
+		address +=4;
+	}
+	fmc_lock();
+}
+
+void flash_get_meta_data(META_DATA_S *meta)
+{
+	meta->operation_flag 						= *(uint32_t*)(UPGRADE_FLAG_ADDR);
+	meta->partition 								= *(uint32_t*)(STARTUP_PARTATION);
+	meta->errno 										= *(uint32_t*)(STARTUP_ERROR);
+	meta->error_count 							= *(uint32_t*)(STARTUP_NUMBEAR);
+	meta->rom_addr 									= *(uint32_t*)(STARTUP_ROM_ADDR);
+	meta->recent_running_time 			= *(uint32_t*)(STARTUP_LAST_RUNNING_TIME);
+	meta->running_app_version 			= *(uint32_t*)(STARTUP_APP_VERSION);
+	meta->app1_version 							= *(uint32_t*)(APP1_VERSION);
+	meta->app1_rom_addr 						= *(uint32_t*)(APP1_ROM_ADDR);
+	meta->app1_partition 						= *(uint32_t*)(APP1_PARTATION);
+	meta->app2_version 							= *(uint32_t*)(APP2_VERSION);
+	meta->app2_rom_addr 						= *(uint32_t*)(APP2_ROM_ADDR);
+	meta->app2_partition 						= *(uint32_t*)(APP2_PARTATION);
+	uint32_t buff[MD5_LENTH] = {0};
+		uint32_t addr = APP1_MD5;
+		for(int i = 0;i < MD5_LENTH;i++)
+		{
+			buff[i] =  *(uint32_t*)(addr);
+			addr += 4;
+		}
+		memcpy(&meta->app1_md5[0],buff,sizeof(uint32_t) *MD5_LENTH);
+		
+		addr = APP2_MD5;
+		for(int i = 0;i < MD5_LENTH;i++)
+		{
+			buff[i] =  *(uint32_t*)(addr);
+			addr += 4;
+		}
+		memcpy(&meta->app2_md5[0],buff,sizeof(uint32_t) *MD5_LENTH);
+		meta->app1_size = *(uint32_t*)(APP1_SIZE);
+		meta->app2_size = *(uint32_t*)(APP2_SIZE);
+}
+
+void flash_get_infomation(board_info_t *info)
+{
+	info->uniq_3 						= *(uint32_t*)(UNIQU_3);
+	info->uniq_2 						= *(uint32_t*)(UNIQU_2);
+	info->uniq_1 						= *(uint32_t*)(UNIQU_1);
+}

+ 26 - 0
truing_control/PDU-AC/hardware/flash/flash.h

@@ -0,0 +1,26 @@
+#ifndef __FLAHS_H_
+#define __FLAHS_H_
+
+
+#include "cfg.h"
+#include "common.h"
+
+#define MD5_LENTH       										8
+
+#define UNIQU_1                       			0x1FFFF7AC
+#define UNIQU_2                       			0x1FFFF7B0
+#define UNIQU_3                       			0x1FFFF7B4
+
+
+
+void flash_erase_meta();
+
+void flash_write_meta(const META_DATA_S *meta_data);
+
+void flash_get_meta_data(META_DATA_S *meta);
+
+void flash_get_infomation(board_info_t *info);
+
+#endif
+
+

+ 43 - 0
truing_control/PDU-AC/hardware/fwdgt/fwdgt.c

@@ -0,0 +1,43 @@
+/*********************************************************************************************************
+* Module   : fwdgt
+* Abstract : 
+* Version  : 1.0.0
+* Author   : Leopul(COPYRIGHT 2025 ~ 2027 Leopul. All rights reserved.)
+* Complete : 2025-04-09
+* Content  : None
+* Note     : None
+*********************************************************************************************************/
+#include "fwdgt.h"
+#include "common.h"
+#include "board_cfg.h"
+#include "gd32e23x.h"
+
+
+static void feed_dog(void);
+
+
+void fwdgt_Init(void)
+{
+	board_t * board = get_board();
+	uint16_t timeout = 0xFFFFU;
+	rcu_osci_on(RCU_IRC40K);
+	while(SUCCESS != rcu_osci_stab_wait(RCU_IRC40K))
+	{
+		if(timeout > 0)
+				timeout--;
+		else	
+			break;
+	}
+	
+	fwdgt_config(2000,FWDGT_PSC_DIV64);			//800ms
+	fwdgt_write_disable();
+	fwdgt_enable();
+	board->feed_dog = feed_dog;
+}
+
+
+static void feed_dog(void)
+{
+	fwdgt_write_enable();
+	fwdgt_counter_reload();	
+}

+ 20 - 0
truing_control/PDU-AC/hardware/fwdgt/fwdgt.h

@@ -0,0 +1,20 @@
+/*********************************************************************************************************
+* Module   : fwdgt
+* Abstract : 
+* Version  : 1.0.0
+* Author   : Leopul(COPYRIGHT 2025 ~ 2027 Leopul. All rights reserved.)
+* Complete : 2025-04-09
+* Content  : None
+* Note     : None
+*********************************************************************************************************/
+
+
+#ifndef __FWGDT_H_
+#define __FWGDT_H_
+
+
+
+void fwdgt_Init(void);
+
+
+#endif

+ 1 - 1
truing_control/PDU-AC/hardware/haddr/haddr.c

@@ -43,5 +43,5 @@ void haddr_init(void)
 	addr |= ((gpio_input_bit_get(HADDR_1_4_IO,HADDR_3)) ? 0 : 1) << 2; 
 	addr |= ((gpio_input_bit_get(HADDR_1_4_IO,HADDR_4)) ? 0 : 1) << 3; 
 	addr |= ((gpio_input_bit_get(HADDR_5_IO,HADDR_5)) ? 0 : 1)   << 4; 
-	board->haddr = (~(addr)) & 0x1f;
+	board->haddr = (addr) & 0x1f;
 }

+ 0 - 18
truing_control/PDU-AC/hardware/key/key.c

@@ -1,6 +1,3 @@
-#include "key.h"
-#include "common.h"
-#include "gd32e23x.h"
 
 
 
@@ -9,18 +6,3 @@
 
 
 
-
-
-
-
-
-
-
-void key_init(void)
-{
-	
-}
-
-
-
-

+ 0 - 17
truing_control/PDU-AC/hardware/key/key.h

@@ -1,18 +1 @@
-#ifndef __KEY_H_
-#define __KEY_H_
-
-
-
-
-
-
-
-
-
-
-
-void key_init(void);
-
-#endif
-
 

+ 31 - 0
truing_control/PDU-AC/hardware/led/led.c

@@ -0,0 +1,31 @@
+/*********************************************************************************************************
+* Module   : led
+* Abstract : 
+* Version  : 1.0.0
+* Author   : Leopul(COPYRIGHT 2025 ~ 2027 Leopul. All rights reserved.)
+* Complete : 2025-04-09
+* Content  : None
+* Note     : None
+*********************************************************************************************************/
+#include "led.h"
+#include "common.h"
+#include "gd32e23x.h"
+
+
+
+static void led_flash(void);
+
+void led_init(void)
+{
+	board_t * board = get_board();
+	rcu_periph_clock_enable(RCU_GPIOC);
+	gpio_mode_set(GPIOC,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLUP,GPIO_PIN_13);
+	gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13);
+	gpio_bit_set(GPIOC,GPIO_PIN_13);
+	board->led_flash = led_flash;
+}
+
+static void led_flash(void)
+{
+	gpio_bit_toggle(GPIOC,GPIO_PIN_13);
+}

+ 23 - 0
truing_control/PDU-AC/hardware/led/led.h

@@ -0,0 +1,23 @@
+/*********************************************************************************************************
+* Module   : led
+* Abstract : 
+* Version  : 1.0.0
+* Author   : Leopul(COPYRIGHT 2025 ~ 2027 Leopul. All rights reserved.)
+* Complete : 2025-04-09
+* Content  : None
+* Note     : None
+*********************************************************************************************************/
+
+#ifndef __LED_H_
+#define __LED_H_
+
+
+
+
+
+void led_init(void);
+
+
+
+#endif
+

+ 43 - 0
truing_control/PDU-AC/hardware/lock/lock.c

@@ -0,0 +1,43 @@
+/*********************************************************************************************************
+* Module   : lock
+* Abstract : 
+* Version  : 1.0.0
+* Author   : Leopul(COPYRIGHT 2025 ~ 2027 Leopul. All rights reserved.)
+* Complete : 2025-04-09
+* Content  : None
+* Note     : None
+*********************************************************************************************************/
+#include "lock.h"
+#include "gd32e23x.h"
+#include "common.h"
+
+
+
+
+
+static void lock(void);
+static void unlock(void);
+
+
+void lock_init(void)
+{
+	board_t * board = get_board();
+	rcu_periph_clock_enable(RCU_GPIOF);
+	gpio_mode_set(GPIOF, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_6 | GPIO_PIN_7);
+	gpio_output_options_set(GPIOF, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6 | GPIO_PIN_7);
+	gpio_bit_reset(GPIOF, GPIO_PIN_6);
+	gpio_bit_set(GPIOF, GPIO_PIN_7);
+	board->lock = lock;
+	board->unlock = unlock;
+}
+
+static void lock(void)
+{
+	gpio_bit_set(GPIOF, GPIO_PIN_7);
+}
+
+static void unlock(void)
+{
+	gpio_bit_reset(GPIOF, GPIO_PIN_7);
+}
+

+ 30 - 0
truing_control/PDU-AC/hardware/lock/lock.h

@@ -0,0 +1,30 @@
+/*********************************************************************************************************
+* Module   : lock
+* Abstract : 
+* Version  : 1.0.0
+* Author   : Leopul(COPYRIGHT 2025 ~ 2027 Leopul. All rights reserved.)
+* Complete : 2025-04-09
+* Content  : None
+* Note     : None
+*********************************************************************************************************/
+#ifndef __LOCK_H_
+#define __LOCK_H_
+
+
+
+
+
+
+
+
+
+
+
+
+void lock_init(void);
+
+
+
+#endif
+
+

+ 47 - 14
truing_control/PDU-AC/hardware/relay/relay.c

@@ -84,7 +84,7 @@
 #define RELAY_6_OFF        gpio_bit_reset(RELAY_GPIO,RELAY_6);
 
 #define RELAY_7_ON         gpio_bit_set(RELAY_GPIO,RELAY_7);
-#define RELAY_8_OFF        gpio_bit_reset(RELAY_GPIO,RELAY_7);
+#define RELAY_7_OFF        gpio_bit_reset(RELAY_GPIO,RELAY_7);
 
 #define RELAY_8_ON         gpio_bit_set(RELAY_GPIO,RELAY_8);
 #define RELAY_8_OFF        gpio_bit_reset(RELAY_GPIO,RELAY_8);
@@ -94,7 +94,7 @@
 
 static void relay_open(uint8_t channel);
 static void relay_close(uint8_t channel);
-
+static void relay_sync(void);
 
 
 void relay_init(void)
@@ -103,36 +103,53 @@ void relay_init(void)
 	rcu_periph_clock_enable(RELAY_RCU);
 	
 	#if (RelaySlaveChaNum >=1)
-		gpio_mode_set(RELAY_GPIO,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLDOWN,RELAY_1);
+		gpio_mode_set(RELAY_GPIO,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,RELAY_1);
+		gpio_output_options_set(RELAY_GPIO, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, RELAY_1);
+		gpio_bit_reset(RELAY_GPIO, RELAY_1);
 	#endif
 	#if (RelaySlaveChaNum >=2)
-		gpio_mode_set(RELAY_GPIO,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLDOWN,RELAY_2);
+		gpio_mode_set(RELAY_GPIO,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,RELAY_2);
+		gpio_output_options_set(RELAY_GPIO, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, RELAY_2);
+		gpio_bit_reset(RELAY_GPIO, RELAY_2);
 	#endif
 	#if (RelaySlaveChaNum >=3)
-		gpio_mode_set(RELAY_GPIO,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLDOWN,RELAY_3);
+		gpio_mode_set(RELAY_GPIO,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,RELAY_3);
+		gpio_output_options_set(RELAY_GPIO, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, RELAY_3);
+		gpio_bit_reset(RELAY_GPIO, RELAY_3);
 	#endif
 	#if (RelaySlaveChaNum >=4)
-		gpio_mode_set(RELAY_GPIO,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLDOWN,RELAY_4);
+		gpio_mode_set(RELAY_GPIO,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,RELAY_4);
+		gpio_output_options_set(RELAY_GPIO, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, RELAY_4);
+		gpio_bit_reset(RELAY_GPIO, RELAY_4);
 	#endif
 	
 
 #if (!SUPPORT_TWIN_FIRE)
 	#if (RelaySlaveChaNum >=5)
 		gpio_mode_set(RELAY_GPIO,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLDOWN,RELAY_5);
+		gpio_output_options_set(RELAY_GPIO, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, RELAY_5);
+		gpio_bit_reset(RELAY_GPIO, RELAY_5);
 	#endif
 	#if (RelaySlaveChaNum >=6)
 		gpio_mode_set(RELAY_GPIO,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLDOWN,RELAY_6);
+		gpio_output_options_set(RELAY_GPIO, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, RELAY_6);
+		gpio_bit_reset(RELAY_GPIO, RELAY_6);
 	#endif
 	#if (RelaySlaveChaNum >=7)
 		gpio_mode_set(RELAY_GPIO,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLDOWN,RELAY_7);
+		gpio_output_options_set(RELAY_GPIO, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, RELAY_7);
+		gpio_bit_reset(RELAY_GPIO, RELAY_7);
 	#endif
 	#if (RelaySlaveChaNum >=8)
 		gpio_mode_set(RELAY_GPIO,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLDOWN,RELAY_8);
+		gpio_output_options_set(RELAY_GPIO, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, RELAY_8);
+		gpio_bit_reset(RELAY_GPIO, RELAY_8);
 	#endif	
 #endif
 	
 	board->open = relay_open;
 	board->close = relay_close;
+	board->relay_sync = relay_sync;
 }
 
 static void relay_open(uint8_t channel)
@@ -140,7 +157,7 @@ static void relay_open(uint8_t channel)
 	board_t * board = get_board();
 	if(channel >= RelaySlaveChaNum)
 		return;
-	if(board->relay_staging_staus[channel] == RELAY_OPEN)
+	if(board->relay_staging_staus[channel] == RELAY_OPEN && (board->md_data.rw_data.relay_status[channel] != RELAY_OPEN))
 	{
 		switch(channel)
 		{
@@ -164,7 +181,6 @@ static void relay_open(uint8_t channel)
 				RELAY_4_ON;
 				break;
 	#endif
-#if (!SUPPORT_TWIN_FIRE)
 	#if (RelaySlaveChaNum >= 5)
 			case 4:
 				RELAY_5_ON;
@@ -185,11 +201,11 @@ static void relay_open(uint8_t channel)
 				RELAY_8_ON;
 				break;
 	#endif
-#endif
+
 			default:
 				break;
 		}
-		board->md_data.relay_status[channel] = RELAY_OPEN;
+		board->md_data.rw_data.relay_status[channel] = RELAY_OPEN;
 		board->unlock();
 		board->lock();
 	}
@@ -201,7 +217,7 @@ static void relay_close(uint8_t channel)
 	if(channel >= RelaySlaveChaNum)
 		return;
 
-	if(board->relay_staging_staus[channel] == RELAY_CLOSE)
+	if((board->relay_staging_staus[channel] == RELAY_CLOSE) && (board->md_data.rw_data.relay_status[channel] != RELAY_CLOSE))
 	{
 		switch(channel)
 		{
@@ -225,7 +241,7 @@ static void relay_close(uint8_t channel)
 				RELAY_4_OFF;
 				break;
 	#endif
-#if (!SUPPORT_TWIN_FIRE)
+
 	#if (RelaySlaveChaNum >= 5)
 			case 4:
 				RELAY_5_OFF;
@@ -246,12 +262,29 @@ static void relay_close(uint8_t channel)
 				RELAY_8_OFF;
 				break;
 	#endif
-#endif
 			default:
 				break;
 		}
-		board->md_data.relay_status[channel] = RELAY_CLOSE;
+		board->md_data.rw_data.relay_status[channel] = RELAY_CLOSE;
 		board->unlock();
 		board->lock();
 	}
 }
+
+static void relay_sync(void)
+{
+	board_t * board = get_board();
+	for(int i = 0; i < RelaySlaveChaNum;i++)
+	{
+		if(board->relay_staging_staus[i] == RELAY_CLOSE)
+		{
+			relay_close(i);
+		}else if(board->relay_staging_staus[i] == RELAY_OPEN)
+		{
+			relay_open(i);
+		}else
+		{
+			;
+		}
+	}
+}

+ 175 - 0
truing_control/PDU-AC/hardware/timer/timer.c

@@ -0,0 +1,175 @@
+/*********************************************************************************************************
+* Module   : timer
+* Abstract : defined data structure! 
+* Version  : 1.0.0
+* Author   : Leopul(COPYRIGHT 2025 ~ 2027 Leopul. All rights reserved.)
+* Complete : 2025-04-09
+* Content  : None
+* Note     : None
+*********************************************************************************************************/
+#include "timer.h"
+#include "gd32e23x.h"
+#include "board_cfg.h"
+#include "common.h"
+
+
+static board_t *board = 0;
+static timer14_config(uint16_t arr,uint16_t psc);
+static void relay_remember(void);
+
+static  uint16_t count_1s = 0;
+static  uint16_t count_3s = 0;
+void time_init(void)
+{
+	timer14_config(9999,71);
+}
+
+static timer14_config(uint16_t arr,uint16_t psc)
+{
+	board = get_board();
+	
+	timer_parameter_struct timer_initpara;
+	rcu_periph_clock_enable(RCU_TIMER14);
+	timer_deinit(TIMER14); 
+	timer_struct_para_init(&timer_initpara);
+	
+	timer_initpara.prescaler         = psc;
+	timer_initpara.counterdirection  = TIMER_COUNTER_UP;
+	timer_initpara.period            = arr; 
+	timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;
+	timer_init(TIMER14, &timer_initpara);
+	
+	timer_interrupt_enable(TIMER14, TIMER_INT_UP);
+	nvic_irq_enable(TIMER14_IRQn, 2);
+	timer_enable(TIMER14);
+}
+
+void TIMER14_IRQHandler(void)
+{
+	if(timer_interrupt_flag_get(TIMER14, TIMER_INT_FLAG_UP) == SET)
+	{
+		timer_interrupt_flag_clear(TIMER14, TIMER_INT_FLAG_UP);
+	}
+	if(board)
+	{
+		count_1s ++;
+		board->detection_1_count ++;
+		if(board->detection_1_count >= 100)
+		{
+			board->detection_1_value  = 0;
+			board->detection_1_count = 0;
+		}
+#if SURPPORT_2_PT
+		if(board->detection_2_count >= 100)
+		{
+			board->detection_2_value  = 0;
+			 board->detection_2_count = 0;		
+		}		
+		
+#endif
+		
+		if(count_1s == 100)
+		{
+			board->flag_1s = 1;
+			count_1s = 0;
+			count_3s ++;
+			if(count_3s == 3)
+			{
+				board->eeprom_write_flag = 1;
+				count_3s = 0;
+			}
+		}
+		
+		if(board->all_switch_stu == ALL_OFF)
+		{
+			board->timer_count++;
+			for(int i = 0; i < RelaySlaveChaNum;i++)
+			{
+				if(board->md_data.rw_data.delay_chn[i].delay_close == board->timer_count 
+					|| board->md_data.rw_data.delay_chn[i].delay_close == 0 
+					|| board->md_data.rw_data.delay_chn[i].delay_close == 0XFFFF)
+				{
+					board->close(i);
+					board->all_switch_count ++;
+				}
+			}
+			if(board->all_switch_count == RelaySlaveChaNum)
+			{
+				board->all_switch_stu == ALL_IDLE;
+				board->all_switch_count = 0;
+			}
+		}else if(board->all_switch_stu == ALL_ON)
+		{
+			board->timer_count++;
+			for(int i = 0; i < RelaySlaveChaNum;i++)
+			{
+				if(board->md_data.rw_data.delay_chn[i].delay_open == board->timer_count 
+					|| board->md_data.rw_data.delay_chn[i].delay_open == 0 
+					|| board->md_data.rw_data.delay_chn[i].delay_open == 0XFFFF)
+				{
+					board->open(i);
+					board->all_switch_count ++;
+				}			
+			}		
+			if(board->all_switch_count == RelaySlaveChaNum)
+			{
+				board->all_switch_stu == ALL_IDLE;
+				board->all_switch_count = 0;
+			}				
+		}	
+	}
+	
+#if (SURPPORT_2_PT && RELAY_REMENBER)
+		relay_remember();
+#endif
+}
+
+
+#if (SURPPORT_2_PT && RELAY_REMENBER)
+
+static void relay_remember(void)
+{
+	if(board)
+	{
+		if(board->input_1_en == 1)
+		{
+			board->input_1_10ms_count ++;
+			for(int i = 0; i < RelaySlaveChaNum / 2;i++)
+			{
+				if(board->md_data.rw_data.delay_chn[i].delay_open == board->input_1_10ms_count 
+					|| board->md_data.rw_data.delay_chn[i].delay_open == 0 
+					|| board->md_data.rw_data.delay_chn[i].delay_open == 0XFFFF)	
+				{
+					board->open(i);
+					board->count1++;
+				}				
+			}
+			if(board->count1 == RelaySlaveChaNum / 2)
+			{
+				board->input_1_en = 0;
+				board->input_1_10ms_count = 0;
+			}
+		}
+		if(board->input_2_en == 1)
+		{
+			board->input_2_10ms_count ++;
+			for(int i = RelaySlaveChaNum / 2; i < RelaySlaveChaNum;i++)
+			{
+				if(board->md_data.rw_data.delay_chn[i].delay_open == board->input_2_10ms_count 
+					|| board->md_data.rw_data.delay_chn[i].delay_open == 0 
+					|| board->md_data.rw_data.delay_chn[i].delay_open == 0XFFFF)	
+				{
+					board->open(i);
+					board->count2++;
+				}				
+			}
+			if(board->count2 == (RelaySlaveChaNum / 2))
+			{
+				board->input_2_en = 0;
+				board->input_2_10ms_count = 0;
+			}
+		}		
+	}
+}
+
+#endif

+ 18 - 0
truing_control/PDU-AC/hardware/timer/timer.h

@@ -0,0 +1,18 @@
+/*********************************************************************************************************
+* Module   : timer
+* Abstract : defined data structure! 
+* Version  : 1.0.0
+* Author   : Leopul(COPYRIGHT 2025 ~ 2027 Leopul. All rights reserved.)
+* Complete : 2025-04-09
+* Content  : None
+* Note     : None
+*********************************************************************************************************/
+#ifndef __TIME_H_
+#define __TIME_H_
+
+
+
+void time_init(void);
+
+
+#endif

+ 171 - 0
truing_control/PDU-AC/hardware/uart/uart.c

@@ -0,0 +1,171 @@
+#include "uart.h"
+#include "board_cfg.h"
+#include "common.h"
+#include "gd32e23x.h"
+#include "Hlw8110.h"
+
+
+#define UART1_BUF_SIZE 10 
+
+extern unsigned char	u8_TxBuf[UART1_BUF_SIZE]; 
+extern unsigned char	u8_RxBuf[UART1_BUF_SIZE];
+extern unsigned char	u8_TX_Length;
+extern unsigned char	u8_RX_Length;
+extern unsigned char	u8_RX_Index;
+extern unsigned char	B_Rx_Data_ING;
+extern unsigned char	B_Rx_Finish;
+
+
+
+
+
+
+
+
+
+#define SEL_0_H  gpio_bit_set(GPIOA,GPIO_PIN_6)
+#define SEL_0_L  gpio_bit_reset(GPIOA,GPIO_PIN_6)
+
+#define SEL_1_H  gpio_bit_set(GPIOA,GPIO_PIN_7)
+#define SEL_1_L  gpio_bit_reset(GPIOA,GPIO_PIN_7)
+
+#define SEL_2_H  gpio_bit_set(GPIOB,GPIO_PIN_0)
+#define SEL_2_L  gpio_bit_reset(GPIOB,GPIO_PIN_0)
+
+
+void uart1_config(uint16_t bound)
+{
+	nvic_irq_enable(USART1_IRQn, 2);
+	rcu_periph_clock_enable(RCU_GPIOA);
+	gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_2); 
+	gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_2);
+	gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_2);
+	
+	gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_3);
+	gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_3);
+  gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_3);
+	
+	rcu_periph_clock_enable(RCU_USART1); 
+	usart_deinit(USART1);
+	usart_baudrate_set(USART1, bound);
+	usart_stop_bit_set(USART1,USART_STB_1BIT);
+	usart_word_length_set(USART1,USART_WL_9BIT);
+	usart_parity_config(USART1,USART_PM_EVEN); 
+	usart_receive_config(USART1, USART_RECEIVE_ENABLE);
+	usart_transmit_config(USART1, USART_TRANSMIT_ENABLE);
+	usart_enable(USART1);
+	usart_interrupt_enable(USART1, USART_INT_RBNE);
+	
+}
+
+
+void USART1_IRQHandler(void)
+{
+	if(usart_interrupt_flag_get(USART1, USART_INT_FLAG_RBNE) != RESET) 
+	{
+		usart_interrupt_flag_clear(USART1, USART_INT_FLAG_RBNE);
+		if (u8_RX_Index < u8_RX_Length )
+		{
+			u8_RxBuf[u8_RX_Index] = usart_data_receive(USART1); 
+			u8_RX_Index++;
+			B_Rx_Data_ING = 1;
+			if(u8_RX_Index == u8_RX_Length)
+			{
+				B_Rx_Finish = TRUE;	
+				u8_RX_Index = 0;
+			}
+		}
+	}
+}
+
+
+void Start_Send_UartData(unsigned char len)
+{
+	unsigned int i;
+	for(i=0;i<len;i++)
+	{
+		usart_data_transmit(USART1, (uint8_t)u8_TxBuf[i]); 
+		while(usart_flag_get(USART1, USART_FLAG_TC) == RESET);
+	}
+}
+
+
+void ch448f_config(void)
+{
+	rcu_periph_clock_enable(RCU_GPIOA);
+	rcu_periph_clock_enable(RCU_GPIOB);
+	
+	gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7); 
+	gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7);
+	gpio_bit_reset(GPIOA, GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7);
+	
+	gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_0);
+	gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0);
+	gpio_bit_reset(GPIOB, GPIO_PIN_0);
+}
+
+void select_channel(uint8_t chx)
+{
+	switch(chx)
+	{
+		case 0:
+		{
+			SEL_0_L;
+			SEL_1_L;
+			SEL_2_L;
+		}
+			break;
+		case 1:
+		{
+			SEL_0_H;
+			SEL_1_L;
+			SEL_2_L;	
+		}
+			break;
+		case 2:
+		{
+			SEL_0_L;
+			SEL_1_H;
+			SEL_2_L;	
+		}
+			break;
+		case 3:
+		{
+			SEL_0_H;
+			SEL_1_H;
+			SEL_2_L;	
+		}
+			break;
+		case 4:
+		{
+			SEL_0_L;
+			SEL_1_L;
+			SEL_2_H;	
+		}
+			break;
+		case 5:
+		{
+			SEL_0_H;
+			SEL_1_L;
+			SEL_2_H;	
+		}
+			break;
+		case 6:
+		{
+			SEL_0_L;
+			SEL_1_H;
+			SEL_2_H;	
+		}
+			break;
+		case 7:
+		{
+			SEL_0_H;
+			SEL_1_H;
+			SEL_2_H;	
+		}
+			break;
+		default:
+			break;
+	}
+}
+

+ 20 - 0
truing_control/PDU-AC/hardware/uart/uart.h

@@ -0,0 +1,20 @@
+#ifndef __UART_H_
+#define __UART_H_
+
+
+
+
+
+
+
+
+
+void ch448f_config(void);
+void select_channel(unsigned char chx);
+void uart1_config(unsigned short bound);
+void Start_Send_UartData(unsigned char len);
+
+
+
+#endif
+

+ 57 - 36
truing_control/PDU-AC/modbus/BARE/port/port.c

@@ -24,6 +24,8 @@
 #include "mbport.h"
 #include "string.h"
 #include "main.h"
+#include "board_cfg.h"
+#include "common.h"
 
 
 /* ----------------------- Defines ------------------------------------------*/
@@ -32,8 +34,8 @@
 #define REG_INPUT_NREGS  1
 
 //保持寄存器
-#define REG_HOLD_START   AC3PPDU_Modbus_RegStAd
-#define REG_HOLD_NREGS   1000
+#define REG_HOLD_START   START_REGISTER
+#define REG_HOLD_NREGS   700
 
 //线圈
 #define REG_COILS_START  0
@@ -115,14 +117,16 @@ unsigned int WiRegIndex;
 
 
 
-uint32_t Modbus_Wr_buff[Mb_Wcmd_Width][Mb_Wcmd_len] = {0};
+//uint32_t Modbus_Wr_buff[Mb_Wcmd_Width][Mb_Wcmd_len] = {0};
 uint8_t cmd_cnt = 0;
 
-extern uint8_t md_status;
+//extern uint8_t md_status;
+
+//extern uint8_t AC3PPDU_SlaveAddress;
+//extern uint32_t AC3PPDU_Modbus_Reg[AC3PPDU_Modbus_Reg_len];
+//extern information_t infomation;
+
 
-extern uint8_t AC3PPDU_SlaveAddress;
-extern uint32_t AC3PPDU_Modbus_Reg[AC3PPDU_Modbus_Reg_len];
-extern information_t infomation;
 
 eMBErrorCode
 eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegisterMode eMode )
@@ -131,6 +135,7 @@ eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegi
     int             iRegIndex;
 		usAddress = usAddress - 1;
 		uint32_t T_cnt = 0;
+		board_t *board = get_board();
     if((usAddress >= REG_HOLD_START) && ((usAddress+usNRegs) <= (REG_HOLD_START + REG_HOLD_NREGS)))
     {
         iRegIndex = (int)(usAddress - usRegHoldStart);
@@ -139,25 +144,19 @@ eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegi
         {
 					case MB_REG_READ://读寄存器
 					{
-						if((usAddress == Devid_ChalNumAddr)&&(usNRegs == Devid_ChalNumQua))				//读取设备类型和通道
-						{
-							usRegHoldBuf[iRegIndex]= AC3PPDU_Modbus_Reg[Mb_Dbuff_DevAddr];
-							//memcpy(&usRegHoldBuf[iRegIndex],&dev_info,usNRegs * 2);
-							//usRegHoldBuf[iRegIndex] = dev_info;
-						}
-						else if((usAddress >= AC3PPDU_VAP_Addr)&&(usAddress <= AC3PPDU_RL_Over_Ch9_Addr))//读取参数
-						{
-							T_cnt = usAddress - AC3PPDU_Modbus_RegStAd;
-							memcpy(&usRegHoldBuf[iRegIndex],(AC3PPDU_Modbus_Reg + T_cnt),usNRegs * 2);
-						}
-						else if(usAddress == AC3PPDU_INFOMATION)
-						{
-							memcpy(&usRegHoldBuf[iRegIndex],&infomation,usNRegs * 2);
-						}
-						else//错误
-						{
-							eStatus = MB_ENOREG;
-						}
+						 if(usAddress >= REG_HOLD_START && usAddress <= (REG_HOLD_START+ (sizeof(mod_data_t)/2)))
+						 {
+							 T_cnt = usAddress - REG_HOLD_START;
+							 if((sizeof(mod_data_t) / 2 - T_cnt) < usNRegs)
+							 {
+								 usNRegs = (sizeof(mod_data_t) / 2 - T_cnt);
+							 }
+							 memcpy(&usRegHoldBuf[iRegIndex],(void *)(&(board->md_data) + T_cnt),usNRegs * 2);
+						 }else
+						 {
+							 eStatus = MB_ENOREG;
+						 }
+						
 						while(usNRegs > 0)
 						{
 							*pucRegBuffer++ = (uint8_t)(usRegHoldBuf[iRegIndex] >> 8);
@@ -178,20 +177,42 @@ eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegi
 							usNRegs--;
 						}
 						{
-							if((usAddress >= AC3PPDU_ViLit_max_Addr)&&(usAddress <= AC3PPDU_BREAK_UPGRADE))
+							if(usAddress >= START_RW_REGISTER && usAddress <= (REG_HOLD_START+ (sizeof(mod_data_t)/2)))
 							{
-								
+								T_cnt = usAddress - START_RW_REGISTER;
+
+								switch(T_cnt)
 								{
-									T_cnt = usAddress - AC3PPDU_Modbus_RegStAd;
-									memcpy((Modbus_Wr_buff[cmd_cnt]+2),&usRegHoldBuf[WiRegIndex],WusNRegs * 2);
-									Modbus_Wr_buff[cmd_cnt][0] = 1;
-									Modbus_Wr_buff[cmd_cnt][1] = T_cnt;
-									
-									cmd_cnt++;
-									if(cmd_cnt >= Mb_Wcmd_Width)
+									case AC_1_STATUS ... AC_9_STATUS:			//
+									{
+										WusNRegs =	(WusNRegs > (9 - T_cnt)) ? (9 - T_cnt) : WusNRegs;
+										memcpy((uint8_t *)(&board->relay_staging_staus[0]+T_cnt),usRegHoldBuf[iRegIndex],WusNRegs * 2);
+										board->relay_sync();
+										w_eeprom_data_t data = {0};
+										data.lenth = WusNRegs * 2;
+										data.start_addr = (EEPROM_DELAY_ADDR+(T_cnt*2));
+										memcpy(&data.data,usRegHoldBuf[iRegIndex],WusNRegs * 2);
+										board->q_cache.en_queue(&data);
+									}
+										break;
+
+									case 9 ... 14:				//3 ph
+									{
+									}
+									break;
+									default:
 									{
-										cmd_cnt = 0;
+										memcpy((uint8_t *)(&board->md_data.rw_data.delay_chn[0]+T_cnt),usRegHoldBuf[iRegIndex],WusNRegs * 2);
+										
 									}
+										break;
+
+									
+								}
+								cmd_cnt ++;
+								if(cmd_cnt == 16)
+								{
+									cmd_cnt = 0;
 								}
 							}else
 							{

+ 3 - 3
truing_control/PDU-AC/modbus/BARE/port/portserial.c

@@ -67,11 +67,11 @@ BOOL
 xMBPortSerialInit( UCHAR ucPORT, ULONG ulBaudRate, UCHAR ucDataBits, eMBParity eParity )
 {
 	
-	nvic_irq_enable(USART0_IRQn, 0);     //使能串口中断,设置优先级
-  rcu_periph_clock_enable(RCU_GPIOA);  //使能GPIOA时钟
+	nvic_irq_enable(USART0_IRQn, 0);     
+  rcu_periph_clock_enable(RCU_GPIOA);  
 
   //配置TX的GPIO 
-  gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_9);  //复用PA9
+  gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_9); 
   gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_9);
   gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_9);
   

Разница между файлами не показана из-за своего большого размера
+ 187 - 124
truing_control/PDU-AC/prj/ctrl_board.uvguix.Gowon


+ 131 - 32
truing_control/PDU-AC/prj/ctrl_board.uvoptx

@@ -103,7 +103,7 @@
         <bEvRecOn>1</bEvRecOn>
         <bSchkAxf>0</bSchkAxf>
         <bTchkAxf>0</bTchkAxf>
-        <nTsel>13</nTsel>
+        <nTsel>4</nTsel>
         <sDll></sDll>
         <sDllPa></sDllPa>
         <sDlgDll></sDlgDll>
@@ -114,9 +114,24 @@
         <tDlgDll></tDlgDll>
         <tDlgPa></tDlgPa>
         <tIfile></tIfile>
-        <pMon>BIN\UL2V8M.DLL</pMon>
+        <pMon>Segger\JL2CM3.dll</pMon>
       </DebugOpt>
       <TargetDriverDllRegistry>
+        <SetRegEntry>
+          <Number>0</Number>
+          <Key>DLGTARM</Key>
+          <Name>(6010=-1,-1,-1,-1,0)(6018=-1,-1,-1,-1,0)(6019=-1,-1,-1,-1,0)(6008=-1,-1,-1,-1,0)(6009=-1,-1,-1,-1,0)(6014=-1,-1,-1,-1,0)(6015=-1,-1,-1,-1,0)(6003=-1,-1,-1,-1,0)(6000=-1,-1,-1,-1,0)</Name>
+        </SetRegEntry>
+        <SetRegEntry>
+          <Number>0</Number>
+          <Key>ARMDBGFLAGS</Key>
+          <Name></Name>
+        </SetRegEntry>
+        <SetRegEntry>
+          <Number>0</Number>
+          <Key>JL2CM3</Key>
+          <Name>-U69545260 -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(0BF11477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO31 -FD20000000 -FC1000 -FN1 -FF0GD32E23x.FLM -FS08000000 -FL010000 -FP0($$Device:GD32E230C8$Flash\GD32E23x.FLM)</Name>
+        </SetRegEntry>
         <SetRegEntry>
           <Number>0</Number>
           <Key>UL2V8M</Key>
@@ -124,18 +139,30 @@
         </SetRegEntry>
       </TargetDriverDllRegistry>
       <Breakpoint/>
+      <WatchWindow1>
+        <Ww>
+          <count>0</count>
+          <WinNumber>1</WinNumber>
+          <ItemText>get_board</ItemText>
+        </Ww>
+        <Ww>
+          <count>1</count>
+          <WinNumber>1</WinNumber>
+          <ItemText>ac_board</ItemText>
+        </Ww>
+      </WatchWindow1>
       <Tracepoint>
         <THDelay>0</THDelay>
       </Tracepoint>
       <DebugFlag>
         <trace>0</trace>
         <periodic>1</periodic>
-        <aLwin>0</aLwin>
+        <aLwin>1</aLwin>
         <aCover>0</aCover>
         <aSer1>0</aSer1>
         <aSer2>0</aSer2>
         <aPa>0</aPa>
-        <viewmode>0</viewmode>
+        <viewmode>1</viewmode>
         <vrSel>0</vrSel>
         <aSym>0</aSym>
         <aTbox>0</aTbox>
@@ -323,6 +350,18 @@
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>12</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\fw_lib\Source\gd32e23x_exti.c</PathWithFileName>
+      <FilenameWithoutPath>gd32e23x_exti.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
   </Group>
 
   <Group>
@@ -333,7 +372,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>12</FileNumber>
+      <FileNumber>13</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -345,7 +384,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>13</FileNumber>
+      <FileNumber>14</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -357,7 +396,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>14</FileNumber>
+      <FileNumber>15</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -369,7 +408,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>15</FileNumber>
+      <FileNumber>16</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -381,7 +420,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>16</FileNumber>
+      <FileNumber>17</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -393,7 +432,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>17</FileNumber>
+      <FileNumber>18</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -405,7 +444,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>18</FileNumber>
+      <FileNumber>19</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -417,7 +456,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>19</FileNumber>
+      <FileNumber>20</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -429,7 +468,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>20</FileNumber>
+      <FileNumber>21</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -441,7 +480,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>21</FileNumber>
+      <FileNumber>22</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -453,7 +492,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>22</FileNumber>
+      <FileNumber>23</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -465,7 +504,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>23</FileNumber>
+      <FileNumber>24</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -475,6 +514,42 @@
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
+    <File>
+      <GroupNumber>4</GroupNumber>
+      <FileNumber>25</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\hardware\hlw8110\Hlw8110.c</PathWithFileName>
+      <FilenameWithoutPath>Hlw8110.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>4</GroupNumber>
+      <FileNumber>26</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\hardware\electricity\electricity.c</PathWithFileName>
+      <FilenameWithoutPath>electricity.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>4</GroupNumber>
+      <FileNumber>27</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\hardware\quere\query.c</PathWithFileName>
+      <FilenameWithoutPath>query.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
   </Group>
 
   <Group>
@@ -485,7 +560,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>24</FileNumber>
+      <FileNumber>28</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -497,7 +572,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>25</FileNumber>
+      <FileNumber>29</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -509,7 +584,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>26</FileNumber>
+      <FileNumber>30</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -521,7 +596,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>27</FileNumber>
+      <FileNumber>31</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -533,7 +608,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>28</FileNumber>
+      <FileNumber>32</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -545,7 +620,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>29</FileNumber>
+      <FileNumber>33</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -557,7 +632,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>30</FileNumber>
+      <FileNumber>34</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -569,7 +644,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>31</FileNumber>
+      <FileNumber>35</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -581,7 +656,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>32</FileNumber>
+      <FileNumber>36</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -593,7 +668,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>33</FileNumber>
+      <FileNumber>37</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -605,7 +680,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>34</FileNumber>
+      <FileNumber>38</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -617,7 +692,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>35</FileNumber>
+      <FileNumber>39</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -629,7 +704,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>36</FileNumber>
+      <FileNumber>40</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -641,7 +716,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>37</FileNumber>
+      <FileNumber>41</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -653,7 +728,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>38</FileNumber>
+      <FileNumber>42</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -673,7 +748,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>39</FileNumber>
+      <FileNumber>43</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -683,6 +758,30 @@
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
+    <File>
+      <GroupNumber>6</GroupNumber>
+      <FileNumber>44</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\user\systick.c</PathWithFileName>
+      <FilenameWithoutPath>systick.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>6</GroupNumber>
+      <FileNumber>45</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\user\gd32e23x_it.c</PathWithFileName>
+      <FilenameWithoutPath>gd32e23x_it.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
   </Group>
 
   <Group>

+ 34 - 4
truing_control/PDU-AC/prj/ctrl_board.uvprojx

@@ -52,7 +52,7 @@
           <OutputName>ctrl_board</OutputName>
           <CreateExecutable>1</CreateExecutable>
           <CreateLib>0</CreateLib>
-          <CreateHexFile>0</CreateHexFile>
+          <CreateHexFile>1</CreateHexFile>
           <DebugInformation>1</DebugInformation>
           <BrowseInformation>1</BrowseInformation>
           <ListingPath>.\Listings\</ListingPath>
@@ -275,8 +275,8 @@
               </OCR_RVCT3>
               <OCR_RVCT4>
                 <Type>1</Type>
-                <StartAddress>0x8004000</StartAddress>
-                <Size>0xc000</Size>
+                <StartAddress>0x8000000</StartAddress>
+                <Size>0x10000</Size>
               </OCR_RVCT4>
               <OCR_RVCT5>
                 <Type>1</Type>
@@ -339,7 +339,7 @@
               <MiscControls></MiscControls>
               <Define>GD32E230</Define>
               <Undefine></Undefine>
-              <IncludePath>..\common;..\core\Include;..\fw_lib\Include;..\hardware\detection;..\hardware\eeprom;..\hardware\flash;..\hardware\fwdgt;..\hardware\haddr;..\hardware\hlw8110;..\hardware\jlink;..\hardware\key;..\hardware\led;..\hardware\lock;..\hardware\relay;..\hardware\timer;..\hardware\uart;..\hardware\switch;..\modbus\ascii;..\modbus\BARE\port;..\modbus\functions;..\modbus\include;..\modbus\rtu;..\user</IncludePath>
+              <IncludePath>..\common;..\core\Include;..\fw_lib\Include;..\hardware\detection;..\hardware\eeprom;..\hardware\flash;..\hardware\fwdgt;..\hardware\haddr;..\hardware\hlw8110;..\hardware\jlink;..\hardware\key;..\hardware\led;..\hardware\lock;..\hardware\relay;..\hardware\timer;..\hardware\uart;..\hardware\switch;..\modbus\ascii;..\modbus\BARE\port;..\modbus\functions;..\modbus\include;..\modbus\rtu;..\user;..\hardware\electricity;..\hardware\quere</IncludePath>
             </VariousControls>
           </Cads>
           <Aads>
@@ -448,6 +448,11 @@
               <FileType>1</FileType>
               <FilePath>..\fw_lib\Source\gd32e23x_usart.c</FilePath>
             </File>
+            <File>
+              <FileName>gd32e23x_exti.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\fw_lib\Source\gd32e23x_exti.c</FilePath>
+            </File>
           </Files>
         </Group>
         <Group>
@@ -513,6 +518,21 @@
               <FileType>1</FileType>
               <FilePath>..\hardware\uart\uart.c</FilePath>
             </File>
+            <File>
+              <FileName>Hlw8110.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\hardware\hlw8110\Hlw8110.c</FilePath>
+            </File>
+            <File>
+              <FileName>electricity.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\hardware\electricity\electricity.c</FilePath>
+            </File>
+            <File>
+              <FileName>query.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\hardware\quere\query.c</FilePath>
+            </File>
           </Files>
         </Group>
         <Group>
@@ -603,6 +623,16 @@
               <FileType>1</FileType>
               <FilePath>..\user\main.c</FilePath>
             </File>
+            <File>
+              <FileName>systick.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\user\systick.c</FilePath>
+            </File>
+            <File>
+              <FileName>gd32e23x_it.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\user\gd32e23x_it.c</FilePath>
+            </File>
           </Files>
         </Group>
         <Group>

+ 2 - 1
truing_control/PDU-AC/user/board_cfg.h

@@ -101,9 +101,10 @@
 	#define   ZERO_CTRL_NUM             (ZERO_LINE_NONE)
 	#define   OUTPUT_CONTRL             (OUTPUT_CTRL_YES)
 	#define   DEVICE_TYPE               DEIVECE(POWER_TYPE,INPUT_PT_NUM,ZERO_CONTRL,ZERO_CTRL_NUM,OUTPUT_CONTRL)
-	#define 	RelaySlaveChaNum 					6
+	#define 	RelaySlaveChaNum 					8
 	#define 	RELAY_REMENBER						1
 	#define   SURPPORT_2_PT             1
+	#define 	SUPPORT_ALL_ON_OFF        1
 #elif   PRJ_1_All_OLD
 	#define 	RelaySlaveChaNum 					1
 	#define   SUPPORT_4_KEY             1

+ 11 - 11
truing_control/PDU-AC/user/gd32e23x_it.c

@@ -35,7 +35,7 @@ OF SUCH DAMAGE.
 #include "gd32e23x_it.h"
 #include "main.h"
 #include "systick.h"
-#include "cfg.h"
+
 
 /*!
     \brief      this function handles NMI exception
@@ -57,18 +57,18 @@ enum {
 	ERROR_PendSV,
 };
 
-extern META_DATA_S meta_data;
-extern uint32_t normal_running_time;
-extern void flash_erase_meta();
-extern void flash_write_meta(const META_DATA_S *meta_data);
+//extern META_DATA_S meta_data;
+//extern uint32_t normal_running_time;
+//extern void flash_erase_meta();
+//extern void flash_write_meta(const META_DATA_S *meta_data);
 inline static void set_error(uint8_t error)
 {
-	meta_data.errno = error;
-	meta_data.error_count ++;
-	meta_data.recent_running_time = normal_running_time;
-	flash_erase_meta();
-	flash_write_meta(&meta_data);
-	NVIC_SystemReset();
+//	meta_data.errno = error;
+//	meta_data.error_count ++;
+//	meta_data.recent_running_time = normal_running_time;
+//	flash_erase_meta();
+//	flash_write_meta(&meta_data);
+//	NVIC_SystemReset();
 }
 
 void NMI_Handler(void)

+ 78 - 2
truing_control/PDU-AC/user/main.c

@@ -1,5 +1,18 @@
-
 #include "common.h"
+#include "eeprom.h"
+#include "flash.h"
+#include "detection.h"
+#include "fwdgt.h"
+#include "haddr.h"
+#include "relay.h"
+#include "lock.h"
+#include "uart.h"
+#include "timer.h"
+#include "led.h"
+#include "systick.h"
+#include "mb.h"
+#include "flash.h"
+#include "electricity.h"
 
 
 
@@ -11,11 +24,74 @@ board_t *get_board()
 	return &ac_board;
 }
 
+
+
+static void task_query(void);
+static void task_1s(void);
+
+
+
+
+
 int main(){
 	
+	InitSysTick();
+	led_init();
+	lock_init();
+	detection_init();
+	relay_init();
+	haddr_init();
+	relay_init();
+	eeprom_init();
+	time_init();
+	electricity_init();
+	query_init();
+	
+	eMBInit(MB_RTU, ac_board.haddr, 0, 115200, MB_PAR_NONE);
+	eMBEnable();
+	read_config_from_eeprom();
+	
+	strcpy(&(ac_board.md_data.r_data.b_info.date),__DATE__);
+	strcat(&(ac_board.md_data.r_data.b_info.date)," ");
+	strcat(&(ac_board.md_data.r_data.b_info.date),__TIME__);
+	strcpy(&(ac_board.md_data.r_data.b_info.version),VERSION);
+	
+	flash_get_infomation(&ac_board.md_data.r_data.b_info);
 	while(1)
 	{
-		
+		task_query();
+		task_1s();
+		eMBPoll();
+		ac_board.opt_detection();
 	}
 	return 0;
+}
+
+
+
+static void task_query(void)
+{
+	w_eeprom_data_t data = {0};
+	if(ac_board.q_cache.de_queue(&data))
+	{
+		ac_board.write_eeprom(data.start_addr,&data.data,data.lenth);
+	}
+}
+
+static void task_1s(void)
+{
+	static uint8_t channel = 0;
+	if(ac_board.flag_1s)
+	{
+			ac_board.flag_1s = 0;
+			ac_board.led_flash();
+			ac_board.detection();
+			ac_board.read_ele(channel);
+			ac_board.check_out_wanning(channel);
+			channel++;
+			if(channel == RelaySlaveChaNum)
+			{
+				channel = 0;
+			}
+	}
 }