shenxl419 发表于 2020-5-11 15:21:56

求助:STM32H750VBT6 现在ADC采样只能设置到500K?

我用的芯片是 STM32H750VBT6, 采用的是PC4引脚快速通道,时钟采用PLL时钟,ADC时钟设置为36MHZ.
现在问题是,采用周期数只能设置为64.5以上,如果设置为64.5以下,用串口打印ADC数据不显示。
求助,STM32H750单通道DMA ADC如何设置频率最高为2MHZ以上呢?
我的部分配置代码
ADC_ChannelConfTypeDef ADC_Config;
    RCC_PeriphCLKInitTypeDef RCC_PeriphClkInit;
   
   
      
   
    ADC_GPIO_Init();//ADC¶Ë¿ÚÅäÖÃ
      
    /*            ÅäÖÃADC1ʱÖÓÔ´            */
    /*    HSE Frequency(Hz)    = 25000000    */                                             
    /*         PLL_M                = 25   */
    /*         PLL_N                = 504    */
    /*         PLL_P                = 7      */
    /*         PLL_Q                = 7      */
    /*         PLL_R                = 7      */
    /*   ADC_ker_clk         = 36000000    */
//   
      RCC_PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADC;
    RCC_PeriphClkInit.PLL2.PLL2M = 25;
    RCC_PeriphClkInit.PLL2.PLL2N = 504;
    RCC_PeriphClkInit.PLL2.PLL2P = 7;
    RCC_PeriphClkInit.PLL2.PLL2Q = 7;
    RCC_PeriphClkInit.PLL2.PLL2R = 7;
    RCC_PeriphClkInit.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_0;
    RCC_PeriphClkInit.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE;
      RCC_PeriphClkInit.PLL2.PLL2FRACN = 0;
    RCC_PeriphClkInit.AdcClockSelection = RCC_ADCCLKSOURCE_PLL2;
      HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphClkInit);
//
   
   //ʹÄÜADC1ʱÖÓºÍDMAʱÖÓ
    __HAL_RCC_DMA1_CLK_ENABLE();
      
    ADC1_DMA_Handle.Instance = DMA1_Stream1;                               //ʹÓÃstream1
    ADC1_DMA_Handle.Init.Request = DMA_REQUEST_ADC1;                     //ʹÓÃADC1µÄÇëÇó
    ADC1_DMA_Handle.Init.Direction = DMA_PERIPH_TO_MEMORY;                // ·½Ïò£ºÍâÉèµ½ÄÚ´æ
    ADC1_DMA_Handle.Init.PeriphInc = DMA_PINC_DISABLE;                   // ÍâÉèµØÖ·²»×ÔÔö
    ADC1_DMA_Handle.Init.MemInc =    DMA_MINC_DISABLE;                   // ÄÚ´æµØÖ·²»×ÔÔö
    ADC1_DMA_Handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; //¿í¶È°ë×Ö
    ADC1_DMA_Handle.Init.MemDataAlignment =   DMA_MDATAALIGN_HALFWORD;   
    ADC1_DMA_Handle.Init.Mode = DMA_CIRCULAR;                     //ģʽ£ºÑ­»··½Ê½
    ADC1_DMA_Handle.Init.Priority = DMA_PRIORITY_VERY_HIGH ;       //DMAµÄÈí¼þÓÅÏȼ¶
    ADC1_DMA_Handle.Init.FIFOMode = DMA_FIFOMODE_DISABLE;          // FIFOģʽ¹Ø±Õ
      
    if(HAL_DMA_Init(&ADC1_DMA_Handle) != HAL_OK)
    {
          Error_Handler(__FILE__, __LINE__);
      
      }
    __HAL_LINKDMA(&ADC1_Handle,DMA_Handle,ADC1_DMA_Handle);   
      
//====================================================================================//
//ADCÅäÖÃ
      __HAL_RCC_ADC12_CLK_ENABLE(); //ʹÄÜADC1µÄʱÖÓ
      
    ADC1_Handle.Instance = ADC1; //ADC1
    ADC1_Handle.Init.BoostMode = DISABLE;                         //µ±Ê±ÖÓ³¬¹ý20MHZ,ʹÄÜBoostģʽ
    ADC1_Handle.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1 ;//ADCʱÖÓ1·ÖƵ// ; ²ÉÓÃAHBͬ²½Ê±ÖÓ    ADC_CLOCK_ASYNC_DIV2ADC_CLOCKPRESCALER_PCLK_DIV4
    ADC1_Handle.Init.Resolution = ADC_RESOLUTION_16B;      //·Ö±æÂÊΪ£º16bit
    ADC1_Handle.Init.ScanConvMode = ENABLE;                     //²»Ê¹ÄܶàͨµÀɨÃè
    ADC1_Handle.Init.EOCSelection = ADC_EOC_SINGLE_CONV;//µ¥´Îת»»
      ADC1_Handle.Init.LowPowerAutoWait = DISABLE;          //¹Ø±ÕµÍ¹¦ºÄ×Ô¶¯µÈ´ý
      ADC1_Handle.Init.ContinuousConvMode = ENABLE;          //ʹÄÜÁ¬Ðøת»»Ä£Ê½
    ADC1_Handle.Init.NbrOfConversion = 1;                  //ɨÃè1¸öͨµÀ
    ADC1_Handle.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_CIRCULAR;//DMAÑ­»··½Ê½½ÓÊÕÊý¾Ý
    ADC1_Handle.Init.DiscontinuousConvMode = DISABLE;      //¹Ø±Õ²»Á¬Ðøת»»Ä£Ê½
    ADC1_Handle.Init.NbrOfDiscConversion = 0;               // ·ÇÁ¬Ðøת»»¸öÊý
    ADC1_Handle.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;    // Êý¾ÝÓÒ¶ÔÆë   
    ADC1_Handle.Init.ExternalTrigConv = ADC_SOFTWARE_START;//Èí¼þ´¥·¢
    ADC1_Handle.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;   //Êý¾ÝÒç³öʱ£¬¸²¸ÇдÈë
    ADC1_Handle.Init.OversamplingMode = DISABLE;            //½ûֹʹÓùý²ÉÑù
    HAL_ADC_Init(&ADC1_Handle); //³õʼ»¯ ADC1
         
