以下函数为初始化函数
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]);