初学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);
}
相关推荐
wind_one121 分钟前
STM32[笔记]--1.前置准备
笔记·stm32·单片机
SY师弟2 小时前
台湾TEMI协会竞赛——0、竞赛介绍及开发板介绍
c语言·单片机·嵌入式硬件·嵌入式·台湾temi协会
电子工程师-C512 小时前
基于51单片机的红外防盗及万年历仿真
单片机·嵌入式硬件·51单片机
Camellia03112 小时前
嵌入式学习--江协stm32day5
stm32·嵌入式硬件·学习
keke102 小时前
PLC入门【1】PLC的简单介绍(教学软件:FX-TRN-BEG-C)
嵌入式硬件
keke103 小时前
PLC入门【2】PLC的接线
嵌入式硬件
江山如画,佳人北望7 小时前
stm32-c8t6实现语音识别(LD3320)
stm32·单片机·嵌入式硬件
baowxz7 小时前
航芯MCU使用IAR+Jlink调试
单片机·嵌入式硬件
wangxinwei20007 小时前
stm32_LAN8720驱动
stm32·单片机·嵌入式硬件
大叔带刺7 小时前
AUTOSAR实战教程--DoIP_01_配置项解释
单片机·嵌入式硬件