Forum: Mikrocontroller und Digitale Elektronik Neues STM32 Tutorial


von Moritz M. (avrprogger)


Lesenswert?

Moin,

ich hab heute mal versucht ein Tutorail zu schreiben zum Thema STM32 und 
Em::Blocks, weil diese anscheinende immer beliebter/gefragter werden 
hier im Forum. Das ist natürlich erst der Anfang. Wie findet ihr das? 
Wünsche, Verbesserungen?

http://www.mikrocontroller.net/articles/STM32_-_Einstieg_mit_Em::Blocks

Moritz

von Patrick B. (p51d)


Lesenswert?

Mhm, geht es hier nur um die IDE oder um das Programmieren.
Bei letzterem würde mich der Aufwand etwas abschrecken, zumal es schon 
sehr gute Tutorials gibt:

http://diller-technologies.de/stm32.html
http://eliaselectronics.com/stm32f4-tutorials/
...
Hiermit habe ich es ohne weiteres geschaft (natülich mit den Beispielen 
aus der STD lib) innerhalb von 2 Monaten komplett von AVR und PIC auf 
STM32 umzusteigen, und auch auf verschiedenen Platformen sowie C und C++ 
zu programmieren...

von Moritz M. (avrprogger)


Lesenswert?

Hauptsächlich erstmal um die IDE und die Grundlagen, sprich StdLib, DSP 
Lib, und auch die USB Lib. Die "normale Peripherie" wird glaube ich 
schon recht häufig thematisiert und sollte für Neueinsteiger nicht so 
schwer sein. Außerdem noch so Sachen wie Programm aus dem RAM ausführen 
und so. Vllt. auch noch Ethernet. Mal sehn wie schnell das Projekt so 
voran geht.

Moritz

von Moritz M. (avrprogger)


Lesenswert?

PS: Der Aufwand ist gar nicht so groß, wenn man einmal alle Sachen 
runtergeladen hat und geordnet hat. Außerdem kann man in der Em::Blocks 
IDE auch Projekte als Template speichern. Ich schaffes ohne Problem so 
ein Grundgerüst wie im Tutorial in zwei Minuten zusammen zu kopieren.
Natürlich weis ich auch, dass das z.B. mit CooCox deutlich einfacher 
ist, aber dort werden nicht alle STM32 Controller unterstützt und der 
Code scheint mir immer etwas willkürlich zusammengewürfelt worden zu 
sein, aus verschiedenen Projekten, teilweise auch von unterschiedlichen 
ARM-Typen (Cortex M3 und M4). Außerdem habe ich noch kein Tutorial für 
Em::Blocks und STM32 gefunden.

Moritz

von Felix L. (flex)


Lesenswert?

Hallo,

ich bin auch gerade dabei mich in die STM32 Mikrocontroller mit 
EM:Blocks einzuarbeiten. Ich finde es super, dass es mal erklärt wird 
und ich bin gespannt auf weitere Beispielprojekte wie z.B. Timer, UART, 
I2C, ... .

Gruß
Felix

von holger (Gast)


Lesenswert?

>und ich bin gespannt auf weitere Beispielprojekte wie z.B. Timer, UART,
>I2C, ... .

Die findest du in den beiden anderen Links.
Oder hier:

http://mikrocontroller.bplaced.net/wordpress/?page_id=744

Das hat mit der IDE an sich erst mal nichts zu tun.

von Felix L. (flex)


Lesenswert?

holger schrieb:
> Die findest du in den beiden anderen Links.
> Oder hier:
>
> http://mikrocontroller.bplaced.net/wordpress/?page_id=744
>
> Das hat mit der IDE an sich erst mal nichts zu tun

Danke! So etwas habe ich schon lange gesucht.

Gruß

von Andreas H. (ahz)


Lesenswert?

Moritz M. schrieb:
> ich hab heute mal versucht ein Tutorail zu schreiben zum Thema STM32 und
> Em::Blocks, weil diese anscheinende immer beliebter/gefragter werden
> hier im Forum.

Hallo Moritz

Da hast Du einen klasse Job gemacht. n1 :-)

Em:blocks sieht wirklich nice aus und Dein Tutorial erklärt viele 
Details, die ich (auf den ersten Blick) im Tool selber nicht gesehen 
hatte.

Eine Frage: Hast Du die Wizards gefunden ? Lt. Website soll man die 
Erstellung neuer Projekte ja selbst skriptgesteuert machen können. Ich 
habe eben aber nirgends die existieren Buildskripte finden können.
Dann könnte das kopieren Deines "Frameworks" durch den Wizard gemacht 
werden.

Viele Grüße
Andreas

von ben (Gast)


Lesenswert?

Hi vielen Dank für das Tutorial.

ich habe gerade zwei Tage lang versucht die demo-projekte für das 
STM32F4Discovery auf Em::Blocks zum laufen zu bekommen, aber leider 
immer noch nicht hinbekommen. Dein Tutorial ist da eine sehr angenehme 
Alternative für den Einstieg.

von Moritz (Gast)


Lesenswert?

Andreas H. schrieb:
> Eine Frage: Hast Du die Wizards gefunden ? Lt. Website soll man die
> Erstellung neuer Projekte ja selbst skriptgesteuert machen können.

Moin,

Von eigenen script-gesteuerten wizards  habe ich nichts gelesen, nur 
davon, dass man eigene Projekte als Template speichern kann. Das kommt 
auch noch ins Tutorial, ist sehr einfach.

Moritz

von Uwe L. (ul5255)


Lesenswert?

Moritz,
bitte weitermachen. Die ARMs sind schon komplexer als AVRs. Ich habe 
mich auch fuer EM::Blocks entschieden und erste Sachen zum laufen 
gebracht. Allerdings war das ein ziemliches Herumsuchen... Mich wuerden 
auch sehr Beispiele zu USB und Ethernet interessieren, da habe ich mich 
noch garnicht herangetraut.

von Tom (Gast)


Lesenswert?

