你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32H7A3RGT6 ADC 8位采样速度只能达到3.5MSPS达不到数据手册上的7MSPS ?

[复制链接]
onlap 提问时间:2026-1-3 11:44 / 未解决
STM32H7A3RGT6 ADC 8位采样速度大约只有3.5MSPS达不到数据手册上的7MSPS

通过运算放大器输入180Hz正弦波测试频率 用TIM5捕获波形上升沿触发TIM6工作,
每次DMA结束后,停止采样 通过320*240显示屏显示波形,每100个数据取一个点显示,根据显示波形的数量,推算出采样频率,
达到3.5MHz采样率时大约显示1.2个周期的波形(3 500 000/100/180=194点/周期波形)
调整TIM6的ARR值
当TIM6的触发频率最开始为280 000 000/1/300=0.93Mhz  最开始提高触发频率,采样率会随触发频率上升
当TIM6的触发频率调整到280 000 000/1/150=1.86Mhz  ADC1+ADC2的合计每秒的采样数大约为3.5MHz
再继续升高触发频率 采样数不会继续上升
如果设置为同步采样模式 TIM6触发频率可以设置到280 000 000/1/80=3.5Mhz  每个ADC(ADC1和ADC2)的采样数大约为3.5MHz
再继续升高触发频率 采样数不会继续上升
一个ADC1采用自动连续模式采样最高采样数也是大约为3.5MHz
达不到数据手册中描述的7MHz

双ADC同步采样模式,每秒的采样数大约为3.5MHz
采用双ADC交替采样,ADC1+ADC2每秒的采样数大约为3.5MHz,也无法将采样频率提高1倍

以上测试没有考虑数据的精度,只测试采样率
以上不知是哪里设置有问题,采样数无法达到7MHz

以下为程序代码 不知道哪里出问题 请大家指点 谢谢

static void ADC_TRIG_TIM6_Init(unsigned short Prescaler,unsigned short ARR)
{

/* USER CODE BEGIN TIM6_Init 0 */

/* USER CODE END TIM6_Init 0 */

LL_TIM_InitTypeDef TIM_InitStruct = {0};//配置定时器计时参数

/* Peripheral clock enable */
LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_TIM6);//开启TIM6的时钟

//        LL_TIM_DisableCounter(TIM6);
LL_TIM_DeInit(TIM6);

/* TIM6 interrupt Init */
//  NVIC_SetPriority(TIM6_DAC_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),0, 0));
//  NVIC_EnableIRQ(TIM6_DAC_IRQn);

/* USER CODE BEGIN TIM6_Init 1 */

/* USER CODE END TIM6_Init 1 */
LL_TIM_SetClockSource(TIM6, LL_TIM_CLOCKSOURCE_INTERNAL);//使用内部时钟
TIM_InitStruct.Prescaler =Prescaler-1;//预分频数值
TIM_InitStruct.CounterMode = LL_TIM_COUNTERMODE_UP;//向上计数模式
TIM_InitStruct.Autoreload = ARR-1;//自动重装载值
TIM_InitStruct.ClockDivision = LL_TIM_CLOCKDIVISION_DIV1;//外部时钟滤波器分频值(内部时钟模式不起作用)
TIM_InitStruct.RepetitionCounter = 0;//重复寄存器,此参数不起作用,(TIM1使用此参数)
LL_TIM_Init(TIM6, &TIM_InitStruct);
LL_TIM_EnableARRPreload(TIM6);

LL_TIM_SetTriggerOutput(TIM6, LL_TIM_TRGO_UPDATE);
LL_TIM_DisableMasterSlaveMode(TIM6);
/* USER CODE BEGIN TIM6_Init 2 */

//                LL_TIM_DisableCounter(TIM6);
LL_TIM_EnableCounter(TIM6);//打开TIM6

}

