207 lines
6.9 KiB
C
207 lines
6.9 KiB
C
|
/*!
|
||
|
\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 <gd32f30x.h>
|
||
|
#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);
|
||
|
}
|