Hallo,
Schöner Artikel! Ich finde Em::Blocks auch prima. Gut, dass mal jemand 
Werbung dafür macht ;).
Da es ja vornehmlich um die IDE geht:
Ich fand den Wechsel zwischen den Editor-Fenstern gewöhnungsbedürftig. 
Bis ich auf die Einstellung "Environment settings/notebook 
appearence/use stacked based tab-switching" gestoßen bin.

Beste Grüße
Tom

von STMUser (Gast)


Lesenswert?

Hallo Moritz,
erstmal ein großes Lob an dich. Dein Artikel gefällt mir schon sehr gut 
und ich finde es gut eine Alternative zu CooCox zu haben. Welche Themen 
mich besonders interessieren würden ist die Integration von FPU und DSP. 
Also schon mal ein dickes Danke.

von Vilex (Gast)


Lesenswert?

So wie es aussieht ist das ganze nur für windows??
wie siehts aus mit Linux???

von Moritz M. (avrprogger)


Lesenswert?

Hallo,

Zurzeit wird nur Windows von Em::Blocks unterstützt.

Moritz

von Moritz M. (avrprogger)


Lesenswert?

Andreas H. schrieb:
> Eine Frage: Hast Du die Wizards gefunden ? Lt. Website soll man die
> Erstellung neuer Projekte ja selbst skriptgesteuert machen können. Ich
> habe eben aber nirgends die existieren Buildskripte finden können.
> Dann könnte das kopieren Deines "Frameworks" durch den Wizard gemacht
> werden.

Ich hab grade was dazu entdeckt: Im Projekt-Dialog gibt es per Rechts 
Klick auf einen Projekt-Typ die Möglichkeiten "Edit this script" und 
"Edit global registration script". Aber ich denke ich werde mich damit 
erstmal nicht beschäftigen, sondern erklären, wie es mit der "vanilla" 
Version von Em::Blocks geht.

Moritz

von Endlich! (Gast)


Lesenswert?

Hey! Danke schön!
Deinen Artikel hätte ich vor einer Woche gut gebrauchen können.
Habe nämlich die gleiche Arbeit auch gemacht.  Mir haben paar russische 
Seiten geholfen. Funktioniert echt gut diese IDE. Habe mit codeblocks 
gearbeitet und finde es gut. Läuft bei mir sowohl mit stlink als auch 
mit jlink. Ist echt eine super Alternative zu coocox, zumal sehr 
portabela, also ohne Installation ins System. Kann man gut auf USB-Stick 
mitnehmen...

von Moritz M. (avrprogger)


Lesenswert?

Schade. Da der Upload leider auf 50MB beschränkt ist, kann ich keine 
Beispiele mehr hochlanden. :(

Moritz

von Michi (Gast)


Lesenswert?

1
    GPIO_InitTypeDef GPIOD_InitStructure;
2
    GPIOD_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
3
    GPIOD_InitStructure.GPIO_Pin = GPIO_Pin_15;
4
    GPIO_Init(GPIOD, &GPIOD_InitStructure);

Man sollte entweder allen Komponenten der Struct einen Wert zuweisen 
oder die Stuct vorher mit default Werten füllen. Dafür gibt's 
x_StructInit.

z.b.
    GPIO_InitTypeDef GPIO_InitStructure;

    GPIO_StructInit(&GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
    GPIO_Init(GPIOD, &GPIO_InitStructure);

von markusDerBastler (Gast)


Lesenswert?

Erst einmal ein großes DANKE an Moritz. Mein STM32F4 Discoboard wäre 
sonst in der hintersten Schublade verstaubt.

Hab ein Problem mit der Taktfrequenz.
Deiner Anleitung zur Umstellung auf 168Mhz bin ich gefolgt.

Danach wollte ich das ganze mal testen und mal sehen, wie schnell der 
Pin wackeln kann.
Erstaunen: 2,24MHz.
Kann (darf) nicht sein, wären ja arduinoale Zustände (digitalwrite..).
Also mal den PLL_M Wert verkleinert. Der µC macht bis PLL_M 5 mit, dann 
steigt er aus. Funktioniert, zurück auf 8 gestellt.
Dann den HSE_VALUEvon 8 000 000 auf 25MHz gestellt: keine Änderung, egal 
welcher Wert drin ist. Zuletzt den HSEWert in die main.c genommen und 
dort verändert. Brachte auch nichts.
Ich vermute, dass der Prozessor weiter mit 53,76 MHz läuft.
Demnach braucht die unten stehende Routine 24 Zyklen um PD9 zu toggeln. 
Eigentlich hätte ich da weniger Zyklen erwartet, weil das Disassembling 
nur 8 Instruktionen pro Zyklus anzeigt.

Fragen:
1) warum bewirkt die Änderung von HSE_VALUE nichts, egal ob in der 
main.c oder in der stm32f4xx.h
2) gibt es eine andere Möglichkeit herauszufinden, wie schnell der Takt 
taktet.
3) in anderen Tutorien stand mal was davon, dass die Taktfrequenz der 
Peripherie eingestellt werden kann, warum musste das hier nicht 
erfolgen?
4) braucht ein toggeln wirklich 24 Taktzyklen?

1
#include "stm32f4xx.h"
2
#define HSE_VALUE    ((uint32_t)8000000)
3
int main(void)
4
{
5
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
6
7
    GPIO_InitTypeDef GPIOD_InitStructure;
8
    GPIOD_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
9
    GPIOD_InitStructure.GPIO_Pin = GPIO_Pin_9;
10
    GPIO_Init(GPIOD, &GPIOD_InitStructure);
11
    
12
    while(1)
13
    {
14
    GPIO_WriteBit(GPIOD, GPIO_Pin_9, Bit_SET);
15
    GPIO_WriteBit(GPIOD, GPIO_Pin_9, Bit_RESET);
16
    }
17
}

von Uwe B. (derexponent)


Lesenswert?

markusDerBastler schrieb:
> 1) warum bewirkt die Änderung von HSE_VALUE nichts, egal ob in der
> main.c oder in der stm32f4xx.h

