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]
}
} |
|