GD32E507系列,6路ADC采样+DMA搬运,独立模式连续扫描

(1)main.c

#include "gd32e50x.h"
#include "stdio.h"
#include "bsp_adc.h"

int main(void)
{
	
	while(1)
	{
		adc_test();
        vTaskDelay(500);
	}
}


(2)bsp_adc.c,包含ADC配置和DMA的配置

uint16_t adc_date[6];
float  adc_value[6];

void adc_init(void)
{
    adc_rcu_config();
    adc_gpio_config();
    adc_dma_config();
    adc_config();
}

void adc_gpio_config(void)
{
	rcu_periph_clock_enable(RCU_GPIOA);
	rcu_periph_clock_enable(RCU_GPIOC);
	rcu_periph_clock_enable(RCU_AF);
	
    /* config the GPIO as analog mode */
    gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_MAX, GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4);
    gpio_init(GPIOC, GPIO_MODE_AIN, GPIO_OSPEED_MAX, GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3);
}

void adc_rcu_config(void)
{
    
    /* enable ADC clock */
    rcu_periph_clock_enable(RCU_ADC0);
    /* enable DMA0 clock */
    rcu_periph_clock_enable(RCU_DMA0);
}

void adc_dma_config(void)
{
    /* ADC_DMA_channel configuration */
    dma_parameter_struct dma_data_parameter;
    /* ADC DMA_channel configuration */
    dma_deinit(DMA0, DMA_CH0);

    /* initialize DMA single data mode */
    dma_data_parameter.periph_addr  = (uint32_t)(&ADC_RDATA(ADC0));
    dma_data_parameter.periph_inc   = DMA_PERIPH_INCREASE_DISABLE;
    dma_data_parameter.memory_addr  = (uint32_t)(&adc_date);
    dma_data_parameter.memory_inc   = DMA_MEMORY_INCREASE_ENABLE;
    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       = 6;
    dma_data_parameter.priority     = DMA_PRIORITY_HIGH;
    dma_init(DMA0, DMA_CH0, &dma_data_parameter);

    dma_circulation_enable(DMA0, DMA_CH0);
    /* enable DMA channel */
    dma_channel_enable(DMA0, DMA_CH0);
}

void adc_config(void)
{
	/* config ADC clock */
    rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV6);
    /* ADC mode config */
    adc_mode_config(ADC_MODE_FREE); 
    /* ADC continuous function enable */
    adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, ENABLE);         //
    /* ADC scan function enable */
    adc_special_function_config(ADC0, ADC_SCAN_MODE, ENABLE);               //
    /* ADC data alignment config */
    adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);

    /* ADC channel length config */
    adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 6);

    /* ADC regular channel config */ 
    adc_regular_channel_config(ADC0, 0, ADC_CHANNEL_11, ADC_SAMPLETIME_55POINT5);

    adc_regular_channel_config(ADC0, 1, ADC_CHANNEL_12, ADC_SAMPLETIME_55POINT5);

    adc_regular_channel_config(ADC0, 2, ADC_CHANNEL_13, ADC_SAMPLETIME_55POINT5);

    adc_regular_channel_config(ADC0, 3, ADC_CHANNEL_2, ADC_SAMPLETIME_55POINT5);

    adc_regular_channel_config(ADC0, 4, ADC_CHANNEL_3, ADC_SAMPLETIME_55POINT5);
	
    adc_regular_channel_config(ADC0, 5, ADC_CHANNEL_4, ADC_SAMPLETIME_55POINT5);
	
    /* ADC trigger config */
    adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, ADC0_1_2_EXTTRIG_REGULAR_NONE);
    adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE);

    /* ADC DMA function enable */
    adc_dma_mode_enable(ADC0);
    /* enable ADC interface */
    adc_enable(ADC0);
	
	vTaskDelay(2);
//	delay_1ms(2);
	
    /* ADC calibration and reset calibration */
    adc_calibration_enable(ADC0);
    
    /* ADC software trigger enable */
    adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);
}

void adc_test(void)
{
	
	adc_value[0] = (float)adc_date[0]*3.29/4096;
	adc_value[1] = (float)adc_date[1]*3.29/4096;
	adc_value[2] = (float)adc_date[2]*3.29/4096;
	adc_value[3] = (float)adc_date[3]*3.29/4096;
	adc_value[4] = (float)adc_date[4]*3.29/4096;
	adc_value[5] = (float)adc_date[5]*3.29/4096;

    printf("ADC1 regular channel f= %f \r\n", adc_value[0]);
    printf("ADC2 regular channel f= %f \r\n", adc_value[1]);
    printf("ADC3 regular channel f= %f \r\n", adc_value[2]);
    printf("ADC4 regular channel f= %f \r\n", adc_value[3]);
    printf("ADC5 regular channel f= %f \r\n", adc_value[4]);
	printf("ADC5 regular channel f= %f \r\n", adc_value[5]);
	
	
}

(2)bsp_adc.h


#ifndef __BSP_ADC_H_
#define __BSP_ADC_H_

#include "bsp.h"



void adc_init(void);
void adc_rcu_config(void);
void adc_gpio_config(void);
void adc_dma_config(void);
void adc_config(void);
void adc_test(void);


#endif

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值