wahrscheinlich musst die "SystemInit()" noch aufgerufen werden

> 2) gibt es eine andere Möglichkeit herauszufinden, wie schnell der Takt
> taktet.

du kannst entweder die eingestellte Clockfreq auslesen
"RCC_GetClocksFreq()" oder an einem MCO-Pin ausgeben lassen

> 3) in anderen Tutorien stand mal was davon, dass die Taktfrequenz der
> Peripherie eingestellt werden kann, warum musste das hier nicht
> erfolgen?

wurde wohl vergessen

> 4) braucht ein toggeln wirklich 24 Taktzyklen?

mit deinem Funktionsaufruf schon, mach mal
1
GPIOD->ODR ^= GPIO_Pin_9; // toggelt Pin PD9

Uwe

: Bearbeitet durch User
von Moritz-avrprogger (Gast)


Lesenswert?

Hallo,ich stell nachher nochmal ein Testprogramm rein, wo der systemtakt 
auf dem mco-pin ausgegeben wird.

Moritz

von markusDerBastler (Gast)


Lesenswert?

Uwe B. schrieb:
> mit deinem Funktionsaufruf schon, mach mal
> GPIOD->ODR ^= GPIO_Pin_9; // toggelt Pin PD9

Ok, danke.

Diese Var. benötigt pro Umschaltvorgang 8 Systicks, also 16 für 0->1 - 
1->0.
Ich messe 6,45MHz. Macht ne komische Taktfrequenz von 103,2MHz.(??)Die 
Hälfte wäre irgendwie  logischer.

Uwe B. schrieb:
> wahrscheinlich musst die "SystemInit()" noch aufgerufen werden

gibt Fehlermeldungen, da
1
extern void SystemInit(void);
2
extern void SystemCoreClockUpdate(void);
schon aus der system_stm32f4xx.h heraus aufgerufen werden.
Selbst wenn dieseFunktionsaufrufe auskommentiert werden und SystemInit() 
aus main.c aufgerufen wird, ändert sich nichts.

Vlt. kann ja der Autor dieses Tutorials mal kurz darüber schauen.

von Michi (Gast)


Lesenswert?

markusDerBastler schrieb:
> schon aus der system_stm32f4xx.h heraus aufgerufen werden.
> Selbst wenn dieseFunktionsaufrufe auskommentiert werden und SystemInit()
> aus main.c aufgerufen wird, ändert sich nichts.

nein in system_stm32f4xx.h werden die Funktionen deklariert.
Der Funktionsaufruf ist in startup_stm32f4xx.S

von markusDerBastler (Gast)


Lesenswert?

Dieser Code toggelt dagegen mit 15,26MHz.
1
while(1) // Endlos Schleife
2
    {
3
        GPIOD->BSRRH = 0xF000; // Alle LED's aus
4
        GPIOD->BSRRL = 0x1000; // LED 1 ein
5
    }

Warum?

von Michi (Gast)


Lesenswert?

>#define CORE_SysTickEn()    (*((u32*)0xE0001000)) = 0x40000001
>#define CORE_SysTickDis()   (*((u32*)0xE0001000)) = 0x40000000
>#define CORE_GetSysTick()   (*((u32*)0xE0001004))

die Adressen die du da definierst haben nichts mir Systick zu tun.
Die Base Addresse von Systick ist 0xE000E010.

Adresse 0xE0001000 ist DWT.

Wie es richtig geht steht u.a. hier: 
http://www.mikrocontroller.net/articles/STM32_f%C3%BCr_Einsteiger

Gerade in einem Einsteiger Tutorial sollte man nichts ungeprüft irgendwo 
her kopieren. Das stiftete nur unnötige Verwirrung.

von markusDerBastler (Gast)


Lesenswert?

Ich hatte eine SysTick Funktion eingabaut, diese aber hier nicht 
kopiert. Die braucht ja selbst auch paat Takte für den Aufruf und zum 
Berechnen selber, daher ist sie bezügl. des toggelns nicht sehr 
aussagekräftig.

von Moritz M. (avrprogger)


Lesenswert?

Moin,

hab eben mal weider bisschen am Tutorial rumgebastelt. Es gibt jetzt 
auch ein Beispiel, wo der geviertelte Systemtakt am Pin MCO2 / PC9 
ausgegeben wird. Bei mir kommen 41.98MHz raus (*4 = 167.92MHz). Könnt 
ihr ja mal ausprobieren.

Außerdem hab die zurecht kritisierte Initialisierung des Pin im Kapitel 
Standard Peripheral Library korrigiert.

Zur SystemInit();: diese wird eindeutig im Reset_Handler aufgerufen. 
(Einzelschritt / startup_stm32f4xx.S)

Das define HSE_VALUE dient nur einigen Funktionen (wie z.B. der 
RCC_GetClocksFreq()) die Taktfrequenzen aus den Registern zu BERECHNEN. 
Der Werte sollte also ruhig immer mit angepasst werden.

GPIO_ToggleBits() benötig bei mir 39 Takt Zyklen. (siehe Test-Verfahren 
bei der FPU.) Die Ausgeben der Taktzyklen dauert anscheinend 9 Takte.

Pin-Togglen in der while-Schleife komme ich auf eine Frequenz von 
2.332MHz

