| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257 |
- /*********************************************************************************************************
- * 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 SUPPORT_4_ON_FLASH
- #define RELAY_4 GPIO_PIN_11
- #endif
-
- #if (RelaySlaveChaNum >= 4)
- #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 (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 SUPPORT_4_ON_FLASH
- 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_set(RELAY_GPIO, RELAY_4);
- #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
- 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;
- }
|