void DUAL_REG_INTERL_TIM6_ADC12_8B_Init(unsigned short Prescaler,unsigned short ARR,unsigned int *buff_Addr0, unsigned short

trans_Num)//PC4 双通道倍速采样
{
uint32_t wait_loop_index;
LL_GPIO_InitTypeDef LL_GPIO_Struct={0};
LL_ADC_InitTypeDef ADC_InitStruct = {0};
LL_ADC_REG_InitTypeDef ADC_REG_InitStruct = {0};
LL_ADC_CommonInitTypeDef ADC_CommonInitStruct = {0};
LL_DMA_InitTypeDef LL_DMA_Struct={0};
/* 使能相应时钟 */
LL_AHB4_GRP1_EnableClock(LL_AHB4_GRP1_PERIPH_GPIOB);
LL_AHB4_GRP1_EnableClock(LL_AHB4_GRP1_PERIPH_GPIOC);
LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_ADC12);
//        __HAL_RCC_ADC_CONFIG(RCC_ADCCLKSOURCE_CLKP);        /* 选择ADC的时钟源为per_ck->HSI=64M */
LL_RCC_SetADCClockSource(LL_RCC_ADC_CLKSOURCE_PLL2P);
//        LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_DMA1);
/* 配置ADC2采样通道 */
/**ADC2 GPIO Configuration
PC4   ------> ADC2_INP4
*/
LL_GPIO_Struct.Pin=LL_GPIO_PIN_4;
LL_GPIO_Struct.Mode=LL_GPIO_MODE_ANALOG;
LL_GPIO_Struct.Pull=LL_GPIO_PULL_NO;
LL_GPIO_Init(GPIOC, &LL_GPIO_Struct);

/* 配置ADC1采样通道 */
  /**ADC1 GPIO Configuration
PB1   ------> ADC1_INP5
*/

LL_GPIO_Struct.Pin=LL_GPIO_PIN_1;
LL_GPIO_Struct.Mode=LL_GPIO_MODE_ANALOG;
LL_GPIO_Struct.Pull=LL_GPIO_PULL_NO;
LL_GPIO_Init(GPIOB, &LL_GPIO_Struct);       
/* USE_ADC_WORK_MODE */

/* DMA controller clock enable */
LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_DMA1);
//  DMA1_Stream0->CR&=~(1<<0); //关闭DMA传输
LL_DMA_DisableStream(DMA1, LL_DMA_STREAM_0);
LL_DMA_DeInit(DMA1, LL_DMA_STREAM_0);
while ( LL_DMA_IsEnabledStream(DMA1, LL_DMA_STREAM_0) != DISABLE){}//等待DMA可配置
// while(DMA1_Stream0->CR&0x01);//等待DMA可配置

/* DMA配置 */
LL_DMA_Struct.PeriphRequest=LL_DMAMUX1_REQ_ADC1;//通道选择
LL_DMA_Struct.Direction=LL_DMA_DIRECTION_PERIPH_TO_MEMORY;//外设到存储器模式
LL_DMA_Struct.Mode=LL_DMA_MODE_CIRCULAR;// DMA模式
LL_DMA_Struct.Priority=LL_DMA_PRIORITY_VERYHIGH;// 优先级:高
LL_DMA_Struct.NbData=trans_Num;//设置数据长度
LL_DMA_Struct.PeriphOrM2MSrcAddress=(uint32_t)&ADC12_COMMON->CDR;//外设地址 手册中描述有问标题 CDR的16-31位实际上没有数据
LL_DMA_Struct.MemoryOrM2MDstAddress=(unsigned int)buff_Addr0;//内存地址0
LL_DMA_Struct.PeriphOrM2MSrcDataSize=LL_DMA_PDATAALIGN_HALFWORD;// 外设数据单位16位 手册中描述有问标题 CDR的16-31位实际上没

有数据
LL_DMA_Struct.MemoryOrM2MDstDataSize=LL_DMA_MDATAALIGN_HALFWORD;// 内存数据单位16位 手册中描述有问标题 CDR的16-31位实际上没

