|
我用的芯片是 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_DIV2 ADC_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ת»»
|
|