/*! \file main.c \brief ADC regular channel with DMA */ /* Copyright (C) 2017 GigaDevice 2017-06-06, V1.0.0, firmware for GD32F3x0 */ #include "gd32f3x0.h" #include "systick.h" #include #include "main.h" #include "gd32f3x0_eval.h" #define BOARD_ADC_CHANNEL ADC_CHANNEL_11 #define ADC_GPIO_PORT GPIOC #define ADC_GPIO_PIN GPIO_PIN_1 uint16_t adc_value; void rcu_config(void); void gpio_config(void); void dma_config(void); void adc_config(void); /*! \brief main function \param[in] none \param[out] none \retval none */ int main(void) { /* system clocks configuration */ rcu_config(); /* systick configuration */ systick_config(); /* GPIO configuration */ gpio_config(); /* DMA configuration */ dma_config(); /* ADC configuration */ adc_config(); while(1){ } } /*! \brief configure the different system clocks \param[in] none \param[out] none \retval none */ void rcu_config(void) { /* enable GPIOC clock */ rcu_periph_clock_enable(RCU_GPIOC); /* enable ADC clock */ rcu_periph_clock_enable(RCU_ADC); /* enable DMA clock */ rcu_periph_clock_enable(RCU_DMA); /* config ADC clock */ rcu_adc_clock_config(RCU_ADCCK_APB2_DIV6); } /*! \brief configure the GPIO peripheral \param[in] none \param[out] none \retval none */ void gpio_config(void) { /* config the GPIO as analog mode */ gpio_mode_set(ADC_GPIO_PORT, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, ADC_GPIO_PIN); } /*! \brief configure the DMA peripheral \param[in] none \param[out] none \retval none */ void dma_config(void) { /* ADC_DMA_channel configuration */ dma_parameter_struct dma_data_parameter; /* ADC DMA_channel configuration */ dma_deinit(DMA_CH0); /* initialize DMA single data mode */ dma_data_parameter.periph_addr = (uint32_t)(&ADC_RDATA); dma_data_parameter.periph_inc = DMA_PERIPH_INCREASE_DISABLE; dma_data_parameter.memory_addr = (uint32_t)(&adc_value); dma_data_parameter.memory_inc = DMA_MEMORY_INCREASE_DISABLE; dma_data_parameter.periph_width = DMA_PERIPHERAL_WIDTH_16BIT; dma_data_parameter.memory_width = DMA_MEMORY_WIDTH_16BIT; dma_data_parameter.direction = DMA_PERIPHERAL_TO_MEMORY; dma_data_parameter.number = 1; dma_data_parameter.priority = DMA_PRIORITY_HIGH; dma_init(DMA_CH0, dma_data_parameter); dma_circulation_enable(DMA_CH0); /* enable DMA channel */ dma_channel_enable(DMA_CH0); } /*! \brief configure the ADC peripheral \param[in] none \param[out] none \retval none */ void adc_config(void) { /* ADC contineous function enable */ adc_special_function_config(ADC_CONTINUOUS_MODE, ENABLE); /* ADC trigger config */ adc_external_trigger_source_config(ADC_REGULAR_CHANNEL, ADC_EXTTRIG_REGULAR_NONE); /* ADC data alignment config */ adc_data_alignment_config(ADC_DATAALIGN_RIGHT); /* ADC channel length config */ adc_channel_length_config(ADC_REGULAR_CHANNEL, 1); /* ADC regular channel config */ adc_regular_channel_config(0, BOARD_ADC_CHANNEL, ADC_SAMPLETIME_55POINT5); adc_external_trigger_config(ADC_REGULAR_CHANNEL, ENABLE); /* enable ADC interface */ adc_enable(); delay_1ms(1); /* ADC calibration and reset calibration */ adc_calibration_enable(); /* ADC DMA function enable */ adc_dma_mode_enable(); /* ADC software trigger enable */ adc_software_trigger_enable(ADC_REGULAR_CHANNEL); }