有数据
LL_DMA_Struct.PeriphOrM2MSrcIncMode=LL_DMA_PERIPH_NOINCREMENT;// 外设地址不增
LL_DMA_Struct.MemoryOrM2MDstIncMode=LL_DMA_MEMORY_INCREMENT;// 内存地址自增
LL_DMA_Init(DMA1, LL_DMA_STREAM_0, &LL_DMA_Struct);
/* DMA双缓冲模式配置 */
//        LL_DMA_SetMemory1Address(DMA1, LL_DMA_STREAM_0, (unsigned int)buff_Addr1);//内存地址1
//  LL_DMA_EnableDoubleBufferMode(DMA1, LL_DMA_STREAM_0);        //使能双缓冲模式
//  LL_DMA_ClearFlag_TC0(DMA1);// 清除传输完成标志
/* 配置中断优先级 */
NVIC_SetPriority(DMA1_Stream0_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 0, 0));
NVIC_EnableIRQ(DMA1_Stream0_IRQn);
/* 开启DMA传输完成中断 */
LL_DMA_EnableIT_TC(DMA1, LL_DMA_STREAM_0);//使能传输完成中断
//        LL_DMA_DisableStream(DMA1, LL_DMA_STREAM_0);
LL_DMA_EnableStream(DMA1, LL_DMA_STREAM_0);

/*ADC2配置*/
LL_ADC_DeInit(ADC2);
/* 采样率设置 */
ADC_InitStruct.Resolution = LL_ADC_RESOLUTION_8B;//采样率
ADC_InitStruct.LeftBitShift=LL_ADC_LEFT_BIT_SHIFT_NONE;//无数据位移
ADC_InitStruct.LowPowerMode = LL_ADC_LP_MODE_NONE;//关闭低电压模式
LL_ADC_Init(ADC2, &ADC_InitStruct);
/* BOOST 位控制 */
LL_ADC_SetBoostMode(ADC2, LL_ADC_BOOST_MODE_50MHZ);
/* 规则采样参数配置 */
ADC_REG_InitStruct.TriggerSource=LL_ADC_REG_TRIG_SOFTWARE;//触发源
ADC_REG_InitStruct.DataTransferMode=LL_ADC_REG_DMA_TRANSFER_UNLIMITED;//DMA循环模式
ADC_REG_InitStruct.ContinuousMode=LL_ADC_REG_CONV_SINGLE;//单次转换
ADC_REG_InitStruct.SequencerLength = LL_ADC_REG_SEQ_SCAN_DISABLE;//转换通道数 1
ADC_REG_InitStruct.SequencerDiscont = LL_ADC_REG_SEQ_DISCONT_DISABLE;        //关闭不连续模式
ADC_REG_InitStruct.Overrun = LL_ADC_REG_OVR_DATA_OVERWRITTEN;//数据溢出模式
LL_ADC_REG_Init(ADC2, &ADC_REG_InitStruct);
//  LL_ADC_REG_SetTriggerEdge(ADC2, LL_ADC_REG_TRIG_EXT_RISING);//上升沿触发

        /* ADC2初始化 */
/* 退出掉电模式 */
LL_ADC_DisableDeepPowerDown(ADC2);
/* 启动内部稳压器 */
LL_ADC_EnableInternalRegulator(ADC2);
/* 等待内部稳压器启动 */
wait_loop_index = ((LL_ADC_DELAY_INTERNAL_REGUL_STAB_US * (SystemCoreClock / (100000 * 2))) / 10);
while(wait_loop_index != 0)
{
wait_loop_index--;
}

/* 配置规则通道 */
LL_ADC_REG_SetSequencerRanks(ADC2, LL_ADC_REG_RANK_1, LL_ADC_CHANNEL_5);
LL_ADC_SetChannelSamplingTime(ADC2, LL_ADC_CHANNEL_5, LL_ADC_SAMPLINGTIME_2CYCLES_5);
LL_ADC_SetChannelSingleDiff(ADC2, LL_ADC_CHANNEL_5, LL_ADC_SINGLE_ENDED);
/* 通道预选设置,这个很关键 */
ADC2->PCSEL |= (1UL << (__LL_ADC_CHANNEL_TO_DECIMAL_NB(LL_ADC_CHANNEL_5) & 0x1FUL));

        /* 启动校准 */
