1. ADC连续采样的关键配置
(1) 启用ADC时钟
ADC模块挂载在APB2总线上,需先启用时钟:
c
rcu_periph_clock_enable(RCU_ADC0); // 启用ADC0时钟
(2) 配置ADC参数
分辨率:12位(默认)
扫描模式:单通道或多通道
连续转换模式:启用后ADC会自动重复采样
数据对齐:右对齐(默认)
采样时间:根据输入信号频率选择(如55.5个周期)
c
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); // 单通道长度为1
(3) 配置ADC通道
选择通道(如通道0,对应PA0)并设置采样时间:
c
adc_regular_channel_config(ADC0, 0, ADC_CHANNEL_0, ADC_SAMPLETIME_55POINT5); // 通道0,采样时间55.5周期
(4) 启用ADC并校准
c
adc_enable(ADC0); // 启用ADC
adc_calibration_enable(ADC0); // 校准ADC(减少误差)
(5) 启动ADC转换
c
adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL); // 软件触发启动
2. 使用DMA实现高效连续采样(推荐)
通过DMA将ADC数据自动传输至内存,避免CPU干预,适合高速采样。
(1) 启用DMA时钟
c
rcu_periph_clock_enable(RCU_DMA0); // 启用DMA0时钟
(2) 配置DMA通道
源地址:ADC数据寄存器(&ADC_RDATA(ADC0))
目标地址:用户定义的数组(如uint16_t adc_buffer[100])
传输模式:循环模式(自动回绕)
数据宽度:半字(16位,匹配ADC分辨率)
c
dma_parameter_struct dma_init_struct;
dma_deinit(DMA0, DMA_CH0); // 复位DMA通道0
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 = 100; // 传输数量
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); // 启用DMA通道
(3) 关联ADC与DMA
c
adc_dma_mode_enable(ADC0); // 启用ADC的DMA模式
(4) 启动ADC和DMA
c
adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL); // 启动ADC |
|