STM32F072+FREE RTOS+DMA+ADC cubemx

这次的主要目的是学习使用DMA的方式读取adc取得的数据,然后发送给串口显示。

第一步

使用CUBEMX进行配置,这里我用的是IN10,注意要在里面的模式 DMA continuous Requests 选为ENable。否则,读出的数据只有上电的这次。

 

STM32F072+FREE RTOS+DMA+ADC cubemx

第二步。设置DMA的

STM32F072+FREE RTOS+DMA+ADC cubemx

第三步,生成代码。

 hadc.Instance = ADC1;
  hadc.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
  hadc.Init.Resolution = ADC_RESOLUTION_12B;
  hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD;
  hadc.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  hadc.Init.LowPowerAutoWait = DISABLE;
  hadc.Init.LowPowerAutoPowerOff = DISABLE;
  hadc.Init.ContinuousConvMode = ENABLE;
  hadc.Init.DiscontinuousConvMode = DISABLE;
  hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  hadc.Init.DMAContinuousRequests = ENABLE;
  hadc.Init.Overrun = ADC_OVR_DATA_PRESERVED;
  if (HAL_ADC_Init(&hadc) != HAL_OK)

这是初始化的代码

第四步

在任务中执行如下代码

void Demo_DMA_ADC(void)
{
    for(DMA_ADC_i=0;DMA_ADC_i<9;DMA_ADC_i++)
    {
        for(DMA_ADC_j=DMA_ADC_i+1;DMA_ADC_j<10;DMA_ADC_j++)
        {
            if(ADC_DMA_VALUE[DMA_ADC_i]>ADC_DMA_VALUE[DMA_ADC_j])
            {
                ADC_temp=ADC_DMA_VALUE[DMA_ADC_i];
                ADC_DMA_VALUE[DMA_ADC_i]=ADC_DMA_VALUE[DMA_ADC_j];
                ADC_DMA_VALUE[DMA_ADC_j]=ADC_temp;
            }
        }
    }
    ADC_SUM=0;
    for(DMA_ADC_i=0;DMA_ADC_i<10;DMA_ADC_i++)
    {
        ADC_SUM=ADC_SUM+ADC_DMA_VALUE[DMA_ADC_i];
        printf("ADC= 0x%04X\r\n",ADC_DMA_VALUE[DMA_ADC_i]);
    }
    ADC_Average=ADC_SUM/10;
    printf("ADC= 0x%04X\r\n",ADC_SUM);
    printf("ADC= 0x%04X\r\n",ADC_Average);
}
OK