LL_ADC_StartCalibration(ADC2, LL_ADC_CALIB_OFFSET, LL_ADC_SINGLE_ENDED);
/* 等待校准完成 */
while(LL_ADC_IsCalibrationOnGoing(ADC2) != 0UL);

        /*ADC1配置*/
LL_ADC_DeInit(ADC1);
/* 采样率设置 */
ADC_InitStruct.Resolution = LL_ADC_RESOLUTION_8B;//采样率
ADC_InitStruct.LeftBitShift=LL_ADC_LEFT_BIT_SHIFT_NONE;//数据位移
ADC_InitStruct.LowPowerMode = LL_ADC_LP_MODE_NONE;//低电压模式 无
LL_ADC_Init(ADC1, &ADC_InitStruct);
/* BOOST 位控制 */
LL_ADC_SetBoostMode(ADC1, LL_ADC_BOOST_MODE_50MHZ);
/* 规则采样参数配置 */
ADC_REG_InitStruct.TriggerSource=LL_ADC_REG_TRIG_EXT_TIM6_TRGO;//触发源
ADC_REG_InitStruct.DataTransferMode=LL_ADC_REG_DMA_TRANSFER_UNLIMITED;//数据传送模式
ADC_REG_InitStruct.ContinuousMode=LL_ADC_REG_CONV_SINGLE;//单次转换
ADC_REG_InitStruct.SequencerLength = LL_ADC_REG_SEQ_SCAN_DISABLE;//通道数量 1通道无扫描
ADC_REG_InitStruct.SequencerDiscont = LL_ADC_REG_SEQ_DISCONT_DISABLE;        //关闭不连续模式
ADC_REG_InitStruct.Overrun = LL_ADC_REG_OVR_DATA_OVERWRITTEN;//数据溢出模式
LL_ADC_REG_Init(ADC1, &ADC_REG_InitStruct);
LL_ADC_REG_SetTriggerEdge(ADC1, LL_ADC_REG_TRIG_EXT_RISING);//上升沿触发

        /* 设置ADC分频系数 */
ADC_CommonInitStruct.CommonClock = LL_ADC_CLOCK_ASYNC_DIV1;

/* 双重模式配置 */
ADC_CommonInitStruct.Multimode=LL_ADC_MULTI_DUAL_REG_INTERL;/* 仅常规交替模式 */
ADC_CommonInitStruct.MultiDMATransfer=LL_ADC_MULTI_REG_DMA_RES_8B;/*双通道混合DMA 8位数据模式*/
ADC_CommonInitStruct.MultiTwoSamplingDelay=LL_ADC_MULTI_TWOSMP_DELAY_3CYCLES_5;//双重模式触发延迟
LL_ADC_CommonInit(__LL_ADC_COMMON_INSTANCE(ADC1), &ADC_CommonInitStruct);

        /* ADC1初始化 */
/* 退出掉电模式 */
LL_ADC_DisableDeepPowerDown(ADC1);
/* 启动内部稳压器 */
LL_ADC_EnableInternalRegulator(ADC1);
/* 等待内部稳压器启动 */
wait_loop_index = ((LL_ADC_DELAY_INTERNAL_REGUL_STAB_US * (SystemCoreClock / (100000 * 2))) / 10);
while(wait_loop_index != 0)
{
wait_loop_index--;
}

/* 配置规则通道 */
LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_1, LL_ADC_CHANNEL_5);
LL_ADC_SetChannelSamplingTime(ADC1, LL_ADC_CHANNEL_5, LL_ADC_SAMPLINGTIME_2CYCLES_5);
LL_ADC_SetChannelSingleDiff(ADC1, LL_ADC_CHANNEL_5, LL_ADC_SINGLE_ENDED);
/* 通道预选设置,这个很关键 */
ADC1->PCSEL |= (1UL << (__LL_ADC_CHANNEL_TO_DECIMAL_NB(LL_ADC_CHANNEL_5) & 0x1FUL));

