Forum: Mikrocontroller und Digitale Elektronik STM32F0 Fehler: "_ansi.h: No such file or directory"


von Luca E. (derlucae98)


Angehängte Dateien:

Lesenswert?

Hallo,

ich beschäftige mich gerade mit einem STM32F0 Discovery Board und bin 
dabei, ein einfaches LED-Blinkprogramm zu schreiben. Dazu habe ich das 
Tutorial im 
https://www.mikrocontroller.net/articles/STM32_CooCox_Installation
durchgeführt und auf das STM32F0 Board adaptiert. Das funktioniert auch 
schon.
Um das Setzen der Ausgänge zu vereinfachen habe ich eine Funktion 
erstellt. Dieser Funktion übergebe ich den Pin, den ich setzen möchte, 
und den Wert. In der Funktion wird die Pinnummer in einen Dezimalwert 
umgewandelt und dem Set- bzw. Resetregister übergeben.
Für die Funktion pow(2, pin) benötige ich die Math.h.

CooCox meckert jetzt aber, dass er "_ansi.h" nicht finden kann.

Wie kann ich den Fehler beheben? Gibt es eventuell eine andere 
Möglichkeit das Setzen der Pins zu vereinfachen?

Hier der Code:

1
#include "stm32f0xx.h"
2
#include "math.h"
3
4
void Delay (int a);
5
void setOutC (int pin, int val);
6
7
int main(void)
8
{
9
10
  RCC->AHBENR |= RCC_AHBENR_GPIOCEN; // Clock für Port C aktivieren
11
12
      GPIOC->MODER = 0x55555555; // PINC.0 .. PINC.15 als Ausgang definieren
13
14
      while(1) // Endlosschleife
15
      {
16
          setOutC(9,0); //Funktionsaufruf: PINC.9 = 0
17
          setOutC(8,0); //Funktionsaufruf: PINC.8 = 0
18
        //GPIOC->BRR = 0b0000001100000000; // Alle LEDs aus
19
          Delay(500000);
20
          setOutC(8,1); //Funktionsaufruf: PINC.8 = 1
21
          //GPIOC->BSRR = 0b0000001000000000; // LED 1 ein
22
          Delay(500000);
23
          setOutC(9,1); //Funktionsaufruf: PINC.9 = 1
24
          //GPIOC->BSRR = 0b0000000100000000; // LED 2 ein
25
          Delay(500000);
26
27
      }
28
}
29
30
// Delay
31
void Delay (int a)
32
{
33
    volatile int i,j;
34
35
    for (i=0 ; i < a ; i++)
36
    {
37
        j++;
38
    }
39
40
    return;
41
}
42
43
void setOutC (int pin, int val)
44
{
45
  if(val==0){
46
    GPIOC->BRR = pow(2,pin);
47
  } else if(val==1) {
48
    GPIOC->BSRR = pow(2,pin);
49
  }
50
  return;
51
}

Info: Ich bin absoluter C-Neuling. (Habe nur etwas Erfahrung in Java)

Danke im Voraus!

von John Doe (Gast)


Lesenswert?

Das ist Humbug:

GPIOC->BRR = pow(2,pin);

Mit pow geht das nicht.
Lies mal erst ein C-Tutorial...

von Jim M. (turboj)


Lesenswert?

Luca E. schrieb:
> Für die Funktion pow(2, pin) benötige ich die Math.h.

Wenn Du stattdessen
1
 1<< pin;
nimmst, dann brauchts auch keine "math.h" und das Ergebnis ist um 
Größenordnungen schneller. Ich vermisse ansonsten die Float-ABI Optionen 
für GCC, keine Ahnung ob soft-float der Default bei ARM Cortex-M0 ist.

von Christian J. (Gast)


Lesenswert?

Luca E. schrieb:

> Info: Ich bin absoluter C-Neuling.

Sieht man. Besser mit Basiswissen in C anfangen, Stichwort 
Bit-Operationen.

Und für math.h braucht es die Linker Option -lm und die Definition, 
welches FP Modell verwendet werden soll, gibt da recht viele. Beim FP 
ganz sicher Soft-FP.

math.h braucht aber hier keiner.

von Luca E. (derlucae98)


Lesenswert?

Jim M. schrieb:
> Wenn Du stattdessen
> 1<< pin;
> nimmst

Danke, das funktioniert.

John Doe schrieb:
> Lies mal erst ein C-Tutorial...

Ja, das werde ich tun.

Aktuell habe ich das Problem, das ich das Board nicht mehr programmiert 
bekomme... "Error: Connect failed, check config and cable connection"
Der ST-Link wird im Gerätemanager angezeigt, an der Config habe ich 
nichts verändert und ist mit der aus dem Tutorial identisch...

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.