10----GD32E103RBT6----ADC测试代码[测试不通过]

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();
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值