En el siguiente documento se muestran los errores del ADC.
http://www.st.com/content/ccc/resource/technical/document/application_note/group0/3f/4c/a4/82/bd/63/4e/92/CD00211314/files/CD00211314.pdf/jcr:content/translations/en.CD00211314.pdfTengo la misma tarjeta, y pues no creo que le metan componentes de calidad y quien sabe que tan bien esté diseñado el PCB, por ejemplo, en una de las tarjetas que tengo, el pin de 3.3V da 3.24V y de los 3 pines de GND sólo uno funciona, así que no espero nada bueno de ella, en cuestión de que obtenga valores estables, pero lo que si puedes hacer es incrementar ciertos valores de configuración para por lo menos reducir algunos de los errores.
Por ejemplo, de la hoja de datos, tenemos que
2 x 12-bit, 1 μs A/D
Es decir que la conversión de Análogo a Digital le toma 1us. Si tomamos en cuenta esa valor y además sabemos que, en este caso tanto ADC1 y ADC2 están conectados a un reloj de 12Mhz como se ve en la siguiente imagen. Entonces para obtener una conversión requiere de almenos 12 ciclos de reloj.

El valor con el que lo configuras es de 7.5 ciclos, de ahí que algunas o todas las lecturas pueden resultar más inestables de lo que esperarías normalmente ya que no le permites al ADC terminar con la conversión (0.625us). En las imágenes siguientes podrás constatar el error que se presenta al leer tres entradas (ADC_IN0 en PA0, Temperatura, Vrefint), cuando coloco PA0 a 3.3V (aunque el aparatito sólo me entrega 3.24V) y a GND.


En cambio si se que requiere 12 ciclos, el valor de configuración más cercano que sea superior es 13.5 ciclos y el resultado se puede ver en las siguientes imágenes.


El mayor error que se aprecia en las lecturas del VTemp y Vref, cuando se cambia de 3.3 a GND.
Cuando se aumenta 28.5 ciclos


71.5 ciclos


239.5 ciclos


Esta es la configuración del ADC con el que hice las pruebas.
hadc1.Instance = ADC1;
hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 3;
sConfig.SamplingTime = ADC_SAMPLETIME_7CYCLES_5;
//sConfig.SamplingTime = ADC_SAMPLETIME_13CYCLES_5;
//sConfig.SamplingTime = ADC_SAMPLETIME_28CYCLES_5;
//sConfig.SamplingTime = ADC_SAMPLETIME_71CYCLES_5;
//sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;
En la configuración del DMA lo coloqué normal, en lugar de circular. Y las lecturas las realizo a través de un Timer.
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == htim3.Instance)
{
HAL_ADC_Start_DMA(&hadc1, g_ADCBuffer, 9);
}
}
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *AdcHandle)
{
sprintf(buffer,"%i %i %i %i %i %i %i %i %i\n", g_ADCBuffer[0],
g_ADCBuffer[3],
g_ADCBuffer[6],
g_ADCBuffer[1],
g_ADCBuffer[4],
g_ADCBuffer[7],
g_ADCBuffer[2],
g_ADCBuffer[5],
g_ADCBuffer[8]);
CDC_Transmit_FS((uint8_t *)&buffer,strlen(buffer));
}