/* 启动校准 */
LL_ADC_StartCalibration(ADC1, LL_ADC_CALIB_OFFSET, LL_ADC_SINGLE_ENDED);
/* 等待校准完成 */
while(LL_ADC_IsCalibrationOnGoing(ADC1) != 0UL);

/* 初始化采样定时器 */
ADC_TRIG_TIM6_Init(Prescaler,ARR);
}

DUAL_REG_INTERL_TIM6_ADC12_8B_Init(1,300,(unsigned int *)(unsigned int)OSC_ADC_ConvertedValue, 0xFFFF);//PB1 INP5 双通道倍速采



LL_ADC_Enable(ADC2);
while(LL_ADC_IsActiveFlag_ADRDY(ADC2) != SET);
LL_ADC_REG_StartConversion(ADC2);

LL_ADC_Enable(ADC1);
while(LL_ADC_IsActiveFlag_ADRDY(ADC1) != SET);
LL_ADC_REG_StartConversion(ADC1);

LL_TIM_EnableCounter(TIM6)
/**

* @brief  System Clock Configuration
* The system Clock is configured as follow :
  * System Clock source            = PLL (HSE)

    * SYSCLK(Hz)                     = 280000000 (CPU Clock)

      * HCLK(Hz)                       = 280000000 (Bus matrix and AHBs Clock)

        * AHB Prescaler                  = 1

          * CD APB3 Prescaler              = 2 (APB3 Clock  140MHz)

            * CD APB1 Prescaler              = 2 (APB1 Clock  140MHz)

              * CD APB2 Prescaler              = 2 (APB2 Clock  140MHz)

                * SRD APB4 Prescaler             = 2 (APB4 Clock  140MHz)

                  * HSE Frequency(Hz)              = 8000000

                    * PLL_M                          = 4

                      * PLL_N                          = 280

                        * PLL_P                          = 2

                          * PLL_Q                          = 4

                            * PLL_R                          = 2

                              * VDD(V)                         = 3.3

                                * Flash Latency(WS)              = 6

                                  * @param  None
                                  * @retval None
                                    */
                                /**

                                * @brief System Clock Configuration
                                * @retval None
                                  */
                                  void SystemClock_Config(void)
                                  {

                                /*AXI clock gating */
                                RCC->CKGAENR = 0xFFFFFFFF;

                                LL_FLASH_SetLatency(LL_FLASH_LATENCY_6);
                                while(LL_FLASH_GetLatency()!= LL_FLASH_LATENCY_6)
                                {
                                }
                                LL_PWR_ConfigSupply(LL_PWR_LDO_SUPPLY);
                                LL_PWR_SetRegulVoltageScaling(LL_PWR_REGU_VOLTAGE_SCALE0);
                                while (LL_PWR_IsActiveFlag_VOS() == 0)
                                {
                                }

                                LL_RCC_HSI48_Enable();//使能内部48Mhz时钟

                                /* Wait till HSI48 is ready */
                                while(LL_RCC_HSI48_IsReady() != 1)
                                {

                                }
                                LL_RCC_LSI_Enable();//使能内部低速时钟32KHz

                                /* Wait till LSI is ready */
                                while(LL_RCC_LSI_IsReady() != 1)
                                {

                                }

                                //  LL_PWR_EnableBkUpAccess();
                                //  LL_RCC_LSE_SetDriveCapability(LL_RCC_LSEDRIVE_MEDIUMLOW);
                                //  LL_RCC_LSE_Enable();//使能外部低速时钟32768Hz

                                //   /* Wait till LSE is ready */
                                //  while(LL_RCC_LSE_IsReady() != 1)
                                //  {

                                //  }

                                LL_RCC_HSE_Enable();//使能外部高速时钟8MHz
                                /* Wait till HSE is ready */
                                while(LL_RCC_HSE_IsReady() != 1)
                                {

                                }

                                LL_RCC_PLL_SetSource(LL_RCC_PLLSOURCE_HSE);//PLL时钟源为外部高速时钟
                                LL_RCC_PLL1P_Enable();//使能PLL1P
                                LL_RCC_PLL1Q_Enable();//使能PLL1Q
                                LL_RCC_PLL1R_Enable();//使能PLL1R
                                LL_RCC_PLL1_SetVCOInputRange(LL_RCC_PLLINPUTRANGE_2_4);
                                LL_RCC_PLL1_SetVCOOutputRange(LL_RCC_PLLVCORANGE_WIDE);
                                LL_RCC_PLL1_SetM(4);//HSE/4=2MHz
                                LL_RCC_PLL1_SetN(280);//2MHz*280=560MHz
                                LL_RCC_PLL1_SetP(2);//560MHz/2=280MHz  PLL1时钟280MHz CPU SYSTICK
                                LL_RCC_PLL1_SetQ(4);//560MHz/4=140MHz
                                LL_RCC_PLL1_SetR(2);//560MHz/2=280MHz
                                LL_RCC_PLL1_Enable();//使能PLL1时钟

                                /* Wait till PLL is ready */
                                while(LL_RCC_PLL1_IsReady() != 1)
                                {
                                }

                                /* Intermediate AHB prescaler 2 when target frequency clock is higher than 80 MHz */
                                LL_RCC_SetAHBPrescaler(LL_RCC_AHB_DIV_2);  //   /2=140MHz(APB1 APB2 APB3 APB4)

                                LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL1);//系统时钟源为PLL1=280MHz

                                /* Wait till System clock is ready */
                                while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL1)
                                {

                                }
                                LL_RCC_SetAHBPrescaler(LL_RCC_AHB_DIV_1);//AXI AHB时钟预分频1  280MHz AHB1 AHB2 AHB3 AHB4
                                LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_2);//APB1时钟预分频2  140MHz  APB1_TIME*2
                                LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_2);//APB2时钟预分频2  140MHz  APB2_TIME*2
                                LL_RCC_SetAPB3Prescaler(LL_RCC_APB3_DIV_2);//APB3时钟预分频2  140MHz
                                LL_RCC_SetAPB4Prescaler(LL_RCC_APB4_DIV_2);//APB4时钟预分频2  140MHz
                                LL_SetSystemCoreClock(280000000);//系统时钟 280MHz

                                /* Update the time base */
                                if (HAL_InitTick (TICK_INT_PRIORITY) != HAL_OK)
                                {
                                Error_Handler();
                                }
                                LL_CRS_SetSyncDivider(LL_CRS_SYNC_DIV_1);
                                LL_CRS_SetSyncPolarity(LL_CRS_SYNC_POLARITY_RISING);
                                LL_CRS_SetSyncSignalSource(LL_CRS_SYNC_SOURCE_LSE);
                                LL_CRS_SetReloadCounter(__LL_CRS_CALC_CALCULATE_RELOADVALUE(48000000,32768));
                                LL_CRS_SetFreqErrorLimit(34);
                                LL_CRS_SetHSI48SmoothTrimming(32);
                                }

                                /**

                                * @brief Peripherals Common Clock Configuration
                                * @retval None
                                  */
                                  void PeriphCommonClock_Config(void)
                                  {
                                  LL_RCC_PLL2P_Enable();//使能PLL2P 50MHz to ADC
                                  LL_RCC_PLL2_SetVCOInputRange(LL_RCC_PLLINPUTRANGE_2_4);
                                  LL_RCC_PLL2_SetVCOOutputRange(LL_RCC_PLLVCORANGE_WIDE);
                                  LL_RCC_PLL2_SetM(4);//HSE/4=2MHz
                                  LL_RCC_PLL2_SetN(125);//2MHz*125=250MHz
                                  LL_RCC_PLL2_SetP(5);//250MHz/5=50MHz
                                  LL_RCC_PLL2_SetQ(1);//250MHz/1=250MHz
                                  LL_RCC_PLL2_SetR(1);//250MHz/1=250MHz
                                  LL_RCC_PLL2_Enable();//使能PLL2外设时钟

                                /* Wait till PLL is ready */
                                while(LL_RCC_PLL2_IsReady() != 1)
                                {
                                }

                                LL_RCC_PLL3P_Enable();//使能PLL3P 160MHz to SPI
                                LL_RCC_PLL3Q_Enable();//使能PLL3Q 48MHz to USB
                                LL_RCC_PLL3R_Enable();//使能PLL3R 96MHz to I2C
                                LL_RCC_PLL3_SetVCOInputRange(LL_RCC_PLLINPUTRANGE_2_4);
                                LL_RCC_PLL3_SetVCOOutputRange(LL_RCC_PLLVCORANGE_WIDE);
                                LL_RCC_PLL3_SetM(4);//HSE/2=2MHz
                                LL_RCC_PLL3_SetN(240);//2MHz*240=480MHz
                                LL_RCC_PLL3_SetP(3);//480MHz/3=160MHz
                                LL_RCC_PLL3_SetQ(10);//480MHz/10=48MHz
                                LL_RCC_PLL3_SetR(12);//480MHz/12=40MHz
                                LL_RCC_PLL3_Enable();//使能PLL3外设时钟

                                /* Wait till PLL is ready */
                                while(LL_RCC_PLL3_IsReady() != 1)
                                {
                                }

                                }
