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;
}
}
quelle
#define ADC_EOC_SEQ_CONV ((uint32_t)0x00000000)
diese sind identisch mit deaktiviert, daher ist deaktiviert tatsächlich ADC_EOC_SEQ_CONV.Hm ... Ich habe einige Tutorials gefunden, die HAL_ADC_Stop (& hadc1) verwendet haben, um die Konvertierung zu beenden ... Ich habe mir diese Tutorials zuvor angesehen und dachte, dass dies ein ziemlich barbarischer Weg ist. Es scheint, dass ADC vollständig deaktiviert wird, also sollte es das geben andere Methode. Aber es scheint, dass dies tatsächlich gut funktioniert.
Sie können gerne eine Antwort posten, wenn es eine elegantere Möglichkeit gibt, dies zu tun, da ich die Verwendung von HAL_ADC_Stop () für ziemlich schrecklich halte, aber für Lernzwecke verwendet werden kann.
quelle
Ich möchte hinzufügen, dass es für mein Setup (Nucleo-h743) nicht ausreichte, Folgendes festzulegen:
Ich musste auch die Überlaufeinstellung aktivieren:
Ohne dies blockierte die HAL_ADC_PollForConversion immer noch. Ich verstehe nicht ganz, warum dies notwendig war, aber es erlaubt mir, im kontinuierlichen Modus abzufragen.
quelle
Das funktioniert bei mir, hoffe es hilft:
quelle