初学stm32 --- ADC多通道采集

与单通道采集,主要区别就是设置转换通道个数、开启扫描模式、每个ADC通道和相应的GPIO都要进行配置

cpp 复制代码
void adc_dma_init(uint32_t DstAddress)
{
    ADC_ChannelConfTypeDef adc_channel_config_struct;
    
    dma_for_adc_init();
    
    g_adc_handle_struct.Instance = ADC1;                        /*是指ADC模块基地址为ADC1*/
    g_adc_handle_struct.Init.DataAlign = ADC_DATAALIGN_RIGHT;   /*选择数据右对齐*/
    g_adc_handle_struct.Init.ScanConvMode = ADC_SCAN_ENABLE;            /*开启扫描模式*/
    g_adc_handle_struct.Init.ContinuousConvMode = ENABLE;      /*开启连续模式*/
    g_adc_handle_struct.Init.NbrOfConversion = 6;               /*设置转换通道的数目为1*/
    g_adc_handle_struct.Init.DiscontinuousConvMode = DISABLE;   /*不开启间断模式*/
    g_adc_handle_struct.Init.NbrOfDiscConversion = 0;           /*配置间断模式的规则通道数目为0*/       
    g_adc_handle_struct.Init.ExternalTrigConv = ADC_SOFTWARE_START; /*选择软件触发转换*/

    HAL_ADC_Init(&g_adc_handle_struct);                     /*初始化ADC*/
    
    HAL_ADCEx_Calibration_Start(&g_adc_handle_struct);      /*校准ADC*/
    
    adc_channel_config_struct.Channel = ADC_CHANNEL_0;              /*设置ADC通道为通道0*/
    adc_channel_config_struct.Rank = ADC_REGULAR_RANK_1;            /*设置为第一个转换顺序*/
    adc_channel_config_struct.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;    /*设置采样周期为239.5个ADC时钟周期*/
    HAL_ADC_ConfigChannel(&g_adc_handle_struct,&adc_channel_config_struct); /*配置ADC通道*/
    
    adc_channel_config_struct.Channel = ADC_CHANNEL_1;              /*设置ADC通道为通道1*/
    adc_channel_config_struct.Rank = ADC_REGULAR_RANK_2;            /*设置为第二个转换顺序*/
    adc_channel_config_struct.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;    /*设置采样周期为239.5个ADC时钟周期*/
    HAL_ADC_ConfigChannel(&g_adc_handle_struct,&adc_channel_config_struct); /*配置ADC通道*/
    
    adc_channel_config_struct.Channel = ADC_CHANNEL_2;              /*设置ADC通道为通道2*/
    adc_channel_config_struct.Rank = ADC_REGULAR_RANK_3;            /*设置为第三个转换顺序*/
    adc_channel_config_struct.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;    /*设置采样周期为239.5个ADC时钟周期*/
    HAL_ADC_ConfigChannel(&g_adc_handle_struct,&adc_channel_config_struct); /*配置ADC通道*/
    
    adc_channel_config_struct.Channel = ADC_CHANNEL_3;              /*设置ADC通道为通道3*/
    adc_channel_config_struct.Rank = ADC_REGULAR_RANK_4;            /*设置为第四个转换顺序*/
    adc_channel_config_struct.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;    /*设置采样周期为239.5个ADC时钟周期*/
    HAL_ADC_ConfigChannel(&g_adc_handle_struct,&adc_channel_config_struct); /*配置ADC通道*/
    
    adc_channel_config_struct.Channel = ADC_CHANNEL_4;              /*设置ADC通道为通道4*/
    adc_channel_config_struct.Rank = ADC_REGULAR_RANK_5;            /*设置为第五个转换顺序*/
    adc_channel_config_struct.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;    /*设置采样周期为239.5个ADC时钟周期*/
    HAL_ADC_ConfigChannel(&g_adc_handle_struct,&adc_channel_config_struct); /*配置ADC通道*/
    
    adc_channel_config_struct.Channel = ADC_CHANNEL_5;              /*设置ADC通道为通道5*/
    adc_channel_config_struct.Rank = ADC_REGULAR_RANK_6;            /*设置为第六个转换顺序*/
    adc_channel_config_struct.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;    /*设置采样周期为239.5个ADC时钟周期*/
    HAL_ADC_ConfigChannel(&g_adc_handle_struct,&adc_channel_config_struct); /*配置ADC通道*/
    

    HAL_NVIC_SetPriority(DMA1_Channel1_IRQn,2,2);
    HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
    
    HAL_DMA_Start_IT(&g_dma_handle_for_adc_struct,(uint32_t)&ADC1->DR,DstAddress,0);
    HAL_ADC_Start_DMA(&g_adc_handle_struct,&DstAddress,0);
}
相关推荐
shimly12345637 分钟前
(done) 嵌入式硬件电路图 (5) 重要的元器件特性之二极管三极管
嵌入式硬件
Zw-awa2 小时前
嵌入式OLED表驱动菜单:用一张表、一个栈和一个窗口重写表驱动菜单
stm32
minglie13 小时前
esp32c3+atshell测试ov7670
单片机·嵌入式硬件
橘为己有4413 小时前
51单片机:流水灯
单片机·51单片机
蜀黍@猿3 小时前
ARM 汇编入门(十):标量浮点与 VFP 指令全解析
汇编·arm开发·stm32·mcu
不脱发的程序猿3 小时前
STM32和VS1053制作电子琴
stm32·单片机·嵌入式硬件·midi·vs1053
Zwawa17 小时前
C语言函数指针与宏实战:从回调、表驱动菜单到X-Macro,讲透嵌入式代码解耦
c语言·单片机·嵌入式
shimly12345618 小时前
(done) 嵌入式硬件电路图 (2) 熟悉常用元器件
嵌入式硬件
Zw-awa21 小时前
C语言函数指针与宏实战:从回调、表驱动菜单到X-Macro,讲透嵌入式代码解耦
stm32
安妮细水长流1 天前
ad7124
c语言·单片机