初学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);
}
相关推荐
Wallace Zhang34 分钟前
STM32F103_Bootloader程序开发15 - 从Keil到vscode + EIDE + GCC的迁移实践
stm32·gcc·eide
RaLi和夕1 小时前
单片机学习笔记.C51存储器类型含义及用法
笔记·单片机·学习
ShiMetaPi1 小时前
操作【GM3568JHF】FPGA+ARM异构开发板 使用指南:蓝牙
arm开发·嵌入式硬件·fpga开发·rk3568
武文斌771 小时前
ARM工作模式、汇编学习
汇编·嵌入式硬件·学习·arm
月阳羊1 小时前
【硬件-笔试面试题-76】硬件/电子工程师,笔试面试题(知识点:H桥驱动电路的设计要点)
java·单片机·嵌入式硬件·面试·职场和发展
wdfk_prog3 小时前
Python脚本深度解析:实现基于YMODEM的单片机固件自动化升级
python·单片机·自动化
纳祥科技3 小时前
分享:一种为蓝牙、WIFI、U段音频发射设备提供ARC回传数字音频桥接功能的方案
网络·单片机·音视频
代码总长两年半5 小时前
STM32物联网项目---ESP8266微信小程序结合OneNET平台MQTT实现STM32单片机远程智能控制---代码篇(四)
stm32·单片机·物联网
咕咚.萌西6 小时前
RISC-V体系架构
嵌入式硬件·架构·risc-v
玉~你还好吗6 小时前
【嵌入式电机控制#进阶10】参数辨识(一):电阻辨识
单片机·嵌入式硬件