Gemessen so:
1
#include "stm32f4xx.h"
2
3
#define CORE_SysTickEn()    (*((u32*)0xE0001000)) = 0x40000001
4
#define CORE_SysTickDis()   (*((u32*)0xE0001000)) = 0x40000000
5
#define CORE_GetSysTick()   (*((u32*)0xE0001004))
6
7
uint32_t t1, t2, dt;
8
9
int main(void)
10
{
11
12
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
13
14
    GPIO_InitTypeDef GPIOC_InitStructure;
15
    GPIOC_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
16
    GPIOC_InitStructure.GPIO_OType = GPIO_OType_PP;
17
    GPIOC_InitStructure.GPIO_Pin = GPIO_Pin_9;
18
    GPIOC_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
19
    GPIOC_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
20
    GPIO_Init(GPIOC, &GPIOC_InitStructure);
21
22
    //-----------------------------------------------------------------
23
24
    CORE_SysTickEn();
25
    t1 = CORE_GetSysTick();
26
    t2 = CORE_GetSysTick();
27
    CORE_SysTickDis();
28
29
    dt = t2 - t1;
30
31
    //-----------------------------------------------------------------
32
33
    CORE_SysTickEn();
34
    t1 = CORE_GetSysTick();
35
36
    GPIO_ToggleBits(GPIOC, GPIO_Pin_9);
37
38
    t2 = CORE_GetSysTick();
39
    CORE_SysTickDis();
40
41
42
    dt = t2 - t1;
43
44
    //-----------------------------------------------------------------
45
46
47
    while(1)
48
    {
49
        GPIO_ToggleBits(GPIOC, GPIO_Pin_9);
50
    }
51
}


Moritz

von Sepp (Gast)


Lesenswert?

Vielen Dank für das Tutorial!

Nur eins sollte man evtl. auch noch erwähnen:

Startup File und Linker Script.

Wie oben schon mal erwähnt, wird SystemInit() im Startup File 
aufgerufen:
Zeile 212 im *.s:
1
#ifndef __NO_SYSTEM_INIT
2
    ldr    r0, =SystemInit
3
    blx    r0
4
#endif

von Moritz M. (avrprogger)


Lesenswert?

PS:
1
GPIOC->BSRRL |= GPIO_BSRR_BS_9;
braucht nur 13 Zyklen.

1
GPIOC->ODR ^= GPIO_Pin_9;
braucht nur 11 Zyklen
und ergibt 6.99MHz in der while-Schleife.

Moritz

: Bearbeitet durch User
von Sepp (Gast)


Lesenswert?

Das ging aber schnell :-)

Ich finde den Artikel sehr gelungen.

Viele Einsteiger werden sehr froh darüber sein und sich eine Menge Zeit 
sparen!
Warum hast Du denn den Artikel nicht schon vor 2 Monaten geschrieben :-)

von markusDerBastler (Gast)


Lesenswert?

Moritz M. schrieb:
> GPIOC->ODR ^= GPIO_Pin_9;
> braucht nur 11 Zyklen
> und ergibt 6.99MHz in der while-Schleife.

An dieser Stelle hab ich irgendwie ein komisches Gefühl.
In allen ASM / C Kampftreads tönt es unentwegt, dass der C Compiler den 
effektivsten Code generiert..bla bla blub.

Mein Atmega mit 16 MHz lässt den Pin mit 3,6 MHz in ASM toggeln.
Der STM32F4 mit 168 MHz schafft garade mal 7 Mhz?? DAS DOPPELTE??????? 
Mit hochgelobten supereffektiven C-Code??!!
Sagt dass das nicht wahr ist.

von Faster (Gast)


Lesenswert?

markusDerBastler schrieb:
> Sagt dass das nicht wahr ist.

Es ist nicht war. Nimm die richtigen Register und alles wird gut: BSRR 
und BRR.

Ein Überblick über die GPIO:
http://hertaville.com/2012/07/28/stm32f0-gpio-tutorial-part-1/

von holger (Gast)


Lesenswert?

>GPIOC->ODR ^= GPIO_Pin_9;
>
>braucht nur 11 Zyklen
>und ergibt 6.99MHz in der while-Schleife.

Gemessen sind das bei mir aber 11.9MHz -> 84ns.

Und so

  while(1)
  {
    GPIOD->BSRRH = GPIO_Pin_13;
    GPIOD->BSRRL = GPIO_Pin_13;
  }

Sind es 33MHz.

>Der STM32F4 mit 168 MHz schafft garade mal 7 Mhz?? DAS DOPPELTE???????

Blablaballerballer

von F. F. (foldi)


Lesenswert?

Ganz fein! Wenn ich mal diese Dinger nehmen will, werde ich zuerst dein 
Tutorial lesen.
Hab es mal überfolgen und es macht einen sinnigen Eindruck.
Vielen Dank für deine Mühen!

von markusDerBastler (Gast)


Lesenswert?

oder so:
1
 for (;;)
2
    {
3
        GPIOD->BSRRH = 0x1000; // LED grün PD12 ein
4
5
        GPIOD->BSRRL = 0x1000; // LED grün PD12 aus
6
    }

15,26 MHz

Warum,weshalb, wieso? Keine Ahnung - noch nicht. Bin gespannt auf das 
weitere Tutorium. Trotzdem mach "rumspielen" mit der Hardware vertraut. 
Der eine mag eine blinkende LED, der andere mag's etwas flotter;-)

Faster schrieb:
> Ein Überblick über die GPIO:
> http://hertaville.com/2012/07/28/stm32f0-gpio-tutorial-part-1/
>

Danke für den Link. Vlt eine gute Ergänzung.

von markusDerBastler (Gast)


Lesenswert?

Holger war schneller.
Trotzdem nicht 33. Naja. Warum macht der Compiler das nicht auch so?

von markusDerBastler (Gast)


Lesenswert?

Noch was.
Könnte man den mit dem Wissen wie Ausgangspins zu setzen und zu löschen 
sind, schon ein Character-LCD konfigurieren?
Wäre ja mal eine schöne Übung zum Kennen lernen.

von Faster (Gast)


Lesenswert?

markusDerBastler schrieb:
> Warum,weshalb, wieso? Keine Ahnung - noch nicht.

Hier wird das Register nur geschrieben und nicht vorher gelesen, 
verknüpft ...

markusDerBastler schrieb:
> Warum macht der Compiler das nicht auch so?

Das macht der Compiler doch, wenn du die richtigen Register angibst. ;-)

von Gibts N. (schneeblau)


Lesenswert?

Gerade die USB (Abseits von VCP) und DSP Libraries mit vielen Beispielen 
wären gut. Dazu findet man noch sehr wenige Tutorials.

