bsp_adc.h
#ifndef __BSP_RCU_H
#define __BSP_RCU_H
#include "gd32e10x.h"
//内部调速电位器
#define ADCx_1_INT_SV_GPIO_CLK RCU_GPIOA
#define ADCx_1_INT_SV_PORT GPIOA
#define ADCx_1_INT_SV_PIN GPIO_PIN_0
#define ADCx_1_INT_SV_CLK RCU_ADC0
#define ADCx_1_INT_SV ADC0
#define ADCx_1_INT_SV_CHANNEL ADC_CHANNEL_0
//DMA
#define ADCx_1_DMA DMA0
#define ADCx_1_DMA_CHANNEL DMA_CH0
#define ADCx_1_DMA_CLOCK RCU_DMA0
#define ADCx_1_RDATA_ADDRESS (uint32_t)(&ADC_RDATA(ADC0))
void ADCx_1_INT_SV_GPIO_Config(void);
void ADCx_1_INT_SV_Config(void);
void DMA_Config(void);
#endif
bsp_adc.C
#include "bsp_adc.h"
extern uint32_t ADC_ConvertedValue;
void ADCx_1_INT_SV_GPIO_Config(void)
{
rcu_periph_clock_enable(ADCx_1_INT_SV_GPIO_CLK);
gpio_init(ADCx_1_INT_SV_PORT, GPIO_MODE_AIN, GPIO_OSPEED_MAX, ADCx_1_INT_SV_PIN);
}
/*!
\brief ADC0工作参数配置
\param[in] none
\param[out] none
\retval none
*/
void ADCx_1_INT_SV_Config(void)
{
rcu_periph_clock_enable(ADCx_1_INT_SV_CLK);
// 所有ADC运行于独立模式
adc_mode_config(ADC_MODE_FREE);
// 禁止扫描模式
adc_special_function_config(ADCx_1_INT_SV,ADC_SCAN_MODE,DISABLE);
// 连续转换模式
adc_special_function_config(ADCx_1_INT_SV,ADC_CONTINUOUS_MODE ,ENABLE);
// 禁止外部触发,使用软件触发
adc_external_trigger_source_config(ADCx_1_INT_SV, ADC_REGULAR_CHANNEL, ADC0_1_EXTTRIG_REGULAR_NONE);
// LSB对齐
adc_data_alignment_config(ADCx_1_INT_SV,ADC_DATAALIGN_RIGHT);
// 设置通道长度为1
adc_channel_length_config(ADCx_1_INT_SV,ADC_REGULAR_CHANNEL,1);
// 配置ADC时钟为APB2时钟的12分频,也就是1MHz
rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV12);
// 配置 ADC 通道转换顺序和采样时间
adc_regular_channel_config(ADCx_1_INT_SV,0,ADCx_1_INT_SV_CHANNEL,ADC_SAMPLETIME_55POINT5 );
// 配置ADC的分辨率为12位
adc_resolution_config(ADCx_1_INT_SV,ADC_RESOLUTION_12B);
//使能ADC
adc_enable(ADCx_1_INT_SV);
// 完成ADC 的校准
adc_calibration_enable(ADCx_1_INT_SV);
// 软件触发转换
adc_software_trigger_enable(ADCx_1_INT_SV,ADC_REGULAR_CHANNEL);
/* ADC DMA function enable */
adc_dma_mode_enable(ADCx_1_INT_SV);
}
/*!
\brief DMA0工作参数配置
\param[in] none
\param[out] none
\retval none
*/
void DMA_Config(void)
{
dma_parameter_struct dma_data_parameter;
/* enable DMA0 clock */
rcu_periph_clock_enable(ADCx_1_DMA_CLOCK);
/* ADC DMA_channe0 configuration */
dma_deinit(ADCx_1_DMA, ADCx_1_DMA_CHANNEL);
/* initialize DMA data mode */
dma_data_parameter.periph_addr = ADCx_1_RDATA_ADDRESS;
dma_data_parameter.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
dma_data_parameter.memory_addr = (uint32_t)(&ADC_ConvertedValue);
dma_data_parameter.memory_inc = DMA_MEMORY_INCREASE_DISABLE;
dma_data_parameter.periph_width = DMA_PERIPHERAL_WIDTH_32BIT;
dma_data_parameter.memory_width = DMA_MEMORY_WIDTH_32BIT;
dma_data_parameter.direction = DMA_PERIPHERAL_TO_MEMORY;
dma_data_parameter.number = 1;
dma_data_parameter.priority = DMA_PRIORITY_HIGH;
dma_init(ADCx_1_DMA, ADCx_1_DMA_CHANNEL, &dma_data_parameter);
dma_circulation_enable(DMA0, ADCx_1_DMA_CHANNEL);
/* enable DMA channel */
dma_channel_enable(ADCx_1_DMA, ADCx_1_DMA_CHANNEL);
}
main.c
/*测试发现ADC转换值在通道输入电压为0时不为0,这是GD32E103RBT6的BUG*/
void test_adc(void)
{
ADCx_1_INT_SV_GPIO_Config();
DMA_Config();
ADCx_1_INT_SV_Config();
}