#include "Exti.h" #include "gd32f30x_libopt.h" #include "main.h" #define INPUT_PIN_1 GPIO_PIN_0 #define INPUT_PIN_2 GPIO_PIN_1 #define SWTICH_PIN GPIO_PIN_5 #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_5 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_GPIOC); rcu_periph_clock_enable(RCU_AF); //rcu_periph_clock_enable(RCU_CFGCMP); //rcu_periph_clock_enable(RCU_AF); gpio_init(GPIOA,GPIO_MODE_IN_FLOATING,GPIO_OSPEED_50MHZ,INPUT_PIN_1 | INPUT_PIN_2); gpio_init(GPIOA,GPIO_MODE_IN_FLOATING,GPIO_OSPEED_50MHZ,INPUT_PIN_1 | INPUT_PIN_2); gpio_init(GPIOC,GPIO_MODE_IN_FLOATING,GPIO_OSPEED_50MHZ,SWTICH_PIN); nvic_irq_enable(EXTI0_IRQn,0,0); nvic_irq_enable(EXTI1_IRQn,0,0); nvic_irq_enable(EXTI5_9_IRQn,0,0); gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOA, GPIO_PIN_SOURCE_0); gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOA, GPIO_PIN_SOURCE_1); gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOC, GPIO_PIN_SOURCE_5); exti_init(INPUT_EXIT_1,EXTI_INTERRUPT,EXTI_TRIG_BOTH); exti_init(INPUT_EXIT_2,EXTI_INTERRUPT,EXTI_TRIG_BOTH); // 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 0; }else return 1; } uint8_t get_exti_in_2(void) { if(gpio_input_bit_get(GPIOA,INPUT_PIN_2)) { return 0; }else return 1; } 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(GPIOC,SWTICH_PIN)) { return 0; }else return 1; } static void read_switch_level() { sts_data_t * data = get_sts(); data->switch_status = get_exti_switch(); } void EXTI0_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() == RESET) //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; } } } void EXTI1_IRQHandler(void) { sts_data_t * data = get_sts(); if(RESET != exti_interrupt_flag_get(INPUT_EXIT_2)) { exti_interrupt_flag_clear(INPUT_EXIT_2); if(get_exti_in_2() == RESET) //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; } } } uint8_t value = 0; void EXTI5_9_IRQHandler(void) { sts_data_t * data = get_sts(); if(RESET != exti_interrupt_flag_get(SWITCH_EXTI)) { exti_interrupt_flag_clear(SWITCH_EXTI); value = get_exti_switch(); if(value == RESET) //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); } } } }