von Moritz M. (avrprogger)


Lesenswert?

Moin,

DSP ist schon drin. USB und Ethernet muss ich mich selbst noch ein 
bisschen mehr einarbeiten. Dauert also noch ein bisschen.

Moritz

von Gibts N. (schneeblau)


Lesenswert?

Mal ne Frage, wahrscheinlich recht einfach zu klären:

Wenn ich ein neues Projekt erstelle, den Haken bei "Ust STD_Periph_Lib" 
drinne lasse, dann wird mir V1.0 mit in das Projekt eingebunden.

Ich ändere in der main.c nix, Build ist erfolgreich.


Nun dacht ich mir, ich ersetze im Projektordner die inc und src Dateien 
mit denen aus Version 1.3.


Nun geht aber der Build nichtmehr, er meckert in der 
SPL\src\stm32f4xx_cryp.c rum.

Wie lös ich das Problem?
1
||=== test3, Debug ===|
2
SPL\src\stm32f4xx_cryp.c||In function 'CRYP_PhaseConfig':|
3
SPL\src\stm32f4xx_cryp.c|376|error: 'CRYP_CR_GCM_CCMPH' undeclared (first use in this function)|
4
SPL\src\stm32f4xx_cryp.c|376|note: each undeclared identifier is reported only once for each function it appears in|
5
SPL\src\stm32f4xx_cryp.c||In function 'CRYP_SaveContext':|
6
SPL\src\stm32f4xx_cryp.c|541|error: 'CRYP_CR_GCM_CCMPH' undeclared (first use in this function)|
7
SPL\src\stm32f4xx_cryp.c|564|error: 'CRYP_TypeDef' has no member named 'CSGCMCCM0R'|
8
SPL\src\stm32f4xx_cryp.c|565|error: 'CRYP_TypeDef' has no member named 'CSGCMCCM1R'|
9
SPL\src\stm32f4xx_cryp.c|566|error: 'CRYP_TypeDef' has no member named 'CSGCMCCM2R'|
10
SPL\src\stm32f4xx_cryp.c|567|error: 'CRYP_TypeDef' has no member named 'CSGCMCCM3R'|
11
SPL\src\stm32f4xx_cryp.c|568|error: 'CRYP_TypeDef' has no member named 'CSGCMCCM4R'|
12
SPL\src\stm32f4xx_cryp.c|569|error: 'CRYP_TypeDef' has no member named 'CSGCMCCM5R'|
13
SPL\src\stm32f4xx_cryp.c|570|error: 'CRYP_TypeDef' has no member named 'CSGCMCCM6R'|
14
SPL\src\stm32f4xx_cryp.c|571|error: 'CRYP_TypeDef' has no member named 'CSGCMCCM7R'|
15
SPL\src\stm32f4xx_cryp.c|573|error: 'CRYP_TypeDef' has no member named 'CSGCM0R'|
16
SPL\src\stm32f4xx_cryp.c|574|error: 'CRYP_TypeDef' has no member named 'CSGCM1R'|
17
SPL\src\stm32f4xx_cryp.c|575|error: 'CRYP_TypeDef' has no member named 'CSGCM2R'|
18
SPL\src\stm32f4xx_cryp.c|576|error: 'CRYP_TypeDef' has no member named 'CSGCM3R'|
19
SPL\src\stm32f4xx_cryp.c|577|error: 'CRYP_TypeDef' has no member named 'CSGCM4R'|
20
SPL\src\stm32f4xx_cryp.c|578|error: 'CRYP_TypeDef' has no member named 'CSGCM5R'|
21
SPL\src\stm32f4xx_cryp.c|579|error: 'CRYP_TypeDef' has no member named 'CSGCM6R'|
22
SPL\src\stm32f4xx_cryp.c|580|error: 'CRYP_TypeDef' has no member named 'CSGCM7R'|
23
SPL\src\stm32f4xx_cryp.c||In function 'CRYP_RestoreContext':|
24
SPL\src\stm32f4xx_cryp.c|625|error: 'CRYP_TypeDef' has no member named 'CSGCMCCM0R'|
25
SPL\src\stm32f4xx_cryp.c|626|error: 'CRYP_TypeDef' has no member named 'CSGCMCCM1R'|
26
SPL\src\stm32f4xx_cryp.c|627|error: 'CRYP_TypeDef' has no member named 'CSGCMCCM2R'|
27
SPL\src\stm32f4xx_cryp.c|628|error: 'CRYP_TypeDef' has no member named 'CSGCMCCM3R'|
28
SPL\src\stm32f4xx_cryp.c|629|error: 'CRYP_TypeDef' has no member named 'CSGCMCCM4R'|
29
SPL\src\stm32f4xx_cryp.c|630|error: 'CRYP_TypeDef' has no member named 'CSGCMCCM5R'|
30
SPL\src\stm32f4xx_cryp.c|631|error: 'CRYP_TypeDef' has no member named 'CSGCMCCM6R'|
31
SPL\src\stm32f4xx_cryp.c|632|error: 'CRYP_TypeDef' has no member named 'CSGCMCCM7R'|
32
SPL\src\stm32f4xx_cryp.c|634|error: 'CRYP_TypeDef' has no member named 'CSGCM0R'|
33
SPL\src\stm32f4xx_cryp.c|635|error: 'CRYP_TypeDef' has no member named 'CSGCM1R'|
34
SPL\src\stm32f4xx_cryp.c|636|error: 'CRYP_TypeDef' has no member named 'CSGCM2R'|
35
SPL\src\stm32f4xx_cryp.c|637|error: 'CRYP_TypeDef' has no member named 'CSGCM3R'|
36
SPL\src\stm32f4xx_cryp.c|638|error: 'CRYP_TypeDef' has no member named 'CSGCM4R'|
37
SPL\src\stm32f4xx_cryp.c|639|error: 'CRYP_TypeDef' has no member named 'CSGCM5R'|
38
SPL\src\stm32f4xx_cryp.c|640|error: 'CRYP_TypeDef' has no member named 'CSGCM6R'|
39
SPL\src\stm32f4xx_cryp.c|641|error: 'CRYP_TypeDef' has no member named 'CSGCM7R'|
40
||=== Build finished: 35 errors, 0 warnings (0 minutes, 0 seconds) ===|
41
SPL\src\stm32f4xx_cryp_aes.c||In function 'CRYP_AES_GCM':|
42
SPL\src\stm32f4xx_cryp_aes.c|786|error: 'CRYP_CR_GCM_CCMPH_0' undeclared (first use in this function)|
43
SPL\src\stm32f4xx_cryp_aes.c|786|note: each undeclared identifier is reported only once for each function it appears in|
44
SPL\src\stm32f4xx_cryp_aes.c|834|error: 'CRYP_CR_GCM_CCMPH_1' undeclared (first use in this function)|
45
SPL\src\stm32f4xx_cryp_aes.c|896|error: 'CRYP_CR_GCM_CCMPH' undeclared (first use in this function)|
46
SPL\src\stm32f4xx_cryp_aes.c||In function 'CRYP_AES_CCM':|
47
SPL\src\stm32f4xx_cryp_aes.c|1342|error: 'CRYP_CR_GCM_CCMPH_0' undeclared (first use in this function)|
48
SPL\src\stm32f4xx_cryp_aes.c|1390|error: 'CRYP_CR_GCM_CCMPH_1' undeclared (first use in this function)|
49
SPL\src\stm32f4xx_cryp_aes.c|1453|error: 'CRYP_CR_GCM_CCMPH' undeclared (first use in this function)|

