Estoy tratando de aprender cómo usar la "nueva" biblioteca HAL de stm32.
Cuando trato de hacer una conversión ADC simple, funciona solo una vez, pero luego deja de convertir. Supongo que el indicador de Fin de conversión no se establece. Estoy usando la placa de descubrimiento STM32f429I, que tiene STM32f429ZI a bordo.
Tenga en cuenta que sé que sprintf es una mala práctica y que hacer adc con interrupción es mejor, sé que, por favor, no lo señale, esto no es relevante para la pregunta, solo estoy probando HAL aquí.
Entonces, la pregunta es por qué el indicador EOC no está configurado o qué puedo hacer para que funcione. Buscar en Google no ayuda mucho, ya que hay muy pocos buenos materiales sobre HAL.
Aquí está el código:
__IO uint16_t ADCValue=0;
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc);
int main(void)
{
char str[15];
/* Various initializations */
HAL_ADC_Start(&hadc1);
while (1)
{
if (HAL_ADC_PollForConversion(&hadc1, 1000000) == HAL_OK)
{
ADCValue = HAL_ADC_GetValue(&hadc1);
sprintf(str, "%d", ADCValue);
BSP_LCD_DisplayStringAt(130,30, (uint8_t*)str, LEFT_MODE);
}
}
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
ADCValue = HAL_ADC_GetValue(&hadc1);
}
También creé el proyecto con CubeMX, la configuración adc es la siguiente:
EDITAR 1
Intenté depurar todo y parece que el programa se queda atascado en la comprobación de la marca EOC: ve que no se muestra y, por lo tanto, emite un temporizador esperando que aparezca EOC (pero nunca se configura) Aquí está el código donde está se atasca en el depurador:
/* Check End of conversion flag */
while(!(__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_EOC)))
{
/* Check for the Timeout */
if(Timeout != HAL_MAX_DELAY)
{
if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
{
hadc->State= HAL_ADC_STATE_TIMEOUT;
/* Process unlocked */
__HAL_UNLOCK(hadc);
return HAL_TIMEOUT;
}
}
fuente
#define ADC_EOC_SEQ_CONV ((uint32_t)0x00000000)
que es lo mismo que deshabilitado, por lo que deshabilitado es en realidad ADC_EOC_SEQ_CONV.Hm ... Encontré un par de tutoriales que usaban HAL_ADC_Stop (& hadc1) para finalizar la conversión ... Estaba mirando estos tutoriales antes y pensé que era una forma bastante bárbara, parece que deshabilita ADC por completo, así que pensé que debería haber método diferente Pero parece que esto realmente funciona bien.
Sea bienvenido a publicar la respuesta si hay una forma más elegante de hacerlo, ya que creo que usar HAL_ADC_Stop () es bastante horrible, pero se puede usar con fines de aprendizaje.
fuente
Me gustaría agregar que para mi configuración (nucleo-h743) no fue suficiente para configurar:
También tuve que habilitar la configuración de desbordamiento también:
Sin esto, HAL_ADC_PollForConversion seguía bloqueándose. No entiendo completamente por qué esto era necesario, pero me permite sondear en modo continuo.
fuente
Esto funciona para mí, espero que ayude:
fuente