//====================================================================================//
    // ADCµÄͨµÀÅäÖà  
    ADC_Config.Channel = ADC_CHANNEL_4;//ʹÓÃͨµÀ10
    ADC_Config.Rank = ADC_REGULAR_RANK_1;//ת»»Ë³ÐòΪ1
    ADC_Config.SamplingTime = ADC_SAMPLETIME_64CYCLES_5 ;   
      //²ÉÑùÖÜÆÚΪ64.5¸öÖÜÆÚ
   
      // ADC_AMPLETIME_2CYCLES_5
      // ADC_SAMPLETIME_16CYCLES_5
      // ADC_SAMPLETIME_32CYCLES_5;
      //ADC_SAMPLETIME_64CYCLES_5
    // ADC_SAMPLETIME_387CYCLES_5
    // ADC_SAMPLETIME_810CYCLES_5      
    ADC_Config.SingleDiff = ADC_SINGLE_ENDED ;//²»Ê¹Óòî·ÖÊäÈëµÄ¹¦ÄÜ
    HAL_ADC_ConfigChannel(&ADC1_Handle, &ADC_Config); //ÅäÖÃADCͨµÀ
      
    //ʹÄÜADC1
    ADC_Enable(&ADC1_Handle);
    HAL_ADC_Start_DMA(&ADC1_Handle, (uint32_t*)&ADC_ConvertedValue, 1); //¿ªÆôDMAÊý¾Ý´«Êä
      
      HAL_ADC_Start(&ADC1_Handle); //¿ªÊ¼ADCת»»



eric2013 发表于 2020-5-11 15:37:20

注意DMA的Cache文件,别的没有要注意的了。

shenxl419 发表于 2020-5-11 15:49:07

请问硬汉哥,H750的 DMA方式采集多通道ADC,参考的例子都是用中断来获得数据,这个不用中断可以吗?直接读取SRAM的变量

eric2013 发表于 2020-5-12 07:31:02

shenxl419 发表于 2020-5-11 15:49
请问硬汉哥,H750的 DMA方式采集多通道ADC,参考的例子都是用中断来获得数据,这个不用中断可以吗?直接读 ...
没问题,之所以采用DMA双缓冲配合中断是为了实时获取数据。

需要直接读取使用,这个章节配套的例子适合你。
http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980&extra=page%3D1


affe 发表于 2020-5-20 18:21:43

这里有两块内容,一块是DMA的操作,另一块是串口输出。
DMA的两个中断程序HalfCplt和Cplt都必须能正确地把相应的采样数据从buffer中拷出来。输出动作不要放在中断响应程序中做。

串口输出,不知道你想输出多少内容。串口如果波特率设3Mbps,传输速率就是300kcps。
如果用4个字节表示一个采样数据,加一个空格分隔,300kcps最多每秒显示60k个数据。
2Msps的采样数据,是不可能通过串口全部实时显示出来的。

bao292387701 发表于 2020-9-16 20:27:05

定时器触发ADC采样,频率能到多少,我想用3MHz采样,可是一直上不去,我已经降到12Bit,36MHzADC时钟,采样周期是2.5个ADC,不知道为什么还是上不去,手册上写的是能到4点几Mhz,你做过这方面实验吗?

eric2013 发表于 2020-9-16 21:40:39

bao292387701 发表于 2020-9-16 20:27
定时器触发ADC采样,频率能到多少,我想用3MHz采样,可是一直上不去,我已经降到12Bit,36MHzADC时钟,采样 ...

已经回复

STM32H743adc采样率上不去的问题
http://www.armbbs.cn/forum.php?mod=viewthread&tid=100026&fromuid=58
(出处: 硬汉嵌入式论坛)

不吃鱼的猫大人 发表于 2024-4-22 17:04:17

bao292387701 发表于 2020-9-16 20:27
定时器触发ADC采样,频率能到多少,我想用3MHz采样,可是一直上不去,我已经降到12Bit,36MHzADC时钟,采样 ...

请问您采样率上去了吗?我现在用的是VBT6 8bit感觉采样率也才4M多,连5M都达不到

eric2013 发表于 2024-4-23 07:51:05

不吃鱼的猫大人 发表于 2024-4-22 17:04
请问您采样率上去了吗?我现在用的是VBT6 8bit感觉采样率也才4M多,连5M都达不到

注意这个帖子的问题。

STM32H7中ADC功能被ST玩出花,现在分直接通道,快速通道和慢速通道,不同封装最高速不同, LQFP封装速度最低
https://www.armbbs.cn/forum.php?mod=viewthread&tid=97343
页: [1]
查看完整版本: 求助:STM32H750VBT6 现在ADC采样只能设置到500K?