在GD32F407中实现ADC连续采样完整示例代码(DMA方式)

[复制链接]
150|0
duo点 发表于 2025-10-27 16:53 | 显示全部楼层 |阅读模式
c
#include "gd32f4xx.h"
#include <stdio.h>

#define SAMPLE_COUNT 100
uint16_t adc_buffer[SAMPLE_COUNT];

void adc_dma_config(void) {
    // 1. 启用时钟
    rcu_periph_clock_enable(RCU_ADC0);
    rcu_periph_clock_enable(RCU_DMA0);
    rcu_periph_clock_enable(RCU_GPIOA); // 假设通道0在PA0

    // 2. 配置GPIO
    gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_0);

    // 3. 配置ADC
    adc_special_function_config(ADC0, ADC_SCAN_MODE, DISABLE);
    adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, ENABLE);
    adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);
    adc_channel_length_config(ADC0, 1);
    adc_regular_channel_config(ADC0, 0, ADC_CHANNEL_0, ADC_SAMPLETIME_55POINT5);

    // 4. 配置DMA
    dma_parameter_struct dma_init_struct;
    dma_deinit(DMA0, DMA_CH0);
    dma_init_struct.direction = DMA_PERIPHERAL_TO_MEMORY;
    dma_init_struct.memory_addr = (uint32_t)adc_buffer;
    dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
    dma_init_struct.memory_width = DMA_MEMORY_WIDTH_HALFWORD;
    dma_init_struct.number = SAMPLE_COUNT;
    dma_init_struct.periph_addr = (uint32_t)&ADC_RDATA(ADC0);
    dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
    dma_init_struct.periph_width = DMA_PERIPH_WIDTH_HALFWORD;
    dma_init_struct.priority = DMA_PRIORITY_HIGH;
    dma_init_struct.loop_mode = DMA_LOOP_ENABLE;
    dma_init(DMA0, DMA_CH0, &dma_init_struct);
    dma_channel_enable(DMA0, DMA_CH0);

    // 5. 关联ADC与DMA
    adc_dma_mode_enable(ADC0);

    // 6. 启用ADC并校准
    adc_enable(ADC0);
    adc_calibration_enable(ADC0);

    // 7. 启动转换
    adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);
}

int main(void) {
    adc_dma_config();
    while (1) {
        // 数据在adc_buffer中自动更新
        // 例如:处理adc_buffer[0]到adc_buffer[SAMPLE_COUNT-1]
    }
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

560

主题

2481

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部