单通道轮询模式示例代码(ADC1, 通道0, PA0)
#include "stm32f4xx.h"void ADC1_Init(void) {// 1. 使能时钟RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);// 2. 配置GPIOGPIO_InitTypeDEF GPIO_InitStruct;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AN;// 模拟模式GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_Init(GPIOA, &GPIO_InitStruct);// 3. 配置ADC参数ADC_InitTypeDef ADC_InitStruct;ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b;// 12位分辨率ADC_InitStruct.ADC_ScanConvMode = DISABLE;// 单通道模式ADC_InitStruct.ADC_ContinuousConvMode = ENABLE;// 连续转换ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1; // 软件触发ADC_InitStruct.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;// 数据右对齐ADC_InitStruct.ADC_NbrOfConversion = 1;// 1个转换通道ADC_Init(ADC1, &ADC_InitStruct);// 4. 配置ADC通道ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_84Cycles); // PA0对应通道0// 5. 校准ADCADC_Cmd(ADC1, ENABLE);// 使能ADCADC_ResetCalibration(ADC1);// 复位校准while(ADC_GetResetCalibrationStatus(ADC1));// 等待复位完成ADC_StartCalibration(ADC1);// 开始校准while(ADC_GetCalibrationStatus(ADC1));// 等待校准完成// 6. 启动转换ADC_SoftwaRESTartConv(ADC1);// 软件触发转换}uint16_t Read_ADC(void) {while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); // 等待转换完成return ADC_GetConversionValue(ADC1);// 返回转换结果}int main(void) {ADC1_Init();while(1) {uint16_t adc_value = Read_ADC();// 使用adc_value(0~4095对应0~3.3V)// 添加延时或处理逻辑}}
多通道扫描模式(使用DMA)
关键修改点:
// 启用扫描模式和DMAADC_InitStruct.ADC_ScanConvMode = ENABLE;// 多通道扫描ADC_InitStruct.ADC_NbrOfConversion = 3;// 3个通道// 配置DMARCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);DMA_InitTypeDef DMA_InitStruct;DMA_InitStruct.DMA_Channel = DMA_Channel_0;DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;DMA_InitStruct.DMA_Memory0BaseAddr = (uint32_t)adc_buffer;DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralToMemory;DMA_InitStruct.DMA_BufferSize = 3;// 3个通道DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;DMA_InitStruct.DMA_Mode = DMA_Mode_Circular;// 循环模式DMA_InitStruct.DMA_Priority = DMA_Priority_High;DMA_Init(DMA2_Stream0, &DMA_InitStruct);DMA_Cmd(DMA2_Stream0, ENABLE);// 启用ADC的DMAADC_DMACmd(ADC1, ENABLE);
关键注意事项
常见问题解决
发表评论