我用单通道定时器触发+dma双缓冲
读到的数据与我定时器配置的采样率是一样的
但配置成多通道后触发时间与定时器无关采样值直接是全速采样了,无法等分时间差
我的ADC配置如下:
求大神指点- /*
- *********************************************************************************************************
- * 函 数 名: bsp_InitADC
- * 功能说明: 初始化ADC
- * 形 参: 无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- void bsp_InitADC(void)
- {
- GPIO_InitTypeDef GPIO_InitStruct;
- /* 配置ADC采样使用的引脚 */
- __HAL_RCC_GPIOA_CLK_ENABLE();
- GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_4
- |GPIO_PIN_6|GPIO_PIN_7;
- GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
- /* 配置ADC采样使用的时钟 */
- __HAL_RCC_DMA1_CLK_ENABLE();
- DmaHandle.Instance = DMA1_Stream1; /* 使用的DMA1 Stream1 */
- DmaHandle.Init.Request = DMA_REQUEST_ADC1; /* 请求类型采用DMA_REQUEST_ADC1 */
- DmaHandle.Init.Direction = DMA_PERIPH_TO_MEMORY; /* 传输方向是从外设到存储器 */
- DmaHandle.Init.PeriphInc = DMA_PINC_DISABLE; /* 外设地址自增禁止 */
- DmaHandle.Init.MemInc = DMA_MINC_ENABLE; /* 存储器地址自增使能 */
- DmaHandle.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; /* 外设数据传输位宽选择半字,即16bit */
- DmaHandle.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; /* 存储器数据传输位宽选择半字,即16bit */
- DmaHandle.Init.Mode = DMA_CIRCULAR; /* 循环模式 */
- DmaHandle.Init.Priority = DMA_PRIORITY_LOW; /* 优先级低 */
- DmaHandle.Init.FIFOMode = DMA_FIFOMODE_DISABLE; /* 禁止FIFO*/
- DmaHandle.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; /* 禁止FIFO此位不起作用,用于设置阀值 */
- DmaHandle.Init.MemBurst = DMA_MBURST_SINGLE; /* 禁止FIFO此位不起作用,用于存储器突发 */
- DmaHandle.Init.PeriphBurst = DMA_PBURST_SINGLE; /* 禁止FIFO此位不起作用,用于外设突发 */
-
- /* 初始化DMA */
- HAL_DMA_Init(&DmaHandle);
-
- /* 开启DMA1 Stream1的中断 */
- HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 2, 0);
- HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn);
-
- /* 关联ADC句柄和DMA句柄 */
- __HAL_LINKDMA(&AdcHandle, DMA_Handle, DmaHandle);
- /* 配置ADC */
- __HAL_RCC_ADC12_CLK_ENABLE();
- AdcHandle.Instance = ADC1;
-
- AdcHandle.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; /* 采用AHB同步时钟,4分频,即200MHz/4 = 50MHz */
- AdcHandle.Init.Resolution = ADC_RESOLUTION_16B; /* 16位分辨率 */
- AdcHandle.Init.ScanConvMode = ADC_SCAN_ENABLE; /* 使用扫描 */
- AdcHandle.Init.EOCSelection = ADC_EOC_SINGLE_CONV; /* EOC转换结束标志 */
- AdcHandle.Init.LowPowerAutoWait = DISABLE; /* 禁止低功耗自动延迟特性 */
- AdcHandle.Init.ContinuousConvMode = ENABLE; /* 禁止自动转换,采用的定时器触发转换 */
- AdcHandle.Init.NbrOfConversion = ADC_CH_NUM; /* 使用了8个转换通道 */
- AdcHandle.Init.DiscontinuousConvMode = DISABLE; /* 禁止不连续模式 */
- AdcHandle.Init.NbrOfDiscConversion = 1; /* 禁止不连续模式后,此参数忽略,此位是用来配置不连续子组中通道数 */
- AdcHandle.Init.ExternalTrigConv = ADC_EXTERNALTRIG_T1_CC1; /* 定时器1的CC1触发 */
- AdcHandle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING; /* 上升沿触发 */
- AdcHandle.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_CIRCULAR; /* DMA循环模式接收ADC转换的数据 */
- AdcHandle.Init.BoostMode = ENABLE; /* ADC时钟超过20MHz的话,使能boost */
- AdcHandle.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN; /* ADC转换溢出的话,覆盖ADC的数据寄存器 */
- AdcHandle.Init.OversamplingMode = DISABLE; /* 禁止过采样 */
- /* 初始化ADC */
- HAL_ADC_Init(&AdcHandle);
-
- HAL_Delay(1000);/* 等待电源稳定 */
-
- /* 校准ADC,采用偏移校准 */
- HAL_ADCEx_Calibration_Start(&AdcHandle, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED);
-
- /**ADC1 GPIO Configuration
- PA0 ------> ADC1_INP16
- PA1 ------> ADC1_INP17
- PA2 ------> ADC1_INP14
- PA4 ------> ADC1_INP18
- PA6 ------> ADC1_INP3
- PA7 ------> ADC1_INN3 (ADC1_INP7)
- */
- ADC_RegularChannelConfig(ADC_CHANNEL_16,ADC_REGULAR_RANK_1,ADC_SAMPLETIME_1CYCLE_5,ADC_SINGLE_ENDED);
- ADC_RegularChannelConfig(ADC_CHANNEL_17,ADC_REGULAR_RANK_2,ADC_SAMPLETIME_1CYCLE_5,ADC_SINGLE_ENDED);
- ADC_RegularChannelConfig(ADC_CHANNEL_14,ADC_REGULAR_RANK_3,ADC_SAMPLETIME_1CYCLE_5,ADC_SINGLE_ENDED);
- ADC_RegularChannelConfig(ADC_CHANNEL_18,ADC_REGULAR_RANK_4,ADC_SAMPLETIME_1CYCLE_5,ADC_SINGLE_ENDED);
- ADC_RegularChannelConfig(ADC_CHANNEL_7,ADC_REGULAR_RANK_5,ADC_SAMPLETIME_1CYCLE_5,ADC_SINGLE_ENDED);
- // ADC_RegularChannelConfig(ADC_CHANNEL_7,ADC_REGULAR_RANK_1,ADC_SAMPLETIME_1CYCLE_5,ADC_SINGLE_ENDED);
- /* 配置ADC的定时器触发 */
- TIM1_Config(50000);
-
- /* 启动ADC的DMA方式传输 */
- HAL_ADC_Start_DMA(&AdcHandle, (uint32_t *)ADCxValues, ADC_CONV_COUNT);
- }
- /*
- *********************************************************************************************************
- * 函 数 名: ADC_RegularChannelConfig
- * 功能说明: ADC通道配置
- * 形 参: ADC_Channel :通道号
- * ADC_Rank :通道序号
- * ADC_SampleTime:采样周期
- * ADC_SingleDiff:输入模式
- * 返 回 值: 无
- *********************************************************************************************************
- */
- static void ADC_RegularChannelConfig(uint32_t ADC_Channel, uint32_t ADC_Rank, uint8_t ADC_SampleTime, uint32_t ADC_SingleDiff)
- {
- ADC_ChannelConfTypeDef sConfig = { 0 };
- sConfig.Channel = ADC_Channel; /* 配置使用的ADC通道 */
- sConfig.Rank = ADC_Rank; /* 采样序列 */
- sConfig.SamplingTime = ADC_SampleTime; /* 采样周期 */
- sConfig.SingleDiff = ADC_SingleDiff; /* 单端输入 */
- sConfig.OffsetNumber = ADC_OFFSET_NONE; /* 无偏移 */
- sConfig.Offset = 0; /* 无偏移的情况下,此参数忽略 */
- sConfig.OffsetRightShift = DISABLE; /* 禁止右移 */
- sConfig.OffsetSignedSaturation = DISABLE; /* 禁止有符号饱和 */
- HAL_ADC_ConfigChannel(&AdcHandle, &sConfig);
- }
复制代码
|