#include "Exti.h" #include "gd32e230x_conf.h" #include "main.h" #define INPUT_PIN_1 GPIO_PIN_7 #define INPUT_PIN_2 GPIO_PIN_8 #define SWTICH_PIN GPIO_PIN_5 #define EXIT_INPUT_PIN_1 EXTI_SOURCE_PIN7 #define EXIT_INPUT_PIN_2 EXTI_SOURCE_PIN8 #define SWITCH_INPUT_PIN EXTI_SOURCE_PIN5 #define INPUT_EXIT_1 EXTI_7 #define INPUT_EXIT_2 EXTI_8 #define SWITCH_EXTI EXTI_5 static void read_input_level(uint8_t channel); static void read_switch_level(); void sts_exti_init(void) { rcu_periph_clock_enable(RCU_GPIOB); rcu_periph_clock_enable(RCU_CFGCMP); //rcu_periph_clock_enable(RCU_AF); gpio_mode_set(GPIOB,GPIO_MODE_INPUT,GPIO_PUPD_NONE,INPUT_PIN_1); gpio_mode_set(GPIOB,GPIO_MODE_INPUT,GPIO_PUPD_NONE,INPUT_PIN_2); gpio_mode_set(GPIOB,GPIO_MODE_INPUT,GPIO_PUPD_NONE,SWTICH_PIN); nvic_irq_enable(EXTI4_15_IRQn,0); syscfg_exti_line_config(EXTI_SOURCE_GPIOB,EXIT_INPUT_PIN_1); syscfg_exti_line_config(EXTI_SOURCE_GPIOB,EXIT_INPUT_PIN_2); syscfg_exti_line_config(EXTI_SOURCE_GPIOB,SWITCH_INPUT_PIN); exti_init(INPUT_EXIT_1,EXTI_INTERRUPT,EXTI_TRIG_BOTH); exti_init(INPUT_EXIT_2,EXTI_INTERRUPT,EXTI_TRIG_BOTH); exti_init(SWITCH_EXTI,EXTI_INTERRUPT,EXTI_TRIG_BOTH); exti_interrupt_flag_clear(INPUT_EXIT_1); exti_interrupt_flag_clear(INPUT_EXIT_2); exti_interrupt_flag_clear(SWITCH_EXTI); sts_data_t * data = get_sts(); data->read_input_level = read_input_level; data->read_switch_level = read_switch_level; } uint8_t get_exti_in_1(void) { return gpio_input_bit_get(GPIOB,INPUT_PIN_1); } uint8_t get_exti_in_2(void) { return gpio_input_bit_get(GPIOB,INPUT_PIN_2); } static void read_input_level(uint8_t channel) { sts_data_t * data = get_sts(); switch(channel) { case INPUT_CHANNEL_1: { data->m_data.input_status.input_status[INPUT_CHANNEL_1] = get_exti_in_1(); } break; case INPUT_CHANNEL_2: { data->m_data.input_status.input_status[INPUT_CHANNEL_2] = get_exti_in_2(); } break; default: break; } } uint8_t get_exti_switch(void) { return gpio_input_bit_get(GPIOB,SWTICH_PIN); } static void read_switch_level() { sts_data_t * data = get_sts(); data->switch_status = get_exti_switch(); } void EXTI4_15_IRQHandler(void) { sts_data_t * data = get_sts(); if(RESET != exti_interrupt_flag_get(INPUT_EXIT_1)) { if(get_exti_in_1() == SET) //rising { data->m_data.input_status.input_status[INPUT_CHANNEL_1] = 1; }else //falling { data->m_data.input_status.input_status[INPUT_CHANNEL_1] = 0; if(data->m_data.input_status.input_status[INPUT_CHANNEL_2]) { data->choise_input(INPUT_CHANNEL_2); } } exti_interrupt_flag_clear(INPUT_EXIT_1); } if(RESET != exti_interrupt_flag_get(INPUT_EXIT_2)) { if(get_exti_in_2() == SET) //rising { data->m_data.input_status.input_status[INPUT_CHANNEL_2] = 1; }else //falling { data->m_data.input_status.input_status[INPUT_CHANNEL_2] = 0; if(data->m_data.input_status.input_status[INPUT_CHANNEL_1]) { data->choise_input(INPUT_CHANNEL_1); } } exti_interrupt_flag_clear(INPUT_EXIT_2); } if(RESET != exti_interrupt_flag_get(SWITCH_EXTI)) { if(get_exti_switch() == SET) //rising { if(data->m_data.input_status.input_status[INPUT_CHANNEL_1]) { if(data->m_data.md_choise.choise_ch != INPUT_CHANNEL_1) data->choise_input(INPUT_CHANNEL_1); } }else //falling { if(data->m_data.input_status.input_status[INPUT_CHANNEL_2]) { if(data->m_data.md_choise.choise_ch != INPUT_CHANNEL_2) data->choise_input(INPUT_CHANNEL_2); } } exti_interrupt_flag_clear(SWITCH_EXTI); } }