STM32F072+FREE RTOS+DMA+ADC cubemx
这次的主要目的是学习使用DMA的方式读取adc取得的数据,然后发送给串口显示。
第一步
使用CUBEMX进行配置,这里我用的是IN10,注意要在里面的模式 DMA continuous Requests 选为ENable。否则,读出的数据只有上电的这次。
第二步。设置DMA的
第三步,生成代码。
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