/********************************************************************************************************* * Module : relay * Abstract : * Version : 1.0.0 * Author : Leopul(COPYRIGHT 2025 ~ 2027 Leopul. All rights reserved.) * Complete : 2025-04-18 * Content : None * Note : None *********************************************************************************************************/ #include "relay.h" #include "gd32e23x.h" #include "board_cfg.h" #include "common.h" #define RELAY_RCU RCU_GPIOB #define RELAY_GPIO GPIOB #if (RelaySlaveChaNum >= 1) #define RELAY_1 GPIO_PIN_8 #endif #if (RelaySlaveChaNum >= 2) #define RELAY_2 GPIO_PIN_9 #endif #if (RelaySlaveChaNum >= 3) #define RELAY_3 GPIO_PIN_10 #endif #if ((POWER_TYPE == POWER_AC_3_3) && (ZERO_CTRL_NUM == ZERO_LINE_1)) #define RELAY_4 GPIO_PIN_11 #endif #if (RelaySlaveChaNum >= 4) #define RELAY_4 GPIO_PIN_11 #endif #if (RelaySlaveChaNum >= 5) #define RELAY_5 GPIO_PIN_12 #endif #if (RelaySlaveChaNum >= 6) #define RELAY_6 GPIO_PIN_13 #endif #if (RelaySlaveChaNum >= 7) #define RELAY_7 GPIO_PIN_14 #endif #if (RelaySlaveChaNum >= 8) #define RELAY_8 GPIO_PIN_15 #endif #define RELAY_1_ON gpio_bit_set(RELAY_GPIO,RELAY_1); #define RELAY_1_OFF gpio_bit_reset(RELAY_GPIO,RELAY_1); #define RELAY_2_ON gpio_bit_set(RELAY_GPIO,RELAY_2); #define RELAY_2_OFF gpio_bit_reset(RELAY_GPIO,RELAY_2); #define RELAY_3_ON gpio_bit_set(RELAY_GPIO,RELAY_3); #define RELAY_3_OFF gpio_bit_reset(RELAY_GPIO,RELAY_3); #define RELAY_4_ON gpio_bit_set(RELAY_GPIO,RELAY_4); #define RELAY_4_OFF gpio_bit_reset(RELAY_GPIO,RELAY_4); #define RELAY_5_ON gpio_bit_set(RELAY_GPIO,RELAY_5); #define RELAY_5_OFF gpio_bit_reset(RELAY_GPIO,RELAY_5); #define RELAY_6_ON gpio_bit_set(RELAY_GPIO,RELAY_6); #define RELAY_6_OFF gpio_bit_reset(RELAY_GPIO,RELAY_6); #define RELAY_7_ON gpio_bit_set(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); static void relay_open(uint8_t channel); static void relay_close(uint8_t channel); static void relay_sync(void); static void relay_zero_open(uint8_t channel); static void relay_zero_close(uint8_t channel); void relay_init(void) { board_t * board = get_board(); rcu_periph_clock_enable(RELAY_RCU); #if ((POWER_TYPE == POWER_AC_3_3) && (ZERO_CTRL_NUM == ZERO_LINE_1)) 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 (RelaySlaveChaNum >=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_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_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_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 (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 #if (POWER_TYPE == POWER_DC) board->unlock(); board->lock; #endif board->open = relay_open; board->close = relay_close; board->zero_close = relay_zero_close; board->zero_open = relay_zero_open; //board->relay_sync = relay_sync; } static void relay_open(uint8_t channel) { board_t * board = get_board(); switch(channel) { #if (RelaySlaveChaNum >= 1) case 0: RELAY_1_ON; break; #endif #if (RelaySlaveChaNum >= 2) case 1: RELAY_2_ON; break; #endif #if (RelaySlaveChaNum >= 3) case 2: RELAY_3_ON; break; #endif #if (RelaySlaveChaNum >= 4) case 3: RELAY_4_ON; break; #endif #if (RelaySlaveChaNum >= 5) case 4: RELAY_5_ON; break; #endif #if (RelaySlaveChaNum >= 6) case 5: RELAY_6_ON; break; #endif #if (RelaySlaveChaNum >= 7) case 6: RELAY_7_ON; break; #endif #if (RelaySlaveChaNum >= 8) case 7: RELAY_8_ON; break; #endif default: return; } board->unlock(); board->lock(); board->md_data.rw_data.rw_d.relay_status[channel] = RELAY_OPEN; } static void relay_close(uint8_t channel) { board_t * board = get_board(); switch(channel) { #if (RelaySlaveChaNum >= 1) case 0: RELAY_1_OFF; break; #endif #if (RelaySlaveChaNum >= 2) case 1: RELAY_2_OFF; break; #endif #if (RelaySlaveChaNum >= 3) case 2: RELAY_3_OFF; break; #endif #if (RelaySlaveChaNum >= 4) case 3: RELAY_4_OFF; break; #endif #if (RelaySlaveChaNum >= 5) case 4: RELAY_5_OFF; break; #endif #if (RelaySlaveChaNum >= 6) case 5: RELAY_6_OFF; break; #endif #if (RelaySlaveChaNum >= 7) case 6: RELAY_7_OFF; break; #endif #if (RelaySlaveChaNum >= 8) case 7: RELAY_8_OFF; break; #endif default: return; } board->unlock(); board->lock(); board->md_data.rw_data.rw_d.relay_status[channel] = RELAY_CLOSE; } 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 { ; } } } static void relay_zero_open(uint8_t channel) { board_t * board = get_board(); if(channel >= ZERO_CTRL_NUM) return; switch(channel) { #if (ZERO_CTRL_NUM >= 1) case 0: RELAY_4_ON; break; #endif default: return; } board->unlock(); board->lock(); board->md_data.rw_data.rw_d.zero_relay_status[channel] = RELAY_OPEN; } static void relay_zero_close(uint8_t channel) { board_t * board = get_board(); switch(channel) { #if (ZERO_CTRL_NUM >= 1) case 0: RELAY_4_OFF; break; #endif default: return; } board->unlock(); board->lock(); board->md_data.rw_data.rw_d.zero_relay_status[channel] = RELAY_CLOSE; }