STM32F446 ADC DMA模式下 经常OVR(数据溢出),导致ADC不工作

2019-07-20 06:20发布

如题:STM32F446  ADC DMA模式下  经常OVR(数据溢出),导致ADC不工作。芯片STM32F446  ,系统时钟配置成168M,ADC为21M, 用PB0口进行ADC采样,软件触发方式,用DMA将采样数据存储在一个数组中。

程序跑着跑着ADC就停止工作,发现ADC_SR寄存器的OVR置为1,经过检查,也没查出有啥问题,请大神帮忙看看:
1、ADC配置如下
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
ADC_DeInit();
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;//
ADC_CommonInit(&ADC_CommonInitStructure);

ADC_InitStructure.ADC_Resolution = ADC_Resolution_8b;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;   
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;  
ADC_InitStructure.ADC_NbrOfConversion = 1;

ADC_Init(ADC1, &ADC_InitStructure);
ADC_RegularChannelConfig(ADC1,ADC_Channel_8, 1, ADC_SampleTime_3Cycles);//ADC12_IN_8

    /* Enable DMA request after last transfer (Single-ADC mode) */
ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);
    /* Enable ADC1 DMA */
ADC_DMACmd(ADC1, ENABLE);
ADC_Cmd(ADC1, ENABLE);

2、DMA配置如下
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
  DMA_InitStructure.DMA_Channel = DMA_Channel_0;  
  DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&(ADC1->DR);
  DMA_InitStructure.DMA_Memory0BaseAddr = (u32)addr;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
  DMA_InitStructure.DMA_BufferSize = len;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;         
  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
  DMA_Init(DMA2_Stream0, &DMA_InitStructure);
  DMA_Cmd(DMA2_Stream0, ENABLE);
  DMA_ITConfig(DMA2_Stream0, DMA_IT_TC, DISABLE);




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
15条回答
miraclexue
1楼-- · 2019-07-21 16:15
 精彩回答 2  元偷偷看……
Bunny17
2楼-- · 2019-07-21 18:01
miraclexue 发表于 2017-12-5 12:14
每次初始化都要加DMA_DeInit(DMAy_Streamx);

我的是开启的DMA中断解决的。ADC循环采集,DMA传输完成就中断处理一次数据
carverzhang
3楼-- · 2019-07-21 20:47
这个帖子好久了,我还是想问下。 我目前采用 ADC 三重模式,在初始化完 ADC和 DMA后使用 HAL_ADCEx_MultiModeStart_DMA()使能DMA传输和启动ADC后,OVR立即会==1,不知道为什么?按理来说这时候ADC应该还是没有开始工作呀 ?

/* Enable the DMA Stream */
    HAL_DMA_Start_IT(hadc->DMA_Handle, (uint32_t)&ADC->CDR, (uint32_t)pData, Length);
   
    /* if no external trigger present enable software conversion of regular channels */
    if((hadc->Instance->CR2 & ADC_CR2_EXTEN) == RESET)
    {
      /* Enable the selected ADC software conversion for regular group */
      hadc->Instance->CR2 |= (uint32_t)ADC_CR2_SWSTART;
    }

这是 HAL_ADCEx_MultiModeStart_DMA()会执行的一段 。

一周热门 更多>