Forum: Compiler & IDEs STM8 Standard Peripheral Library mit ST Visual Develop benutzen - Linker error


von Max M. (maxmicr)


Angehängte Dateien:

Lesenswert?

Hallo,

ich versuche aktuell, die Standard Peripheral Library von STM mit ST 
Visual Develop und dem Cosmic C Compiler zu benutzen.

Insbesondere bin ich gerade dabei, die SPI Schnittstelle zu 
initialisieren. Dafür hab ich die Header-Dateien der Lib in den Ordner 
'Include Files' und auch die aktuelle .c - Datei unter 'Source Files' 
hinzugefügt (siehe Bild)
Das hier hab ich auch gemacht:
1
#include <stm8s_spi.h>

Trotzdem bekomme ich beim Aufrufen der Funktion SPI_DeInit diesen 
Linker-Error:
1
Running Linker
2
clnk -m Debug\adxl345_spi.map -l"C:\Program Files (x86)\COSMIC\FSE_Compilers\Lib"  -o Debug\adxl345_spi.sm8 Debug\adxl345_spi.lkf 
3
#error clnk Debug\adxl345_spi.lkf:1 symbol _assert_failed not defined (Debug\stm8s_spi.o )
4
 The command: "clnk -m Debug\adxl345_spi.map -l"C:\Program Files (x86)\COSMIC\FSE_Compilers\Lib"  -o Debug\adxl345_spi.sm8 Debug\adxl345_spi.lkf " has failed, the returned value is: 1
5
exit code=1.

Wisst ihr, woran das liegt? Im Internet gibt es allgemein sehr wenig 
Dokus über ST Visual Develop.

von hp-freund (Gast)


Lesenswert?

Max M. schrieb:
> symbol _assert_failed not defined

gibt es da eine Definition wie ASSERT oder FULL_ASSERT ?

von Max M. (maxmicr)


Lesenswert?

hp-freund schrieb:
> gibt es da eine Definition wie ASSERT oder FULL_ASSERT ?

Hi,

meinst du in meinem Code oder in der SPI.h oder SPI.c?

In der SPI.c gibt es nur assert_param, kein Full_assert. in der 
SPI.h gibt es gar kein assert.

von hp-freund (Gast)


Lesenswert?

Wird in einer adxl345_spi.* Quelldatei ein #ifdef o.ä. verwendet?
Häng die Quell-/Headerdatei am Besten mal an.

von Max M. (maxmicr)


Angehängte Dateien:

Lesenswert?

Danke für deine Mühe,

Das adxl345_spi ist mein Projektname. Ich verwende kein *#ifdef*.
SPI Quell- und Headerdateien sind angehängt.

: Bearbeitet durch User
von hp-freund (Gast)


Lesenswert?

Ich schätze das assert_param das Problem ist.
Beim STM32 wird das in der jeweiligen *.h so definiert:
1
/* Exported macro ------------------------------------------------------------*/
2
#ifdef  USE_FULL_ASSERT
3
/**
4
  * @brief  The assert_param macro is used for function's parameters check.
5
  * @param  expr: If expr is false, it calls assert_failed function
6
  *         which reports the name of the source file and the source
7
  *         line number of the call that failed. 
8
  *         If expr is true, it returns no value.
9
  * @retval None
10
  */
11
  #define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))
12
/* Exported functions ------------------------------------------------------- */
13
  void assert_failed(uint8_t* file, uint32_t line);
14
#else
15
  #define assert_param(expr) ((void)0)
16
#endif /* USE_FULL_ASSERT */

Gibt es ähnliches beim STM8?

von Max M. (maxmicr)


Lesenswert?

hp-freund schrieb:
> Ich schätze das assert_param das Problem ist.

Hm,
aber in der SPI_DeInit Funktion befindet sich kein assert_param (es 
wird ja auch kein Parameter übergeben).

hp-freund schrieb:
> Gibt es ähnliches beim STM8?

Wenn ich das wüsste :(

von hp-freund (Gast)


Lesenswert?

Durchsuche mal alle Header Dateien nach assert.
Irgenwo muss etwas definiert sein.

von Max M. (maxmicr)


Angehängte Dateien:

Lesenswert?

In der *stm8s_conf.h* hab ich Full_assert gefunden (datei angehängt).
1
#define USE_FULL_ASSERT    (1) 
2
3
/* Exported macro ------------------------------------------------------------*/
4
#ifdef  USE_FULL_ASSERT
5
6
/**
7
  * @brief  The assert_param macro is used for function's parameters check.
8
  * @param expr: If expr is false, it calls assert_failed function
9
  *   which reports the name of the source file and the source
10
  *   line number of the call that failed.
11
  *   If expr is true, it returns no value.
12
  * @retval : None
13
  */
14
#define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))
15
/* Exported functions ------------------------------------------------------- */
16
void assert_failed(uint8_t* file, uint32_t line);
17
#else
18
#define assert_param(expr) ((void)0)
19
#endif /* USE_FULL_ASSERT */
20
21
#endif /* __STM8S_CONF_H */

Die wird durch die *stm8s.h* hinzugefügt:
1
#ifdef USE_STDPERIPH_DRIVER
2
 #include "stm8s_conf.h"
3
#endif

: Bearbeitet durch User
von hp-freund (Gast)


Lesenswert?

Müsste man also sehen was _assert_failed sein soll und von wo das 
aufgerufen wird.
Gibt es in meinen aktuellen STM32 Projekt übrigens auch nicht, nur die 
assert_failed Funktion aus der *conf.h wie bei deiner.

von hp-freund (Gast)


Lesenswert?

Wenn Du assert erst einmal nicht nutzen möchtest, könntest Du auch 
einfach das:

#define USE_FULL_ASSERT    (1)

auskommentieren.

von Max M. (maxmicr)


Lesenswert?

Danke, das auskommentieren hat geholfen!
Allerdings hab ich nun eine Frage wegen SPI:
Beim Senden von Daten überprüfe ich vorher, ob das *TXE*-Flag gesetzt 
ist:
1
  while(SPI_GetFlagStatus(SPI_FLAG_TXE) == RESET){
2
    nop(); //wait until transmit buffer is empty
3
  }

Das müsste doch so passen da ich eben solange warte, bis das Register 
leer ist dafür muss das der Wert von SPI_GetFlagStatus ja falsch, also 
RESET sein, oder? Leider bleibt mein Program auf ewig darin hängen.

: Bearbeitet durch User
von honk (Gast)


Lesenswert?

Da fehlt eine Timeout-Funktionalität und ggf. Fehlerbehandlung.

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.