#include "Exti.h" #include "gd32e230x_conf.h" #include "main.h" #define INPUT_PIN_1 GPIO_PIN_0 #define INPUT_PIN_2 GPIO_PIN_1 #define SWTICH_PIN GPIO_PIN_9 #define EXIT_INPUT_PIN_1 EXTI_SOURCE_PIN0 #define EXIT_INPUT_PIN_2 EXTI_SOURCE_PIN1 #define SWITCH_INPUT_PIN EXTI_SOURCE_PIN9 #define INPUT_EXIT_1 EXTI_0 #define INPUT_EXIT_2 EXTI_1 #define SWITCH_EXTI EXTI_9 static void read_input_level(uint8_t channel); static void read_switch_level(); void sts_exti_init(void) { rcu_periph_clock_enable(RCU_GPIOA); rcu_periph_clock_enable(RCU_GPIOB); rcu_periph_clock_enable(RCU_CFGCMP); //rcu_periph_clock_enable(RCU_AF); gpio_mode_set(GPIOA,GPIO_MODE_INPUT,GPIO_PUPD_NONE,INPUT_PIN_1); gpio_mode_set(GPIOA,GPIO_MODE_INPUT,GPIO_PUPD_NONE,INPUT_PIN_2); gpio_mode_set(GPIOB,GPIO_MODE_INPUT,GPIO_PUPD_NONE,SWTICH_PIN); // nvic_irq_enable(EXTI0_1_IRQn,0); nvic_irq_enable(EXTI4_15_IRQn,0); // syscfg_exti_line_config(EXTI_SOURCE_GPIOA,EXIT_INPUT_PIN_1); // syscfg_exti_line_config(EXTI_SOURCE_GPIOA,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) { if(gpio_input_bit_get(GPIOA,INPUT_PIN_1)) { return 1; }else return 0; } uint8_t get_exti_in_2(void) { if(gpio_input_bit_get(GPIOA,INPUT_PIN_2)) { return 1; }else return 0; } 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) { if(gpio_input_bit_get(GPIOB,SWTICH_PIN)) { return 1; }else return 0; } static void read_switch_level() { sts_data_t * data = get_sts(); data->switch_status = get_exti_switch(); } void EXTI0_1_IRQHandler(void) { sts_data_t * data = get_sts(); if(RESET != exti_interrupt_flag_get(INPUT_EXIT_1)) { exti_interrupt_flag_clear(INPUT_EXIT_1); if(get_exti_in_1() == SET) //rising { 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); } }else //falling { data->m_data.input_status.input_status[INPUT_CHANNEL_1] = 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] = 0; if(data->m_data.input_status.input_status[INPUT_CHANNEL_1]) { data->choise_input(INPUT_CHANNEL_1); } }else //falling { data->m_data.input_status.input_status[INPUT_CHANNEL_2] = 1; } exti_interrupt_flag_clear(INPUT_EXIT_2); } } void EXTI4_15_IRQHandler(void) { sts_data_t * data = get_sts(); 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); } }