J'essaie d'apprendre à utiliser la "nouvelle" bibliothèque HAL de stm32.
Lorsque j'essaie de faire une conversion ADC simple, cela ne fonctionne qu'une seule fois, mais il arrête la conversion. Je suppose que l'indicateur de fin de conversion n'est pas défini. J'utilise la carte Discovery STM32f429I, qui a à bord STM32f429ZI.
Notez que je sais que sprintf est une mauvaise pratique et que faire adc avec interruption est meilleur, je sais que, veuillez ne pas le signaler, ce n'est pas pertinent pour la question, je teste juste HAL ici.
La question est donc de savoir pourquoi le drapeau EOC n'est pas défini ou que puis-je faire pour le faire fonctionner? La recherche sur Google n'aide pas beaucoup, car il existe très peu de bons documents sur HAL.
Voici le code:
__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);
}
J'ai également créé le projet avec CubeMX, la configuration adc est la suivante:
EDIT 1
J'ai essayé de tout déboguer et il semble que le programme reste bloqué dans la vérification du drapeau EOC - il voit qu'il n'est pas affiché et émet donc un temporisateur en attendant que EOC apparaisse (mais il n'est jamais défini) Voici le code où il se coince dans le débogueur:
/* 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;
}
}