Ich versuche zu lernen, wie man "neue" HAL-Bibliothek von stm32 verwendet.
Wenn ich versuche, eine einfache ADC-Konvertierung durchzuführen, funktioniert dies nur einmal, aber dann wird die Konvertierung beendet. Ich nehme an, das Flag für das Ende der Konvertierung wird nicht gesetzt. Ich verwende das STM32f429I Discovery Board, das STM32f429ZI an Bord hat.
Beachten Sie, dass ich weiß, dass Sprintf eine schlechte Übung ist und dass es besser ist, ADC mit Interrupt zu erstellen. Ich weiß, dass dies bitte nicht darauf hinweist. Dies ist für die Frage nicht relevant. Ich teste hier nur HAL.
Die Frage ist also, warum das EOC-Flag nicht gesetzt ist oder was ich tun kann, damit es funktioniert. Googeln hilft nicht viel, da es nur sehr wenige gute Materialien über HAL gibt.
Hier ist der 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);
}
Ich habe das Projekt auch mit CubeMX erstellt. Die ADC-Konfiguration lautet wie folgt:
BEARBEITEN 1
Ich habe versucht, alles zu debuggen, und es scheint, dass das Programm nicht mehr nach dem EOC-Flag sucht - es sieht, dass es nicht angezeigt wird, und gibt daher einen Timer aus, der darauf wartet, dass das EOC angezeigt wird (aber es wird nie gesetzt). Hier ist der Code, in dem es angezeigt wird bleibt im Debugger stecken:
/* 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;
}
}