Estou tentando aprender como usar a "nova" biblioteca HAL do stm32.
Quando tento fazer uma conversão ADC simples, ele funciona apenas uma vez, mas pára de ser convertido. Suponho que o sinalizador de final de conversão não seja definido. Estou usando a placa Discovery STM32f429I, que possui a placa STM32f429ZI.
Observe que eu sei que o sprintf é uma prática ruim e adc com interrupção é melhor, eu sei que, por favor, não aponte isso, isso não é relevante para a pergunta, estou testando o HAL aqui.
Portanto, a pergunta é por que o sinalizador EOC não está definido ou o que eu poderia fazer para fazê-lo funcionar? O Google não está ajudando muito, já que existem poucos materiais bons sobre o HAL por aí.
Aqui está o 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);
}
Também criei o projeto com o CubeMX, a configuração adc é a seguinte:
EDIT 1
Tentei depurar tudo e parece que o programa fica preso na verificação do sinalizador EOC - ele vê que não é mostrado e, portanto, emite um temporizador aguardando o EOC aparecer (mas nunca é definido) Aqui está o código em que ele fica preso no 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;
}
}