STM32
直播中

温暖镜头

10年用户 1056经验值
擅长:电源/新能源 制造/封装
私信 关注
[问答]

STM32G070 ADC配置检测3个通道,DMA传输长度为1,OVR标志不会置1为什么?

ADC配置检测3个通道,DMA传输长度为1,OVR标志不会置1,为什么?

不知道自己哪里理解错误了,求指教

if (HAL_ADC_Start_DMA( hadc1,(uint32_t *)aADCxConvertedData,1) != HAL_OK)
{

Error_Handler();
}


///////初始配置


hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;//ADC_CLOCK_ASYNC_DIV1;//
hadc1.Init.Resolution = ADC_RESOLUTION_12B;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;//多通道扫描要使能,单通道扫描关闭
hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
hadc1.Init.LowPowerAutoWait = DISABLE;//等待转换模式
hadc1.Init.LowPowerAutoPowerOff = DISABLE;//自动关闭模式
hadc1.Init.ContinuousConvMode = DISABLE;//单次或连续转换模式
hadc1.Init.NbrOfConversion = 3;//转换通道3个
hadc1.Init.DiscontinuousConvMode = DISABLE;//不连续模式

hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;

hadc1.Init.DMAContinuousRequests = DISABLE;//ENABLE;
hadc1.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;//溢出覆盖数据
hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_1CYCLE_5;
hadc1.Init.SamplingTimeCommon2 = ADC_SAMPLETIME_160CYCLES_5;
hadc1.Init.OversamplingMode = DISABLE;//过采样器使能
//        hadc1.Init.OversamplingMode      = ENABLE;
hadc1.Init.Oversampling.Ratio         = ADC_OVERSAMPLING_RATIO_16;
hadc1.Init.Oversampling.RightBitShift = ADC_RIGHTBITSHIFT_4;
hadc1.Init.Oversampling.TriggeredMode = ADC_TRIGGEREDMODE_SINGLE_TRIGGER;
hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH;
if (HAL_ADC_Init( hadc1) != HAL_OK)
{
Error_Handler();
}
/** Configure Regular Channel
*/
sConfig.Channel = ADC_CHANNEL_4;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_2;
if (HAL_ADC_ConfigChannel( hadc1,  sConfig) != HAL_OK)
{
Error_Handler();
}
/** Configure Regular Channel
*/
sConfig.Channel = ADC_CHANNEL_TEMPSENSOR;
sConfig.Rank = ADC_REGULAR_RANK_2;
if (HAL_ADC_ConfigChannel( hadc1,  sConfig) != HAL_OK)
{
Error_Handler();
}
/** Configure Regular Channel
*/
sConfig.Channel = ADC_CHANNEL_VREFINT;
sConfig.Rank = ADC_REGULAR_RANK_3;
if (HAL_ADC_ConfigChannel( hadc1,  sConfig) != HAL_OK)
{
Error_Handler();
}


/* ADC1 DMA Init */

/* ADC1 Init */
hdma_adc1.Instance = DMA1_Channel1;
hdma_adc1.Init.Request = DMA_REQUEST_ADC1;
hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;
hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
hdma_adc1.Init.Mode = DMA_NORMAL;//DMA_CIRCULAR;//
hdma_adc1.Init.Priority = DMA_PRIORITY_HIGH;
if (HAL_DMA_Init( hdma_adc1) != HAL_OK)
{
Error_Handler();
}

__HAL_LINKDMA(hadc,DMA_Handle,hdma_adc1);


回帖(1)

洒下墨色

2024-3-31 15:16:23
检查ADC和DMA的配置是否正确,确保以下几点:

1. 确保ADC的引脚正确配置,使得3个通道的输入信号能够正确连接到ADC。检查ADC的GPIO引脚配置是否正确。

2. 检查DMA的通道配置是否正确,确保DMA能够正确地传输数据。检查DMA的初始化配置是否正确,包括数据传输方向、传输数据的大小、传输完成后的回调函数等。

3. 检查DMA的传输长度是否设置正确,确保每次传输的数据长度为1个单位。在代码中的`HAL_ADC_Start_DMA`函数中,第三个参数为传输数据的长度,应该设置为1。

4. 确保ADC的转换模式配置正确。在代码中的`hadc1.Init.ScanConvMode`配置为`ADC_SCAN_ENABLE`,表示启用多通道扫描模式。

5. 最后,确保ADC的中断和DMA传输的中断配置正确。检查NVIC中断配置和中断处理函数,确保配置正确且能够正常处理中断请求。

如果以上配置都正确,但仍然没有触发OVR标志位,可以参考以下操作进行排查:

1. 检查ADC的时钟源,确保ADC的时钟源和时钟分频配置正确。

2. 检查ADC的采样时间配置,确保采样时间足够长以满足输入信号的要求。

3. 检查ADC转换周期配置,确保转换周期足够长以满足ADC的要求。

4. 检查ADC的参考电压配置,确保参考电压和输入电压范围的匹配。

如果经过检查仍然无法解决问题,可以尝试通过调试工具(如调试器或示波器)观察ADC和DMA的工作状态,以确定具体的问题所在。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分