收藏 评论9 发布时间:2026-1-3 11:44

举报

9个回答
onlap 最优答案 回答时间:前天 17:23

onlap 发表于 2026-1-6 11:55</p>
<p>因为MCO2没有单独引出来(用来做了QSPI的储存芯片用了),所以只能用相同PLL2P的信号输出做验证了, ...

[md]现在发现问题是MXcube配置时钟造成的,PLL2P正确配置应该是100MHz才正确(配置为100MHz时提示错误),因为ADC选择时钟源后,内部硬件有一次2分频才到ADC内核使用,所以不用管软件提示 ,将PLL2P设置为100MHz就正确了

LL_RCC_PLL2P_Enable();//使能PLL2P 100MHz to ADC LL_RCC_PLL2_SetVCOInputRange(LL_RCC_PLLINPUTRANGE_2_4); LL_RCC_PLL2_SetVCOOutputRange(LL_RCC_PLLVCORANGE_WIDE); LL_RCC_PLL2_SetM(4);//HSE/4=2MHz LL_RCC_PLL2_SetN(150);//2MHz*150=300MHz LL_RCC_PLL2_SetP(3);//300MHz/3=100MHz LL_RCC_PLL2_SetQ(2);//300MHz/2=150MHz LL_RCC_PLL2_SetR(2);//300MHz/2=150MHz LL_RCC_PLL2_Enable();//使能PLL2外设时钟

