#include "gpio.h" /* all pins used as gpio(input/output/irq) must be defined here */ void gpio_init(void){ rcu_periph_clock_enable(RCU_GPIOA); rcu_periph_clock_enable(RCU_GPIOB); rcu_periph_clock_enable(RCU_GPIOC); rcu_periph_clock_enable(RCU_GPIOF); #if (CONFIG_BOARD_TYPE==SHARK_BOARD_SP700) //hall 2 detect gpio_mode_input(GPIOC, GPIO_PUPD_PULLUP, GPIO_PIN_13); //hall 1 detect gpio_mode_input(GPIOC, GPIO_PUPD_PULLUP, GPIO_PIN_15); //IR uart0 enable gpio_mode_output(GPIOC, GPIO_PUPD_NONE, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_14); //IR uart2 enable gpio_mode_output(GPIOF, GPIO_PUPD_NONE, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_0); //cs1180 power enable gpio_mode_output(GPIOB, GPIO_PUPD_NONE, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_12); //detect cs1180 ready gpio_mode_input(GPIOA, GPIO_PUPD_NONE, GPIO_PIN_0); //CS1180 cs gpio_mode_output(GPIOA, GPIO_PUPD_NONE, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9); cs1180_cs(1); #ifdef SHARK_BOARD_SP700_OLD_CS1180 //老的sp700+cs1180上,GPIOA8和GPIOB15连在一起,为了不影响B15 pin的spi 功能,A8pin需要设置为输入 gpio_mode_analog_input(GPIOA, GPIO_PIN_8); #endif #elif (CONFIG_BOARD_TYPE==SHARK_BOARD_SP600) //key gpio_mode_input(GPIOA, GPIO_PUPD_NONE, GPIO_PIN_0); //rs485 INT ,this can be used detect rs485 in/out, then open rs485 power, and then detect GPIOF0 gpio_mode_input(GPIOC, GPIO_PUPD_NONE, GPIO_PIN_13); //rs485 pwr enable gpio_mode_output(GPIOC, GPIO_PUPD_NONE, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_14); //rs485 in/out detect, only works when rs485 pwr on gpio_mode_input(GPIOF, GPIO_PUPD_NONE, GPIO_PIN_0); //cs1180 pwr enable gpio_mode_output(GPIOC, GPIO_PUPD_NONE, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_15); //detect cs1180 ready gpio_mode_input(GPIOB, GPIO_PUPD_NONE, GPIO_PIN_12); //CS1180 cs gpio_mode_output(GPIOA, GPIO_PUPD_NONE, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8); cs1180_cs(1); //LED 0,1,2 gpio_mode_output(GPIOA, GPIO_PUPD_NONE, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_2|GPIO_PIN_3); gpio_mode_output(GPIOF, GPIO_PUPD_NONE, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_6); //LED3,4 gpio_mode_output(GPIOA, GPIO_PUPD_NONE, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_10|GPIO_PIN_9); #endif //temp senser enable gpio_mode_output(GPIOF, GPIO_PUPD_NONE, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_1); //charger detect gpio_mode_input(GPIOB, GPIO_PUPD_NONE, GPIO_PIN_10); //aux power enable gpio_mode_output(GPIOB, GPIO_PUPD_NONE, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_2); //aux power lock detect gpio_mode_input(GPIOB, GPIO_PUPD_NONE, GPIO_PIN_11); //DC-DC power good indicat gpio_mode_input(GPIOF, GPIO_PUPD_NONE, GPIO_PIN_7); //ms5238 irq, This pin is a NMOS open drain output pin and output is “L” level if interrupted gpio_mode_input(GPIOA, GPIO_PUPD_NONE, GPIO_PIN_12); //ML5238 cs gpio_mode_output(GPIOA, GPIO_PUPD_NONE, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_15); } void enable_mcu_power(void){ //DC-DC enable rcu_periph_clock_enable(RCU_GPIOA); gpio_mode_output(GPIOA, GPIO_PUPD_NONE, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_11); gpio_bit_write(GPIOA,GPIO_PIN_11,SET); //DC-DC power good indicat rcu_periph_clock_enable(RCU_GPIOF); gpio_mode_input(GPIOF, GPIO_PUPD_NONE, GPIO_PIN_7); while(!IS_DCDC_POWER_GOOD()); } void enable_gpio_key_irq(int enable){ #if (CONFIG_BOARD_TYPE==SHARK_BOARD_SP600) if (enable){ nvic_irq_enable(EXTI0_1_IRQn, 4U, 0U); syscfg_exti_line_config(EXTI_SOURCE_GPIOA, EXTI_SOURCE_PIN0); exti_init(EXTI_0, EXTI_INTERRUPT, EXTI_TRIG_FALLING); exti_flag_clear(EXTI_0); }else { exti_interrupt_disable(EXTI_0); exti_flag_clear(EXTI_0); } #endif } static void enable_exti4_15_irq(int enable){ if (enable){ nvic_irq_enable(EXTI4_15_IRQn, 4U, 0U); }else { //many pins share the EXTI4_15_IRQn, do'nt stop it really //nvic_irq_disable(EXTI4_15_IRQn); } } void charger_detect_irq_enable(int enable){ if (enable){ syscfg_exti_line_config(EXTI_SOURCE_GPIOB, EXTI_SOURCE_PIN10); exti_init(EXTI_10, EXTI_INTERRUPT, EXTI_TRIG_FALLING); exti_flag_clear(EXTI_10); enable_exti4_15_irq(1); }else { enable_exti4_15_irq(0); exti_interrupt_disable(EXTI_10); exti_flag_clear(EXTI_10); } } void ml5238_irq_enable(int enable){ if (enable){ syscfg_exti_line_config(EXTI_SOURCE_GPIOA, EXTI_SOURCE_PIN12); exti_init(EXTI_12, EXTI_INTERRUPT, EXTI_TRIG_FALLING); exti_flag_clear(EXTI_12); enable_exti4_15_irq(1); }else { enable_exti4_15_irq(0); exti_interrupt_disable(EXTI_12); exti_flag_clear(EXTI_12); } } #if (CONFIG_BOARD_TYPE==SHARK_BOARD_SP700) void hall_1_detect_irq_enable(int enable){ if (enable){ syscfg_exti_line_config(EXTI_SOURCE_GPIOC, EXTI_SOURCE_PIN15); exti_flag_clear(EXTI_15); exti_init(EXTI_15, EXTI_INTERRUPT, EXTI_TRIG_FALLING); enable_exti4_15_irq(1); }else { enable_exti4_15_irq(0); exti_interrupt_disable(EXTI_15); exti_flag_clear(EXTI_15); } } #else void hall_1_detect_irq_enable(int enable){ } #endif void hall_2_detect_irq_enable(int enable){ if (enable){ syscfg_exti_line_config(EXTI_SOURCE_GPIOC, EXTI_SOURCE_PIN13); exti_flag_clear(EXTI_13); exti_init(EXTI_13, EXTI_INTERRUPT, EXTI_TRIG_FALLING); enable_exti4_15_irq(1); }else { enable_exti4_15_irq(0); exti_interrupt_disable(EXTI_13); exti_flag_clear(EXTI_13); } } void small_current_short_irq_enable(int enable){ if (enable){ syscfg_exti_line_config(EXTI_SOURCE_GPIOB, EXTI_SOURCE_PIN11); exti_flag_clear(EXTI_11); exti_init(EXTI_11, EXTI_INTERRUPT, EXTI_TRIG_FALLING); enable_exti4_15_irq(1); }else { enable_exti4_15_irq(0); exti_interrupt_disable(EXTI_11); exti_flag_clear(EXTI_11); } } void dcdc_pwr_detect_irq_enable(int enable){ if (enable){ syscfg_exti_line_config(EXTI_SOURCE_GPIOF, EXTI_SOURCE_PIN7); exti_init(EXTI_7, EXTI_INTERRUPT, EXTI_TRIG_BOTH); exti_flag_clear(EXTI_7); enable_exti4_15_irq(1); }else { enable_exti4_15_irq(0); exti_interrupt_disable(EXTI_7); exti_flag_clear(EXTI_7); } }