| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- #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])
- {
- data->choise_input(INPUT_CHANNEL_1);
- }
- }else //falling
- {
- if(data->m_data.input_status.input_status[INPUT_CHANNEL_2])
- {
- data->choise_input(INPUT_CHANNEL_2);
- }
- }
- exti_interrupt_flag_clear(SWITCH_EXTI);
- }
- }
|