STM32F4 discovery unter Linux

OP #2684669
Lesenswert?
• ▲
▼
Hi!
Ich versuche seit einiger Zeit, das STM32F4 Discovery board unter Linux 
zum Laufen zu bekommen. Zum Glück gibt es dazu das Tutorial hier:
http://www.mikrocontroller.net/articles/STM32F4-Discovery

Prinzipiell hat (mit kleineren Schwierigkeiten) alles soweit geklappt. 
Ich hab inzwischen auch st-link und den compiler erfolgreich kompiliert 
und kann sie per Konsole aufrufen.

Jetzt habe ich das blink-Programm aus dem Tutorial kopiert und wollte es 
kompilieren, aber dann kommt immer so ein dummer Fehler:
undefined reference to `assert_param'

und das, obwohl ich oben im header der main.c noch die config-File 
einbinde
#include "stm32f4xx_conf.h",
in der assert_param wie im Tutorial beschrieben eingebunden wird.
was mache ich denn noch falsch?!

Viele Grüße,
Michael
OP #2685214
Lesenswert?
• ▲
▼
naja, eigentlich sollte das alles passen. ich zeig dir mal meine main.c:

1
#include "stm32f4xx.h"
2
#include "stm32f4xx_conf.h"
3
GPIO_InitTypeDef  GPIO_InitStructure;
4

5
void Delay(__IO uint32_t nCount) {
6
  while(nCount--) {
7
  }
8
}
9

10
int main(void) {
11
  /* GPIOD Periph clock enable */
12
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
13

14
  /* Configure PD12, 13, 14 and PD15 in output pushpull mode */
15
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
16
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
17
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
18
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
19
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
20
  GPIO_Init(GPIOD, &GPIO_InitStructure);
21

22
  while (1) {
23
    /* Set PD12 Green */
24
    GPIOD->BSRRL = GPIO_Pin_12;
25
    /* Reset PD13 Orange, PD14 Red, PD15 Blue */
26
    GPIOD->BSRRH = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
27
    Delay(10000000L);
28

29
    /* Set PD13 Orange */
30
    GPIOD->BSRRL = GPIO_Pin_13;
31
    /* Reset PD12 Green, PD14 Red, PD15 Blue */
32
    GPIOD->BSRRH = GPIO_Pin_12 | GPIO_Pin_14 | GPIO_Pin_15;
33
    Delay(10000000L);
34

35
    /* Set PD14 Red */
36
    GPIOD->BSRRL = GPIO_Pin_14;
37
    /* Reset PD12 Green, PD13 Orange, PD15 Blue */
38
    GPIOD->BSRRH = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_15;
39
    Delay(10000000L);
40

41
    /* Set PD15 Blue */
42
    GPIOD->BSRRL = GPIO_Pin_15;
43
    /* Reset PD12 Green, PD13 Orange, PD14 Red */
44
    GPIOD->BSRRH = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14;
45
    Delay(10000000L);
46
  }
47
}
und die stm32f4xx_conf.h (eigentlich alles nur aus dem tut kopiert)
1
#ifndef __STM32F4xx_CONF_H
2
#define __STM32F4xx_CONF_H
3

4
/* Includes ------------------------------------------------------------------*/
5
/* Uncomment the line below to enable peripheral header file inclusion */
6
// #include "stm32f4xx_adc.h"
7
// #include "stm32f4xx_can.h"
8
// #include "stm32f4xx_crc.h"
9
// #include "stm32f4xx_cryp.h"
10
// #include "stm32f4xx_dac.h"
11
// #include "stm32f4xx_dbgmcu.h"
12
// #include "stm32f4xx_dcmi.h"
13
// #include "stm32f4xx_dma.h"
14
// #include "stm32f4xx_exti.h"
15
// #include "stm32f4xx_flash.h"
16
// #include "stm32f4xx_fsmc.h"
17
// #include "stm32f4xx_hash.h"
18
#include "stm32f4xx_gpio.h"
19
// #include "stm32f4xx_i2c.h"
20
// #include "stm32f4xx_iwdg.h"
21
// #include "stm32f4xx_pwr.h"
22
#include "stm32f4xx_rcc.h"
23
// #include "stm32f4xx_rng.h"
24
// #include "stm32f4xx_rtc.h"
25
// #include "stm32f4xx_sdio.h"
26
// #include "stm32f4xx_spi.h"
27
// #include "stm32f4xx_syscfg.h"
28
// #include "stm32f4xx_tim.h"
29
// #include "stm32f4xx_usart.h"
30
// #include "stm32f4xx_wwdg.h"
31
// #include "misc.h"
32

33
#ifdef  USE_FULL_ASSERT
34
  #define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))
35
  void assert_failed(uint8_t* file, uint32_t line);
36
#else
37
  #define assert_param(expr) ((void)0)
38
#endif
39

40
#endif
OP #2687104
Lesenswert?
• ▲
▼
aber das kann doch nicht die allgemeine Lösung sein?! der erstellt die 
makefile ja bei jedem build neu, das heißt dass ich jedesmal manuell die 
makefile ändern soll und dann manuell builden soll?! abgesehen davon 
funktioniert das grade auch nicht, vielleicht bin ich einfach zu dumm 
das an die richtige stelle in der make zu packen.
was hat es eigentlich mit dieser stm32f4xx_conf.h auf sich, braucht man 
die stm32f4xx.h UND die stm32f4xx_conf.h in der main.c? Laut dem 
tutorial includet der ja nur die stm32f4xx.h

sry, ich checks nicht ;)
#2687155
Lesenswert?
• ▲
▼
Hmm,
Reihenfolgenproblem?

Wenn das Makro nach der verwendenden Stelle in irgendeinem Header 
(inline Funktionen) benutzt wird, dann wird es nicht mehr ersetzt und 
bleibt als echter Funktionsaufruf im Code.

Zieh das Makro testweise mal vor alle Includes
1
#ifdef  USE_FULL_ASSERT
2
  #define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))
3
  void assert_failed(uint8_t* file, uint32_t line);
4
#else
5
  #define assert_param(expr) ((void)0)
6
#endif
7

8

9
#include "stm32f4xx.h"
10
#include "stm32f4xx_conf.h"
11
...

Auch kommt mir die Reihenfolge der Header hier etwas seltsam vor.
#2687414
Lesenswert?
• ▲
▼
Ich hatte das Problem auch, allerdings beim STM32F2 was aber keinen 
Unterschied machen sollte.

Ich habe mir dann damit beholfen, die "stm32f2xx_conf.h" bzw. 
"stm32f4xx_conf.h" in den einzelnen Library Files noch mit zu includen.

Du benutzt ja z.B. die GPIO&RCC Lib...demzufolge müsste es reichen, in 
der "stm32f4xx_gpio.c" und in der "stm32f4xx_rcc.c" die 
"stm32f4xx_conf.h" zu includen, da in dieser die assert Makros definiert 
sind.

Es müssten Dir ansonnsten auch Meldungen ausgespuckt werden, in welchem 
File es zu den Fehlern kommt.


Wie das aber korrekt gemacht wird weiss ich auch nicht...mir hat es 
damals so gereicht. Aber so ganz im Sinne des Erfinders kann das ja 
nicht sein, da es sich um die fertige ST Lib handelt. Das man da manuell 
noch *.h Files includen muss wird sicherlich auch eleganter zu lösen 
sein, aber so hats bei mir funktioniert

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.