/********************************************************************************************************* * 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_8_RCU GPIOA #define RELAY_1_7_RCU GPIOB #define RELAY_RCU RCU_GPIOB #define RELAY_GPIO GPIOB #if (RelaySlaveChaNum >= 1) #define RELAY_1 GPIO_PIN_9 #endif #if (RelaySlaveChaNum >= 2) #define RELAY_2 GPIO_PIN_8 #endif #if (RelaySlaveChaNum >= 3) #define RELAY_3 GPIO_PIN_7 #endif #if (RelaySlaveChaNum >= 4) #define RELAY_4 GPIO_PIN_6 #endif #if (RelaySlaveChaNum >= 5) #define RELAY_5 GPIO_PIN_5 #endif #if (RelaySlaveChaNum >= 6) #define RELAY_6 GPIO_PIN_4 #endif #if (RelaySlaveChaNum >= 7) #define RELAY_7 GPIO_PIN_3 #endif #if (RelaySlaveChaNum >= 8) #define RELAY_8 GPIO_PIN_15 #endif #define RELAY_1_ON gpio_bit_set(RELAY_1_7_RCU,RELAY_1); #define RELAY_1_OFF gpio_bit_reset(RELAY_1_7_RCU,RELAY_1); #define RELAY_2_ON gpio_bit_set(RELAY_1_7_RCU,RELAY_2); #define RELAY_2_OFF gpio_bit_reset(RELAY_1_7_RCU,RELAY_2); #define RELAY_3_ON gpio_bit_set(RELAY_1_7_RCU,RELAY_3); #define RELAY_3_OFF gpio_bit_reset(RELAY_1_7_RCU,RELAY_3); #define RELAY_4_ON gpio_bit_set(RELAY_1_7_RCU,RELAY_4); #define RELAY_4_OFF gpio_bit_reset(RELAY_1_7_RCU,RELAY_4); #define RELAY_5_ON gpio_bit_set(RELAY_1_7_RCU,RELAY_5); #define RELAY_5_OFF gpio_bit_reset(RELAY_1_7_RCU,RELAY_5); #define RELAY_6_ON gpio_bit_set(RELAY_1_7_RCU,RELAY_6); #define RELAY_6_OFF gpio_bit_reset(RELAY_1_7_RCU,RELAY_6); #define RELAY_7_ON gpio_bit_set(RELAY_1_7_RCU,RELAY_7); #define RELAY_7_OFF gpio_bit_reset(RELAY_1_7_RCU,RELAY_7); #define RELAY_8_ON gpio_bit_set(RELAY_8_RCU,RELAY_8); #define RELAY_8_OFF gpio_bit_reset(RELAY_8_RCU,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(RCU_GPIOB); rcu_periph_clock_enable(RCU_GPIOA); #if (RelaySlaveChaNum >=1) gpio_mode_set(RELAY_1_7_RCU,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,RELAY_1); gpio_output_options_set(RELAY_1_7_RCU, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, RELAY_1); gpio_bit_reset(RELAY_1_7_RCU, RELAY_1); #endif #if (RelaySlaveChaNum >=2) gpio_mode_set(RELAY_1_7_RCU,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,RELAY_2); gpio_output_options_set(RELAY_1_7_RCU, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, RELAY_2); gpio_bit_reset(RELAY_1_7_RCU, RELAY_2); #endif #if (RelaySlaveChaNum >=3) gpio_mode_set(RELAY_1_7_RCU,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,RELAY_3); gpio_output_options_set(RELAY_1_7_RCU, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, RELAY_3); gpio_bit_reset(RELAY_1_7_RCU, RELAY_3); #endif #if (RelaySlaveChaNum >=4) gpio_mode_set(RELAY_1_7_RCU,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,RELAY_4); gpio_output_options_set(RELAY_1_7_RCU, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, RELAY_4); gpio_bit_reset(RELAY_1_7_RCU, RELAY_4); #endif #if (RelaySlaveChaNum >=5) gpio_mode_set(RELAY_1_7_RCU,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLDOWN,RELAY_5); gpio_output_options_set(RELAY_1_7_RCU, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, RELAY_5); gpio_bit_reset(RELAY_1_7_RCU, RELAY_5); #endif #if (RelaySlaveChaNum >=6) gpio_mode_set(RELAY_1_7_RCU,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLDOWN,RELAY_6); gpio_output_options_set(RELAY_1_7_RCU, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, RELAY_6); gpio_bit_reset(RELAY_1_7_RCU, RELAY_6); #endif #if (RelaySlaveChaNum >=7) gpio_mode_set(RELAY_1_7_RCU,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLDOWN,RELAY_7); gpio_output_options_set(RELAY_1_7_RCU, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, RELAY_7); gpio_bit_reset(RELAY_1_7_RCU, RELAY_7); #endif #if (RelaySlaveChaNum >=8) gpio_mode_set(RELAY_8_RCU,GPIO_MODE_OUTPUT,GPIO_PUPD_PULLDOWN,RELAY_8); gpio_output_options_set(RELAY_8_RCU, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, RELAY_8); gpio_bit_reset(RELAY_8_RCU, RELAY_8); #endif board->unlock(); board->lock(); board->open = relay_open; board->close = relay_close; } 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.r_data.state.state[channel].state = 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.r_data.state.state[channel].state = RELAY_CLOSE; }