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;
}
}
la source
#define ADC_EOC_SEQ_CONV ((uint32_t)0x00000000)
définies et qui est identique à désactivé, donc désactivé est en fait ADC_EOC_SEQ_CONV.Hm ... J'ai trouvé quelques tutoriels qui ont utilisé HAL_ADC_Stop (& hadc1) pour terminer la conversion ... Je regardais ces tutoriels avant et je pensais que c'était plutôt barbare, il semble qu'il désactive complètement ADC, donc je pensais qu'il devrait y avoir méthode différente. Mais il semble que cela fonctionne bien.
Soyez les bienvenus pour poster une réponse s'il existe une manière plus élégante de le faire, car je pense que l'utilisation de HAL_ADC_Stop () est assez horrible, mais peut être utilisée à des fins d'apprentissage.
la source
Je voudrais ajouter que pour ma configuration (nucleo-h743) il ne suffisait pas de régler:
J'ai également dû activer le paramètre de dépassement:
Sans cela, HAL_ADC_PollForConversion bloquait toujours. Je ne comprends pas très bien pourquoi cela était nécessaire mais cela me permet d'interroger en mode continu.
la source
Cela fonctionne pour moi, j'espère que cela vous aidera:
la source