von Moritz M. (avrprogger)


Lesenswert?

Moin,

ich mach das so, dass ich die StdPeriphLib nicht über den Projekt Dialog 
einbinde, sondern in das Projekt kopiere. Dann hat man auch gleich die 
aktuelle Version (in den alten sind ein paar Bugs drin).

Moritz

von Gibts N. (schneeblau)


Angehängte Dateien:

Lesenswert?

Da kommt bei mir der gleiche Fehler:(

Bin so vorgegangen wie es im Wiki steht:

STM32F4xx_StdPeriph_Driver Ordner in meinen Projektordner kopiert.
stm32f4xx_conf.h in den inc Ordner des eben eingefügten Ordners einfügen
includepath  auf den inc Ordner in den build options hinzugefügt
USE_STDPERIPH_DRIVER bei #defines eingefügt
die restlichen Dateien außer die jeweils 4 genannten hinzugefügt


Im anhang mal mein Projekt, vielleicht fällt euch was auf bzw. ihr könnt 
testen ob der Fehler auch bei euch kommt.

von Moritz M. (avrprogger)


Lesenswert?

Ok, les dir am besten das Kapitel 
http://www.mikrocontroller.net/articles/STM32_-_Einstieg_mit_Em::Blocks#Das_erste_Projekt_erstellen 
durch. Das einbinden der StdPeriphLib basiert darauf. Einige Dateien 
darf du auch gar nich mit in das Projekt rein nehmen z.B. ltdc.c/c usw.

Moritz

von Gibts N. (schneeblau)


Lesenswert?

Nach der Anleitung bin ich ja vorgegangen. Ich habe gemerkt, dass die 
stm32f4xx_conf.h im Prjektbaum gefehlt hat. Aber nach dem Hinzufügen 
ändert sich nichts an dem Fehler. Die "verbotenen" Dateien sind in 
meinem Projekt auch nicht vorhanden.

von Moritz M. (avrprogger)


Lesenswert?

Also für mich sieht das im Projekt oben so aus, das du versucht hast ein 
Projekt zu erstellen und die StdPeriphLib über den Projekt-Dialog mit 
einzubinden. Der Ordner cmsis müsste eig. nicht mehr da sein, wenn du 
nach der Anleitung zum ersten Projekt 
(http://www.mikrocontroller.net/articles/STM32_-_Einstieg_mit_Em::Blocks#Das_erste_Projekt_erstellen) 
vorgegangen wärst. Außerdem müsste es ein zweiten globalen define geben 
STM32F40_41xxx. Die Dateien stm32f4xx.h und system_stm32f4xx.c/.h sind 
auch noch die alten.

Moritz

von Moritz M. (avrprogger)


Angehängte Dateien:

Lesenswert?

So müsste das aussehen, wenn man nach der gesamten Anleitung vorgeht.

Moritz

von Gibts N. (schneeblau)


Lesenswert?

Hm das läuft bei mir durch, ich werde es nochmal probieren, vielleicht 
finde ich den Fehler..danke...


Ev. mache ich ins Wiki noch ein paar Absätze bzw. Nummerierungen rein, 
damit es übersichtlicher wird. Ein paar Fehler hatte ich schon 
korrigiert.

: Bearbeitet durch User
von Gibts N. (schneeblau)


Lesenswert?

So nun läuft es bei mir auch. Keine Ahnung woran es lag. Ev. kannst du 
deinen "Grundrahmen" mit in das Wiki einbinden, so hat man ein 
Vergleichsprojekt.


Die Absätze hast du ja auch schon geändert, danke dir.


Funktioniert es bei euch, EM::Blocks in mehreren Instanzen zu öffnen? 
Ich hab das in den Einstellungen geändert, aber es geht trotzdem nur 
eine Instanz.

von Moritz M. (avrprogger)


Lesenswert?

Leider kann man nur max 50MB hochladen.

Moritz

von Gibts N. (schneeblau)


Lesenswert?

Dein Beispiel oben mit RAR gepackt ist bei mir nur ~20MB groß, das 
dürfte doch reichen oder?

von Michael G. (teslazwerg)


Lesenswert?

Moritz M. schrieb:
> Leider kann man nur max 50MB hochladen.
>
> Moritz

Mach vor dem zippen ein Clean, dann sind die ganze object files nicht 
dabei. Das spart einiges.

von holger (Gast)


Lesenswert?

>Mach vor dem zippen ein Clean, dann sind die ganze object files nicht
>dabei. Das spart einiges.

Die Libraries aus CMSIS/lib mit über 100MB braucht auch nicht jeder;)
Das bringt viel mehr.

von Sabine (Gast)


Lesenswert?

Das fand ich auch etwas abschreckend, erstmal zig Magebyten an Zeugs 
runter laden zu müssen, nur um zum Einstieg ein paar LEDs zum Blinken zu 
bringen. Kam auch nicht so richtig zu Rande damit und habe dann erstmal 
wieder neu angefangen, und einfach eines der vielen CooCox-Beispiele 
importiert und damit rumgespielt.

von kai m. (hiswif)


Lesenswert?

Hallo,

ersteinmal ganz großes DANKE für das Tutorial. Ich werde es auf 
jedenfall weiterhin verfolgen. Endlich mal alle Infos an einem Platz ;)
Natürlich möchte auch ich etwas beisteuern, da gerade die Dinge mit den 
Clocks am Anfang sehr verwirrend für mich waren. So wie ich oben so im 
überflug mitbekommen habe ist das ja auch immernoch nicht ganz so 
einfach. Ich bin allerdings auf ein Application Note von STM gestoßen 
welches ich hier gern verlinken würde, da ich es gerade für Anfänger 
sehr hilfreich finde.

