Ich möchte in meinem adc.c file die Funktion des ADC
static HAL_StatusTypeDef ADC_Enable(ADC_HandleTypeDef* hadc) im #include
"stm32f0xx_hal_adc.h"
nutzen.
Jetzt ist die aber als static definiert und ich bekomme die Meldung
implicit declaration of function "ADC_Enable" is invalid in C 99
Das liegt am static..
Wie kann ich die Func nutzen?
Das Schlüsselwort static signalisiert, dass du sie nicht benutzen
sollst. Wenn du meinst, dich darüber hinweg setzen zu können, dann nimm
das Wort raus. Ich würde es nicht tun.
Stefanus F. schrieb:> Das Schlüsselwort static signalisiert, dass du sie nicht benutzen> sollst. Wenn du meinst, dich darüber hinweg setzen zu können, dann nimm> das Wort raus. Ich würde es nicht tun.
Ich frag mich, warum man dann so eine Funktion überhaupt schreibt, wenn
man sie sowieso nicht nutzen darf/soll..
Die Funktion __HAL_ADC_ENABLE(_HANDLE_) darf ich so auch nicht direkt
nutzen, da ich sonst ein paar Regeln
Software must write to the ADCAL and ADEN bits in the ADC_CR register if
the ADC is disabled (ADEN must be 0).Software must only write to the
ADSTART and ADDIS bits in the ADC_CR register only if the ADC is enabled
and there is no pending request to disable the ADC (ADEN = 1 and ADDIS =
0). For all the other control bits in the ADC_IER, ADC_CFGRi, ADC_SMPR,
ADC_TR, ADC_CHSELR and ADC_CCR registers, software must only write to
the configuration control bits if the ADC is enabled (ADEN = 1) and if
there is no conversion ongoing (ADSTART = 0).Software must only write to
the ADSTP bit in the ADC_CR register if the ADC is enabled (and possibly
converting) and there is no pending request to disable the ADC (ADSTART
= 1 and ADDIS = 0)
verletze.
Also muss ich doch mühselig eigene Funktionen dafür schreiben?
Seppl schrieb:> Ich frag mich, warum man dann so eine Funktion überhaupt schreibt, wenn> man sie sowieso nicht nutzen darf/soll..
Weil sie intern von mindestesn einer anderen Funktion in der selben *.c
Datei als Unterfunktion benutzt wird.
Das macht Sinn, z.B. um das Kopieren gleicher Code-Abschnitte zu
vermeiden oder um den Quelltext übersichtlicher zu gestalten (als alles
in eine Monster-Funktion zu packen).
> Also muss ich doch mühselig eigene Funktionen dafür schreiben?
So schwer ist das nicht. Ich hab's dreimal für drei unterschiedliche
STM32 Modelle gemacht. Einfach umsetzen, was da im Text steht. Wird
schon klappen.
Stefanus F. schrieb:> Das Schlüsselwort static signalisiert, dass du sie nicht benutzen> sollst.
Das ist widersinnig.
Entweder steht eine Funktion im Headerfile, dann ist dieser Eintrag
genau DAZU gedacht, daß man die Funktion von woanders her benutzen kann.
Wenn dem jedoch NICHT so ist, dann gehört so ein Eintrag gar nicht in
ein Headerfile.
Meine Meinung zu sowas kennst du ja: Es ist allemal besser, sich selbst
die benötigten Lowlevel-Treiber zu schreiben, die nach 'oben' hin
wirklich benutzbare Schnittstellen haben, als sich mit solchen
aufgeblähten Dingen wie HAL und Konsorten befassen zu müssen.
Man sieht es ja allenthalben (auch hier gerade), daß die Leute mehr mit
den Libs von ST zu kämpfen haben als mit der eigentlichen Hardware.
W.S.
Stefanus F. schrieb:> So schwer ist das nicht. Ich hab's dreimal für drei unterschiedliche> STM32 Modelle gemacht. Einfach umsetzen, was da im Text steht. Wird> schon klappen.
Käse.
Natürlich gibt es eine HAL API dafür, man braucht sie nur suchen.
Steht normalerweise übersichtlich im Header File drin.
in diesem Fall: stm32f0xx_hal_adc.h
und was finden wir da?
W.S. schrieb:> Man sieht es ja allenthalben (auch hier gerade), daß die Leute mehr mit> den Libs von ST zu kämpfen haben als mit der eigentlichen Hardware.
Warscheinlich ist es so dass plötzlich auch Leute zum Programmieren
kommen die es ohne HAL nie getan oder nie geschafft hätten.
Wen man mit HAL nicht glücklich wird kann man ja immer noch
als Alternative die SPL verwenden, wenn es der (hoffentlich
nicht so neue) Controller noch erlaubt bzw. ein SPL Interface
dafür zur Verfügung steht.
HAL Hater schrieb:> Stefanus F. schrieb:>> So schwer ist das nicht. Ich hab's dreimal für drei unterschiedliche>> STM32 Modelle gemacht. Einfach umsetzen, was da im Text steht. Wird>> schon klappen.>> Käse.>> Natürlich gibt es eine HAL API dafür, man braucht sie nur suchen.> Steht normalerweise übersichtlich im Header File drin.>> in diesem Fall: stm32f0xx_hal_adc.h>> und was finden wir da?>> HAL_ADC_Start_>> lauten.
Ja aber ich muss doch vor der Initialisierung den ADC enablen.
Start ist doch der Befehl, der die Konvertierung startet.
>Ja aber ich muss doch vor der Initialisierung den ADC enablen.>Start ist doch der Befehl, der die Konvertierung startet.
Schrecklich, nicht wahr!
Wo man das doch praktisch bei jedem µP und bei fast jeder Funktion
machen muss.
Seppl schrieb:> Ja aber ich muss doch vor der Initialisierung den ADC enablen.
Nein.
In der Init Funktion
HAL_ADC_Init
wird alles gemacht. Vieleicht musst du noch mit
HAL_ADC_ConfigChannel
etwas tun, das darfst du in der HAL Doku selbst ermitteln.
Als Anfänger kannst du dich einigermassen drauf verlassen das
das (die) API vollständig ist.
Mit
HAL_ADC_Start
läuft der ADC vor sich hin, mit
HAL_ADC_GetValue
holst du dir Messwerte ab.
HAL Hater schrieb:> In der Init Funktion> .......
Das ist die grobe Richtung.
Das Interface (die nicht statischen Funktionen) zeigen was
möglich ist, die HAL Doku beschreibt im Detail wie es geht.
Es ist sicherlich nicht falsch sich ein HAL-Beispiel dazu
anzusehen um nicht alles neu erfinden zu müssen.
HAL Hater schrieb:> Es ist sicherlich nicht falsch sich ein HAL-Beispiel dazu> anzusehen um nicht alles neu erfinden zu müssen.
Hier ist so ein Beispiel das in zwei (drei) Code-Fenstern
(siehe ab 9.) eigentlich alles beinhaltet was man tun muss
um zu einem ADC-Wert zu kommen.
https://visualgdb.com/tutorials/arm/stm32/adc/
Dass dieses Beispiel für einen STM32F407 gezeigt ist sollte
bei HAL eine sehr untergeordnete Rolle spielen.
W.S. schrieb:> Entweder steht eine Funktion im Headerfile, dann ist dieser Eintrag> genau DAZU gedacht, daß man die Funktion von woanders her benutzen kann.> Wenn dem jedoch NICHT so ist, dann gehört so ein Eintrag gar nicht in> ein Headerfile.
Ich war davon ausgegangen, dass er die Funktion in einer *.c Datei
gefunden hat. Static im Headerfile ergibt für mich auch keinen Sinn.
Stefanus F. schrieb:> Ich war davon ausgegangen, dass er die Funktion in einer *.c Datei> gefunden hat.
Hat er auch.
Stefanus F. schrieb:> Static im Headerfile ergibt für mich auch keinen Sinn.
Ist es auch.
Der TO hatte bis dahin nur noch nicht begriffen wie der HAL
zu verwenden ist.
Übrigens ist auch im *.c File (ziemlich am Anfang, "How to use
this driver) eine recht ausführliche Beschreibung zu finden wie
vorzugehen ist. Man müsste sie halt lesen und verstehen ....
Stefanus F. schrieb:> Static im Headerfile ergibt für mich auch keinen Sinn.
Natürlich könnte das Sinn machen!
(ob es das auch hier tut?)
Der Compiler wird ein solches static als implizite Aufforderung
annehmen, diese Funktion inline einzubinden. Ob er das dann auch tut,
ist eine andere Frage.