ADC_RegularChannelConfig()函数中Rank的定义

本文介绍了STM32中使用voidADC_RegularChannelConfig函数进行多通道ADC采集的方法。通过设置不同通道的Rank值可以实现指定顺序的数据采集,并利用DMA缓存将结果存储到对应的数组中,适用于音频等应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, u8 ADC_Channel, u8 Rank, u8 ADC_SampleTime)
该函数的参数ADC_Channel,Rank是代表什么?
这个在你多通道采集和DMA应用时会有很大的作用,比如你需要多通道采集,你设置每个通道的采集顺序其实就是用这个变量来做的,假设你定义channle1  的rank=1,channle2 的rank=2,那么对应你在DMA缓存空间的变量数组AdcDMA[0] 就i是channle1的转换结果,AdcDMA[1]就是通道2的转换结果。  按顺序采集我我做5个通道的, 但是乱序我还没有试过,你可以试试,STM的这个功能针对音频的采集很牛,你可以多做多通道对比滤波。
#define ADC1_DR_Address 0x4001244C uint16_t ADC_ConvertedValue[4]={0}; extern ADCSamp ADCSampPare; /***************************************/ //函数功能:ADC初始化 //输入参数:无 //返回值: 无 //备注: /***************************************/ void ADC_init(void) { ADC_InitType ADC_InitStructure; /* ADCCLK = PCLK2/6 */ RCC_ADCCLKConfig(RCC_APB2CLK_Div2); //ADC1配置 ADC_Reset(ADC1); ADC_StructInit(&ADC_InitStructure); ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC1工作在注入模式 ADC_InitStructure.ADC_ScanMode = ENABLE; //模数转换工作在扫描模式(多通道)还是单次(单通道)模式 ADC_InitStructure.ADC_ContinuousMode = DISABLE; //模数转换工作在扫描模式(多通道)还是单次(单通道)模式 ADC_InitStructure.ADC_ExternalTrig = ADC_ExternalTrig_TMR1_TRGO;//转换由软件启动 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据左对齐 ADC_InitStructure.ADC_NumOfChannel = 4; //规定了顺序进行规则转换的ADC通道的数目。这个数目的取值范围是1到16 ADC_Init(ADC1, &ADC_InitStructure); //IU/IV/IW/VSP/VBUS ////母线电压 //UVW //电位器 //电流 ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 1, ADC_SampleTime_1_5); ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 2, ADC_SampleTime_1_5); ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 3, ADC_SampleTime_1_5); ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 4, ADC_SampleTime_1_5); ADC_Ctrl(ADC1, ENABLE); //ADC1使能 ADC_DMACtrl(ADC1, ENABLE); ADC_RstCalibration(ADC1); //复位校准寄存器 while(ADC_GetResetCalibrationStatus(ADC1)); //等待校准寄存器复位完成 ADC_StartCalibration(ADC1); //ADC1开始校准 while(ADC_GetCalibrationStatus(ADC1)); //等待校准完成 ADC_SoftwareStartConvCtrl(ADC1, ENABLE); } void DMA_Configuration(void) { DMA_InitType DMA_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBPERIPH_DMA1, ENABLE); DMA_Reset(DMA1_Channel1); // DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_Address; DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->RDOR; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC_ConvertedValue; DMA_InitStructure.DMA_Direction = DMA_DIR_PERIPHERALSRC; DMA_InitStructure.DMA_BufferSize =4; DMA_InitStructure.DMA_PeripheralInc = DMA_PERIPHERALINC_DISABLE; DMA_InitStructure.DMA_MemoryInc = DMA_MEMORYINC_ENABLE; DMA_InitStructure.DMA_PeripheralDataWidth = DMA_PERIPHERALDATAWIDTH_HALFWORD; DMA_InitStructure.DMA_MemoryDataWidth = DMA_MEMORYDATAWIDTH_HALFWORD; //循环模式开启,Buffer写满后,自动回到初始地址开始传输 DMA_InitStructure.DMA_Mode = DMA_MODE_CIRCULAR; DMA_InitStructure.DMA_Priority = DMA_PRIORITY_HIGH; DMA_InitStructure.DMA_MTOM = DMA_MEMTOMEM_DISABLE; DMA_Init(DMA1_Channel1, &DMA_InitStructure); //配置完成后,启动DMA通道 DMA_ChannelEnable(DMA1_Channel1, ENABLE); DMA_INTConfig(DMA1_Channel1,DMA_INT_TC,ENABLE); }程序运行后ADC_ConvertedValue[0]是ADC_Channel_5的值;哪里有问题
最新发布
07-16
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值