http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1533/PF257927?s_searchtype=keyword#

Im unteren Teil gibt es eine Zip mit einer Excel Tabelle, welche die 
"system_stm32f4xx.c" generiert. Gerade für Anfänger finde ich es 
wirklich gut. eventuell willst du es ja verlinken oder so.

MFG

His

: Bearbeitet durch User
von BlocksUser (Gast)


Lesenswert?

Gibt es die Möglichkeit, bei compilieren im Debug Ordner auch ein *.bin 
oder *.hex File zu erzeugen?

von In d. (indus)


Angehängte Dateien:

Lesenswert?

BlocksUser schrieb:
> Gibt es die Möglichkeit, bei compilieren im Debug Ordner auch ein *.bin
> oder *.hex File zu erzeugen?

Die Frage habe ich mir selber auch gestellt und folgende kurze Anleitung 
geschrieben. Hier wird beschrieben, wie man aus der IDE heraus durch den 
Kommandozeilenaufruf des ST-Link Tools das Programm (hex/bin) direkt in 
den Controller übertragen kann.

von Michi (Gast)


Lesenswert?

Wo hast du den die alte Version vom ST-Link her? Mit der aktuellen 
(v1.8.1) geht es nicht so wie beschrieben.

Musste es etwas abändern damit es mit der v1.8.1 geht.
-c SWD UR -P "${TARGET_OUTPUT_DIR}${TARGET_OUTPUT_BASENAME}.hex" 
0x08000000 -V "after_programming" -Rst -Run

von In d. (indus)


Lesenswert?

Michi schrieb:
> Wo hast du den die alte Version vom ST-Link her? Mit der aktuellen
> (v1.8.1) geht es nicht so wie beschrieben.

Bin STM32F4 User der ersten Stunde. Hatte bisher nie einen Grund das 
Link Utility auf eine neue Version zu überprüfen. Habe es gerade mal 
aktualisiert und auch die Firmware auf dem Discovery Board und kann 
bestätigen, dass es erst nach der von dir genannten Anpassung geht. Der 
-V befehl hat sich geändert.
indus

von Semi (Gast)


Lesenswert?

Gibt es unter em blocks auf debug Möglichkeiten wie kleine Ausgaben zum 
Pc oder Wert einer Variable am Pc abfragen, oder wie macht man das 
sonst?

von Semi (Gast)


Lesenswert?

???

von Moritz-avrprogger (Gast)


Lesenswert?

Moin. Während des debuggens kannst du eine Variable makieren und dann 
rechts klick -> add watch. Unter dem Debugger neu gibt es einen Eintrag 
debugging Windows und darunter das Fenster watches oder so ähnlich.

Moritz

von Maxn (Gast)


Lesenswert?

Wie kann man beim compilieren lst Dateien erzeugen? Ich würde gerne 
sehen, welche FPU/DSP Instruktionen genutzt werden.

von Moritz M. (avrprogger)


Lesenswert?

Es gibt auch ein Disassambler Fenster beim Debuggen. eventuell da. Sonst 
weiß ich das grade auch nicht so richtig.

Moritz

von Christian C. (christian_c27)


Lesenswert?

Hallo Moritz!

Danke für das Tutorial!
Ich bin jetzt erst über EmBlocks gestolpert und bin begeistert.
Bisher habe ich immer mit EWARM (Iar) gearbeitet.

Schön finde ich auch die Registeransicht der Peripherals. Dazu muss das 
passende SVD File geladen werden. Zu finden im Debug-Menü.
Auch das Mixed Assembly/C Debugging finde ich gut.

Folgendes habe ich zum Thema Listing File gefunden (allgemein GCC):

Q: How can I peek at the assembly code generated by GCC?

Q: How can I create a file where I can see the C code and its assembly 
translation together?

A: Use the -S (note: capital S) switch to GCC, and it will emit the 
assembly code to a file with a .s extension. For example, the following 
command:

  gcc -O2 -S -c foo.c

will leave the generated assembly code on the file foo.s.

If you want to see the C code together with the assembly it was 
converted to, use a command line like this:

 gcc -c -g -Wa,-a,-ad [other GCC options] foo.c > foo.lst

which will output the combined C/assembly listing to the file foo.lst.

If you need to both get the assembly code and to compile/link the 
program, you can either give the -save-temps option to GCC (which will 
leave all the temporary files including the .s file in the current 
directory), or use the -Wa,-aln=foo.s option which instructs the 
assembler to output the assembly translation of the C code (together 
with the hex machine code and some additional info) to the file named 
after the =.

von Gerald_G (Gast)


Lesenswert?

Hallo,

danke schonmal für das tutorial.

