Próbuję nauczyć się korzystać z „nowej” biblioteki HAL ze stm32.
Kiedy próbuję wykonać prostą konwersję ADC, działa to tylko raz, ale potem przestaje konwertować. Przypuszczam, że flaga końca konwersji nie została ustawiona. Korzystam z płyty Discovery STM32f429I, która ma na pokładzie STM32f429ZI.
Zauważ, że wiem o tym, że sprintf jest złym ćwiczeniem, a robienie adc z przerwaniem jest lepsze. Wiem, że nie zaznaczaj tego, to nie ma znaczenia dla pytania, właśnie testuję tutaj HAL.
Pytanie brzmi zatem, dlaczego flaga EOC nie jest ustawiona lub co mogę zrobić, aby działała? Googling niewiele pomaga, ponieważ niewiele jest dobrych materiałów na temat HAL.
Oto kod:
__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);
}
Stworzyłem również projekt z CubeMX, konfiguracja ADC jest następująca:
EDYCJA 1
Próbowałem wszystko debugować i wydaje się, że program utknął w sprawdzaniu flagi EOC - widzi, że nie jest pokazywany, a zatem wystawia czas oczekiwania na pojawienie się EOC (ale nigdy się nie ustawia) Oto kod, w którym utknął w debuggerze:
/* 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;
}
}