/*! \file gd32f303e_eval.c \brief firmware functions to manage leds, keys, COM ports */ /* Copyright (C) 2017 GigaDevice 2017-05-19, V1.0.0, demo for GD32F30x */ #include #include "gd32f303e_eval.h" /* private variables */ static uint32_t GPIO_PORT[LEDn] = {LED2_GPIO_PORT, LED3_GPIO_PORT, LED4_GPIO_PORT, LED5_GPIO_PORT}; static uint32_t GPIO_PIN[LEDn] = {LED2_PIN, LED3_PIN, LED4_PIN, LED5_PIN}; static rcu_periph_enum COM_CLK[COMn] = {EVAL_COM1_CLK, EVAL_COM2_CLK}; static uint32_t COM_TX_PIN[COMn] = {EVAL_COM1_TX_PIN, EVAL_COM2_TX_PIN}; static uint32_t COM_RX_PIN[COMn] = {EVAL_COM1_RX_PIN, EVAL_COM2_RX_PIN}; static uint32_t COM_GPIO_PORT[COMn] = {EVAL_COM1_GPIO_PORT, EVAL_COM2_GPIO_PORT}; static rcu_periph_enum COM_GPIO_CLK[COMn] = {EVAL_COM1_GPIO_CLK, EVAL_COM2_GPIO_CLK}; static rcu_periph_enum GPIO_CLK[LEDn] = {LED2_GPIO_CLK, LED3_GPIO_CLK, LED4_GPIO_CLK, LED5_GPIO_CLK}; static uint32_t KEY_PORT[KEYn] = {WAKEUP_KEY_GPIO_PORT, TAMPER_KEY_GPIO_PORT, USER_KEY1_GPIO_PORT, USER_KEY2_GPIO_PORT}; static uint32_t KEY_PIN[KEYn] = {WAKEUP_KEY_PIN, TAMPER_KEY_PIN,USER_KEY1_PIN,USER_KEY2_PIN}; static rcu_periph_enum KEY_CLK[KEYn] = {WAKEUP_KEY_GPIO_CLK, TAMPER_KEY_GPIO_CLK, USER_KEY1_GPIO_CLK, USER_KEY2_GPIO_CLK}; static exti_line_enum KEY_EXTI_LINE[KEYn] = {WAKEUP_KEY_EXTI_LINE, TAMPER_KEY_EXTI_LINE, USER_KEY1_EXTI_LINE, USER_KEY2_EXTI_LINE}; static uint8_t KEY_PORT_SOURCE[KEYn] = {WAKEUP_KEY_EXTI_PORT_SOURCE, TAMPER_KEY_EXTI_PORT_SOURCE, USER_KEY1_EXTI_PORT_SOURCE, USER_KEY2_EXTI_PORT_SOURCE}; static uint8_t KEY_PIN_SOURCE[KEYn] = {WAKEUP_KEY_EXTI_PIN_SOURCE, TAMPER_KEY_EXTI_PIN_SOURCE, USER_KEY1_EXTI_PIN_SOURCE, USER_KEY2_EXTI_PIN_SOURCE}; static uint8_t KEY_IRQn[KEYn] = {WAKEUP_KEY_EXTI_IRQn, TAMPER_KEY_EXTI_IRQn, USER_KEY1_EXTI_IRQn, USER_KEY2_EXTI_IRQn}; /*! \brief configure led GPIO \param[in] lednum: specify the led to be configured \arg LED2 \arg LED3 \arg LED4 \arg LED5 \param[out] none \retval none */ void gd_eval_led_init (led_typedef_enum lednum) { /* enable the led clock */ rcu_periph_clock_enable(GPIO_CLK[lednum]); /* configure led GPIO port */ gpio_init(GPIO_PORT[lednum], GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ,GPIO_PIN[lednum]); GPIO_BC(GPIO_PORT[lednum]) = GPIO_PIN[lednum]; } /*! \brief turn on selected led \param[in] lednum: specify the led to be turned on \arg LED2 \arg LED3 \arg LED4 \arg LED5 \param[out] none \retval none */ void gd_eval_led_on(led_typedef_enum lednum) { GPIO_BOP(GPIO_PORT[lednum]) = GPIO_PIN[lednum]; } /*! \brief turn off selected led \param[in] lednum: specify the led to be turned off \arg LED2 \arg LED3 \arg LED4 \arg LED5 \param[out] none \retval none */ void gd_eval_led_off(led_typedef_enum lednum) { GPIO_BC(GPIO_PORT[lednum]) = GPIO_PIN[lednum]; } /*! \brief toggle selected led \param[in] lednum: specify the led to be toggled \arg LED2 \arg LED3 \arg LED4 \arg LED5 \param[out] none \retval none */ void gd_eval_led_toggle(led_typedef_enum lednum) { gpio_bit_write(GPIO_PORT[lednum], GPIO_PIN[lednum], (bit_status)(1-gpio_input_bit_get(GPIO_PORT[lednum], GPIO_PIN[lednum]))); } /*! \brief configure key \param[in] key_num: specify the key to be configured \arg KEY_TAMPER: tamper key \arg KEY_WAKEUP: wakeup key \arg KEY_USER1: user key1 \arg KEY_USER2: user key2 \param[in] key_mode: specify button mode \arg KEY_MODE_GPIO: key will be used as simple IO \arg KEY_MODE_EXTI: key will be connected to EXTI line with interrupt \param[out] none \retval none */ void gd_eval_key_init(key_typedef_enum key_num, keymode_typedef_enum key_mode) { /* enable the key clock */ rcu_periph_clock_enable(KEY_CLK[key_num]); rcu_periph_clock_enable(RCU_AF); /* configure button pin as input */ gpio_init(KEY_PORT[key_num], GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, KEY_PIN[key_num]); if (key_mode == KEY_MODE_EXTI) { /* enable and set key EXTI interrupt to the lowest priority */ nvic_irq_enable(KEY_IRQn[key_num], 2U, 0U); /* connect key EXTI line to key GPIO pin */ gpio_exti_source_select(KEY_PORT_SOURCE[key_num], KEY_PIN_SOURCE[key_num]); /* configure key EXTI line */ exti_init(KEY_EXTI_LINE[key_num], EXTI_INTERRUPT, EXTI_TRIG_FALLING); exti_interrupt_flag_clear(KEY_EXTI_LINE[key_num]); } } /*! \brief return the selected key state \param[in] key: specify the key to be checked \arg KEY_TAMPER: tamper key \arg KEY_WAKEUP: wakeup key \arg KEY_USER1: user key \arg KEY_USER2: user key2 \param[out] none \retval the key's GPIO pin value */ uint8_t gd_eval_key_state_get(key_typedef_enum key) { return gpio_input_bit_get(KEY_PORT[key], KEY_PIN[key]); } /*! \brief configure COM port \param[in] com: COM on the board \arg EVAL_COM1: COM1 on the board \arg EVAL_COM2: COM2 on the board \param[out] none \retval none */ void gd_eval_com_init(uint32_t com) { uint32_t com_id = 0U; if(EVAL_COM1 == com){ com_id = 0U; }else if(EVAL_COM2 == com){ com_id = 1U; } /* enable GPIO clock */ rcu_periph_clock_enable(COM_GPIO_CLK[com_id]); /* enable USART clock */ rcu_periph_clock_enable(COM_CLK[com_id]); /* connect port to USARTx_Tx */ gpio_init(COM_GPIO_PORT[com_id], GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, COM_TX_PIN[com_id]); /* connect port to USARTx_Rx */ gpio_init(COM_GPIO_PORT[com_id], GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, COM_RX_PIN[com_id]); /* USART configure */ usart_deinit(com); usart_baudrate_set(com, 115200U); usart_receive_config(com, USART_RECEIVE_ENABLE); usart_transmit_config(com, USART_TRANSMIT_ENABLE); usart_enable(com); }