/ Wait till PLL is ready / while(LL_RCC_PLL2_IsReady() != 1) { }

STM32H7A3ADC_CLOCK.png

这样配置后单一通道采样速率可以达到7MSPS(双重同步模式每个单一通道也可以达到7MSPS)

但是双重交替采样模式无法达到14MSPS(7MSPS×2),不清楚是什么原因

双重交替采样DMA也出现以下问题,不清楚是什么原因

双ADC_DMA.jpg

如果这两个位置有数据,速度就是14MSPS,但是CDR这个16:31位置都是0,不清楚是什么原因

wenyangzeng 回答时间:5 天前

应该是采用ADC连续采样+DMA模式,而不是通过定时器触发模式才能达到较高采样速度吧?

onlap 回答时间:5 天前

wenyangzeng 发表于 2026-1-3 14:39
应该是采用ADC连续采样+DMA模式,而不是通过定时器触发模式才能达到较高采样速度吧?
...

ADC+DMA测试速度也是3.5MSPS

butterflyspring 回答时间:4 天前
可以验证一下各个时钟是否是期望的配置频率,看看有没有哪个时钟没有达到期望的频率。


onlap 回答时间:4 天前

验证过输入频率180Hz正确 开始测试是随着tim6的频率上升,采样率也同步上升 ,说明时钟正确,只是到大约3.5M之后不上升,问题可能不在时钟

