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?
1 | /* Exported functions --------------------------------------------------------*/
|
2 | |
3 | /* Initialization and de-initialization functions **********************************/
|
4 | HAL_StatusTypeDef HAL_ADC_Init(ADC_HandleTypeDef* hadc); |
5 | HAL_StatusTypeDef HAL_ADC_DeInit(ADC_HandleTypeDef *hadc); |
6 | void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc); |
7 | void HAL_ADC_MspDeInit(ADC_HandleTypeDef* hadc); |
8 | |
9 | /* Blocking mode: Polling */
|
10 | HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc); |
11 | HAL_StatusTypeDef HAL_ADC_Stop(ADC_HandleTypeDef* hadc); |
12 | HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef* hadc, uint32_t Timeout); |
13 | HAL_StatusTypeDef HAL_ADC_PollForEvent(ADC_HandleTypeDef* hadc, uint32_t EventType, uint32_t Timeout); |
14 | |
15 | /* Non-blocking mode: Interruption */
|
16 | HAL_StatusTypeDef HAL_ADC_Start_IT(ADC_HandleTypeDef* hadc); |
17 | HAL_StatusTypeDef HAL_ADC_Stop_IT(ADC_HandleTypeDef* hadc); |
18 | |
19 | /* Non-blocking mode: DMA */
|
20 | HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length); |
21 | HAL_StatusTypeDef HAL_ADC_Stop_DMA(ADC_HandleTypeDef* hadc); |
22 | |
23 | /* ADC retrieve conversion value intended to be used with polling or interruption */
|
24 | uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef* hadc); |
25 | |
26 | /* ADC IRQHandler and Callbacks used in non-blocking modes (Interruption and DMA) */
|
27 | void HAL_ADC_IRQHandler(ADC_HandleTypeDef* hadc); |
28 | void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc); |
29 | void HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef* hadc); |
30 | void HAL_ADC_LevelOutOfWindowCallback(ADC_HandleTypeDef* hadc); |
31 | void HAL_ADC_ErrorCallback(ADC_HandleTypeDef *hadc); |
32 | |
33 | /* Peripheral Control functions ***********************************************/
|
34 | HAL_StatusTypeDef HAL_ADC_ConfigChannel(ADC_HandleTypeDef* hadc, ADC_ChannelConfTypeDef* sConfig); |
35 | HAL_StatusTypeDef HAL_ADC_AnalogWDGConfig(ADC_HandleTypeDef* hadc, ADC_AnalogWDGConfTypeDef* AnalogWDGConfig); |
36 | |
37 | /* Peripheral State functions *************************************************/
|
38 | |
39 | uint32_t HAL_ADC_GetState(ADC_HandleTypeDef* hadc); |
40 | uint32_t HAL_ADC_GetError(ADC_HandleTypeDef *hadc); |
Lauter schöne nicht-statische Funktionen. Meiner groben Schätzung nach würde die gesuchte Funktion dann HAL_ADC_Start_ lauten.
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.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.