关于GD32F425的ADC&DMA初始化

 以下函数为初始化函数

uint16_t ADCValue1[2];

void adc_dma_init(void) {
	dma_single_data_parameter_struct dma_init_struct;
    rcu_periph_clock_enable(RCU_DMA1);

    // 复位DMA通道0
    dma_deinit(DMA1, DMA_CH0);

    // 配置DMA参数
    dma_init_struct.direction = DMA_PERIPH_TO_MEMORY;  // DMA传输方向:从外设到内存
    dma_init_struct.memory0_addr = (uint32_t)&ADCValue1;  // 存储ADC数据的内存地址
    dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;  // 每次传输后内存地址增加
    dma_init_struct.number = 1;  // 要传输的数据项数目
    dma_init_struct.periph_addr = (uint32_t)&ADC_RDATA(ADC0);  // 外设数据寄存器地址(ADC数据)
    dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;  // 禁止外设地址增加
    dma_init_struct.periph_memory_width = DMA_PERIPH_WIDTH_16BIT;  // 数据宽度:16位
    dma_init_struct.priority = DMA_PRIORITY_HIGH;  // DMA通道优先级

    // 初始化DMA通道0
    dma_single_data_mode_init(DMA1, DMA_CH0, &dma_init_struct);

    // 启用DMA循环模式
    dma_circulation_enable(DMA1, DMA_CH0);

    // 选择DMA外设0用于DMA通道0
    dma_channel_subperipheral_select(DMA1, DMA_CH0, DMA_SUBPERI0);

    // 启用DMA通道0
    dma_channel_enable(DMA1, DMA_CH0);
}

void adc_config(void) {
    // 复位ADC
    adc_deinit();
    //配置引脚为模拟浮空输入模式
	gpio_mode_set(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_6);
    // 启用ADC0时钟
    rcu_periph_clock_enable(RCU_ADC0);

    // 配置ADC时钟:ADCCLK = HCLK / 4
    adc_clock_config(ADC_ADCCK_PCLK2_DIV4);

    // 配置ADC同步模式为独立
    adc_sync_mode_config(ADC_SYNC_MODE_INDEPENDENT);

    // 启用ADC连续扫描模式
    adc_special_function_config(ADC0, ADC_SCAN_MODE, ENABLE);

    // 启用ADC连续模式
    adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, ENABLE);

    // 配置ADC分辨率:12位
    adc_resolution_config(ADC0, ADC_RESOLUTION_12B);

    // 配置ADC数据对齐方式:右对齐
    adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);
    // 配置ADC常规通道长度
    adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 1);
    // 配置ADC通道
    adc_regular_channel_config(ADC0, 0, ADC_CHANNEL_6, ADC_SAMPLETIME_15);

    // 禁止ADC外部触发
    adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, EXTERNAL_TRIGGER_DISABLE);

    // 启用ADC DMA模式
    adc_dma_mode_enable(ADC0);

    // 在最后一个转换后启用ADC DMA请求
    adc_dma_request_after_last_enable(ADC0);
    // 清除DMA通道0标志位
    dma_flag_clear(DMA1, DMA_CH0, DMA_FLAG_FTF);
    // 启用ADC0
    adc_enable(ADC0);

    // 开始ADC转换
    adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);

//    dma_interrupt_disable(DMA1,DMA_CH0,DMA_CHXCTL_FTFIE);
}

//此配置预计将在2us采集完一次数据
void adc_and_dma_init(void)
{
	// 初始化ADC和DMA
	    adc_dma_init();
	    adc_config();
//	    nvic_irq_enable(DMA1_Channel0_IRQn,3,3);
}

初始化完成之后就可以直接读取数据不需要等待了

printf("ADC:%d\r\n",ADCValue1[0]);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值