初学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);
}
相关推荐
楼台的春风6 小时前
【MCU驱动开发概述】
c语言·驱动开发·单片机·嵌入式硬件·mcu·自动驾驶·嵌入式
Moonnnn.6 小时前
51单片机学习——动态数码管显示
笔记·嵌入式硬件·学习·51单片机
LS_learner7 小时前
小智机器人CMakeLists编译文件解析
嵌入式硬件·机器人
小鸡岛保安8 小时前
学习笔记-8MQTT-韦东山
stm32·物联网
暗碳8 小时前
stm32 74hc238流水灯
stm32·单片机·嵌入式硬件
1101 11018 小时前
STM32-温湿度上传OneNET项目
stm32·单片机·嵌入式硬件
余衫马9 小时前
ESP32-S3 实战指南:BOOT-KEY 按键驱动开发全解析
驱动开发·单片机·嵌入式硬件
文军的烹饪实验室12 小时前
处理器架构、单片机、芯片、光刻机之间的关系
单片机·嵌入式硬件·架构
Leiditech__13 小时前
人工智能时代电子机器人静电问题及电路设计防范措施
人工智能·嵌入式硬件·机器人·硬件工程
jmlinux13 小时前
STM32 HAL库USART串口DMA IDLE中断编程:避坑指南
stm32·单片机·嵌入式硬件