Ich habe allerdings ein Problem mit den neuen libs. Diese sind seit 
Februar neu geordnet in dem so genannten Stm32CUBE. Die standard 
peripheral Treiber heißen nun zwar en etwa wie vorher, beinhalten jedoch 
immer den Zusatz "_hal" im Namen.

Mir gelingt es leider seit Stunden nicht diese funktionierend in 
EM::block einzubauen...

Hat jemand tips oder auch gerne eine englische Seite dazu?

von Axel (Gast)


Lesenswert?

Hallo,

ich habe eine recht banale aber vielleicht wichtige Frage zum Tutorial:
Wie werden die Pfade für Include angegeben? Die Stelle, wo ich sie 
eintragen muss sind gut erklärt, aber manche Dateien werden immer noch 
nicht gefunden. Müssen die Dateien relativ zum Ordner, in dem ich meine 
Projekte gespiechert habe -  der Ordner befindet sich unter Dokumente 
auf der gleichen Hirarchieebene wie die Projektordner. Ich habe es 
absolut (C:\...\inc) und relativ zum Stammordner, der die Projektordner 
und den Ordner mit den Header-Dateien verbindet, versucht.
Ich habe da einen falschen Gedanken zwischen und einen Fehler. Könnt ihr 
mir bitte bei der richten Lösung helfen?

Viele Grüße
Axel

von stefan (Gast)


Lesenswert?

Vielen Dank für das Tutorial, das hat mir den Einstieg in die STM32F4 
Welt um einiges erleichtert!

Ich habe aber eine Frage bezüglich des System-Register Debugging, wenn 
ich das Fenster öffne sehe ich in jedem Register nur den Wert 0x0000000. 
(svd-File wurde laut Tut. erstellt)
Was hab ich übersehen?

lg Stefan

von Josep (Gast)


Lesenswert?

markusDerBastler schrieb:
> Autor:
>
>         markusDerBastler (Gast)
>
>
>
>
>
>
>
>       Datum: 10.02.2014 15:52

Nur so Neugierig, bist der Bruder vom berühmte Thomas der Bastler?

von lekanteto (Gast)


Lesenswert?

Weiter oben wurde ja nach STM32Cube gefragt.
Ich habe es in emblocks mit den Informationen aus folgendem Thread zum 
Laufen bekommen.

Beitrag "STM32Cube & Eclipse & GCC"

Vielleicht ist das etwas, was noch ins Tutorial aufgenommen werden kann.

von Grobi (Gast)


Lesenswert?

Hallo,

gibt es von dem tutorial auch eine etwas neuere Version z.B. mit dem 
aktuellen stm32cubef4 release (1.3.0) und emblocks 2.3 ?
Ich versuche das nämlich gerade hinzubekommen.
Bis jetzt habe ich es geschaft die HAL driver zu verwenden, ABER was 
nicht geht ist die BSP und HAL driver gleichzeitig verwenden z.B. um 
BSP_LED_Init() nutzen zu können (man will das Rad ja nicht immer wieder 
neu erfinden müssen). Das gibt in stm32f4_discovery.c immer Fehler mit 
den I2C und SPI Methoden (typen und methoden nicht gefunden etc.) Gibts 
dafür evtl. eine Lösung oder ist das eh pfui beides gleichzeitig 
verwenden zu wollen?
Mein vorgehen war ein neues project mit emblocks zu ertellen, den ganzen 
inhalt rauszuwerfen, ein project mit stm32cubemx zu ertstellen code 
gegenieren lassen und dann die files wieder im emblock project 
einbinden.

VG
Grobi

von Jan K. (jan_k81)


Lesenswert?

Vielen Dank! Hat mir super geholfen, erstmal einen Einstieg zu finden, 
weil der Sprung von Arduino&Co. zu ARM development dann doch ganz schoen 
gross ist...

Auf die im Artikel angekuendigte Forsetzung freue ich mich schon!


Beste Gruesse aus Neuseeland
J.

: Bearbeitet durch User
von Reinhard (Gast)


Lesenswert?

Hi,

Danke für das Tutorial, hat mir schon einiges geholfen.

Hat schön jemand Erfahrung mit dem Cortex M0/M0+ Kern?

Bin gerade dabei das Dicoveryboard mit dem STM32L053 Prozessor zu 
testen, habe jedoch das Problem, dass das Debuggen nicht funktioniert. 
Bei den Debugeinstellungen muss eine sogeannate SVD-Datei angeben. 
Normalerweise sollte diese beim erstellen des Projektes mit generiert 
werden 
(http://www.powerloss.de/2013/12/vorstellung-emblocks-entwicklungsumgebung-fur-microcontroller/), 
leider bei mir nicht und ich kann sie auch nirgends finden. Bitte um 
eure Hilfe!

Kompilieren funktioniert ohne Ferhler und Warnungen.

Bin leider eher ein Programmieranfänger.

Danke für eure Antworten!

mfg Reinhard

von Christian J. (Gast)


Lesenswert?

Hi,

woher weiss der Linker denn dann wo das CCRAM liegt?


1. Eine neue Section im Linkerscript anlegen:

Sections:
{
  ...

  .ccram :
  {
    *(.ccram)
  } > CCRAM

  ...
}

Gruss,
Christian

von Hobbyprogrammierer (Gast)


Lesenswert?

Kaum drei (bzw zwei) Jahre später hab auch ich es (diesen
Thread bzw Wiki) gefunden.

Aber ich bin ja auch erst seit drei Tagen auf dem 32Bit Trip.

Danke für das Wiki.

Bleibt noch zu sagen dass das Wiki ja für Em::Blocks geschrieben
wurde, die IDE mittlerweile aber EmBitz heisst. Aber das wissen
ja sowieso alle ..... also was schreib ich hier für Langeweile.

von LarsB (Gast)


Lesenswert?

Eine plattform-unabhängige Einführung wäre besser. EmBitz ist für 
Windows, aber es gibt nicht nur Windows.

Beitrag #5135209 wurde von einem Moderator gelöscht.
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.