Sto cercando di imparare come utilizzare la "nuova" libreria HAL da stm32.
Quando provo a fare una semplice conversione ADC funziona solo una volta, ma poi smette di convertire. Suppongo che il flag di fine conversione non venga impostato. Sto usando la scheda Discovery STM32f429I, che ha STM32f429ZI a bordo.
Nota che so che lo sprint è una cattiva pratica e che è meglio fare adc con interrupt, lo so, per favore non sottolinearlo, questo non è rilevante per la domanda, sto solo testando HAL qui.
Quindi la domanda è: perché il flag EOC non è impostato o cosa posso fare per farlo funzionare? Googling non aiuta molto dal momento che pochissimi buoni materiali su HAL là fuori.
Ecco il codice:
__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);
}
Ho anche creato il progetto con CubeMX, la configurazione adc è la seguente:
EDIT 1
Ho provato a eseguire il debug di tutto e sembra che il programma sia bloccato nel controllo del flag EOC - vede che non viene mostrato e quindi genera un timer in attesa che venga visualizzato EOC (ma non viene mai impostato) Ecco il codice in cui si trova rimane bloccato nel debugger:
/* 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;
}
}