butterflyspring 回答时间:4 天前
onlap 发表于 2026-1-4 13:59
[md]验证过输入频率180Hz正确 开始测试是随着tim6的频率上升,采样率也同步上升 ,说明时钟正确,只是到大 ...

最好量测一下实际ADC 的时钟是否是50Mhz,否则工作的速度就会有差异。

STM32H7A3RGT6 ADC CLOCK 50M.PNG




onlap 回答时间:3 天前

butterflyspring 发表于 2026-1-4 14:43
最好量测一下实际ADC 的时钟是否是50Mhz,否则工作的速度就会有差异。</p>
<p>

已经确认PLL2P频率为50MHz(用lptim输出PWM 选择PLL2P为时钟源,PSC=7(1/128), AutoReload=65535,实测输出频率为5.96Hz 50000000/128/65535=5.96Hz)实测频率5.96Hz与计算结果一致,

已确认测试输入频率正确(TIM7触发DAC2输出频率为182.2Hz 280000000/AutoReload=2000/PSC=3/样品数256=182.3Hz) 实测频率182.3Hz与计算结果一致,

以上说明主频280MHz与PLL2P频率50MHz都没有问题

也怀疑过DMA1的速度问题,但是将DMA1启用缓存和不启用缓存两种状态都测试过,结果是一样的,

修改寄存器,将PLL2P频率调整为100MHz,采样率可以达到7M DMA1转运数据正确,所以与DMA1的速度没有关系,但不确定ADC频率在100MHz频率(超频)下是否能长期稳定工作

现在就不清楚问题出在什么地方

butterflyspring 回答时间:前天 11:04
onlap 发表于 2026-1-5 21:00
[md]已经确认PLL2P频率为50MHz(用lptim输出PWM  选择PLL2P为时钟源,PSC=7(1/128), AutoReload=65535,实 ...

如果ADC的频率设定100M 还能工作,那的确很奇怪,从结果上看又刚好转换到7Mhz 速率了。
厂家的最大频率只有50MHZ,按说如果100M能工作,那么标准不应该定的那么低。 所以最好修改一下软件,通过那个MCO 已经输出,量测一下内部真正的频率。有时候细节太多了~~

STM32H7A3RGT6 ADC CLOCK max 50M.PNG





onlap 回答时间:前天 11:55

butterflyspring 发表于 2026-1-6 11:04
如果ADC的频率设定100M 还能工作,那的确很奇怪,从结果上看又刚好转换到7Mhz 速率了。
厂家的最大频率只 ...

因为MCO2没有单独引出来(用来做了QSPI的储存芯片用了),所以只能用相同PLL2P的信号输出做验证了,而且这个验证也正确也检查过寄存器的实际值都符合50MHz的频率设定,晶振的频率也是正确的,要不然DAC的输出频率也不会与理论数值一致,

现在知道PLL2P的问题在什么地方 是因为MXcube本身存在问题,ADC频率正确设置应该是PLL2P=100MHz,然后ADC内部有一个硬件2分频,输入100MHz频率 ADC工作频率才是50MHz,这个不仔细看手册发现不了,不能依赖MXcube,所以PLL2P时钟正确设置应该是100MHz

STM32H7A3ADC_CLOCK.png

另外还有一个问题就是

双重同步采样单独一个通道就可以达到7MSPS

双重交替模式就是定时器触发频率最多可以达到3.5M,只可以达到3.5MSPS×2=7MSPS

不能够获得7MSPS×2=14MSPS的采样率,这样不清楚原因处在什么地方

以下CDR寄存器的高16位始终为0 不清楚是什么原因未标题-1.jpg

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版