Forum: Mikrocontroller und Digitale Elektronik ADC funktion nutzen


von Seppl (Gast)


Lesenswert?

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?

von Stefan F. (Gast)


Lesenswert?

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.

von Seppl (Gast)


Lesenswert?

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?

von Stefan F. (Gast)


Lesenswert?

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.

von W.S. (Gast)


Lesenswert?

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.

von HAL Hater (Gast)


Lesenswert?

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.

von HAL Hater (Gast)


Lesenswert?

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.

von Seppl (Gast)


Lesenswert?

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.

von Sebastian S. (amateur)


Lesenswert?

>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.

von HAL Hater (Gast)


Lesenswert?

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.

von HAL Hater (Gast)


Lesenswert?

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.

von HAL Hater (Gast)


Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

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.

von HAL Hater (Gast)


Lesenswert?

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 ....

von Einer K. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.