STM32 LEDBlinken AtollicTrueStudio: Unterschied zwischen den Versionen

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche
KKeine Bearbeitungszusammenfassung
Zeile 63: Zeile 63:


void delayLoop() {
void delayLoop() {
uint32_t delayCount = 1000000;
volatile uint32_t delayCount = 1000000; // volatile, um "Wegoptimieren" zu vermeinden
while (delayCount > 0) {
while (delayCount > 0) {
delayCount--;
delayCount--;
Zeile 93: Zeile 93:


</c>
</c>


=== Projekt Builden ===
=== Projekt Builden ===

Version vom 7. Oktober 2010, 18:05 Uhr

Um den Einstieg zu erleichtern wird hier ein minimales Beispiel, eine blinkende LED, mithilfe der STM32 Std. Peripherial Library vorgestellt.

Verwendete Komponenten

  • IDE Atollic Truestudio Lite 1.4 (Free)
  • JTAG Debugger (ca. 25€)
  • Ein Test/Demoboard mit einem STM32F10x (und mindestens eine schaltbare LED)

Kompontenten herunterladen und installieren

Downloaden von Atollic TrueSTUDIO®/STM32 Lite (1.4) von http://www.atollic.com/index.php/download/downloadstm32 und intallieren.

Den ST-LINK updaten damit er neuere Controller kennt. Downloaden des "ST-Link firmware upgrade" von der ST Seite http://www.st.com/mcu/familiesdocs-110.html. ST-Link am USB anstecken, ZIP-File Entpacken, ST-LinkUpgrade.exe ausführen, Button "Device Connect" und "YES" anklicken um das update auszuführen.

Dokumentationen herunterladen

Von der ST Seite http://www.st.com/mcu/familiesdocs-110.html herunterladen von

  • RM0008 Reference Manual
  • Das zum Controller auf dem Board passende Datasheet
 (zb. "STM32F105/107xx" für den STM32F107)
  • PM0056 STM32F10xxx Cortex-M3 programming manual

C-Code Projekt für den Controller einrichten

TrueStudio starten und einen (neuen) Workspace Ordner wählen. Im Workspace Ordner wird pro Projekt dann ein Projektordner abgelegt.

Truestudio start workspace.png

Die Introseite beenden mit "Start using TrueSTUDIO" und ein neues C-Projekt erstellen mit File -> New -> C-Projekt.... wähle STM32 C Projekt ... Atollic ARM Tools

Truestudio new c project.jpg

Truestudio new c project wizard1.JPG

Nachfolgender Dialog definier welche Projekteinstellungen vorgenommen werden und welches Linkerscript und Startupfile in das Projekt kopiert wird.

Evaluation board: None Ausser der Std. Peripherial Library wollen wir keinen zusätzlichen Code hinzufügen

Microcontroller family und Microcontroller: Wähle hier den Controller der auf DEINEM EIGENEN Board bestückt ist.

Code location: FLASH -- das Programm wird dauerhaft in in internen Flash des STM32 abgelegt. RAM -- das Programm wird in den internen RAM geschrieben und ist nach dem abschalten des Stromes wieder futsch.

Nun den Finish Button drücken, das Projekt wird erstellt, die notwendigen Dateien erzeugt.

Truestudio new c project wizard2.JPG

Main Code für Blinking LED

Die Codefiles finden sich im Order src. Der vom Wizard erstellte Code im main.c wird durch folgenden Code ersetzt.

main.c:

<c>

  1. include "stm32f10x.h"

// Die Std. Peripherie arbeitet viel über Strukturen // Struktur um PortPins zu initialisieren GPIO_InitTypeDef GPIO_InitStructure;


void delayLoop() { volatile uint32_t delayCount = 1000000; // volatile, um "Wegoptimieren" zu vermeinden while (delayCount > 0) { delayCount--; } }

int main(void) { // Die Std. Peripherie nun Clocks, PLLs usw. einrichten SystemInit();

// PORT D Peripherie aktivieren RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);

// PortPin als Ausgang configurieren GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOD, &GPIO_InitStructure);

while(1) { GPIOD->BSRR = GPIO_Pin_7; // LED On delayLoop();

GPIOD->BRR = GPIO_Pin_7; // LED Off delayLoop(); } }

</c>

Projekt Builden

Das Projekt nun Builden mit dem Eintrag "Debug" beim Hammersymbol. Am unteren Rand gibt es die Problems view, hier dürfen keine Fehler aufscheinen. In der Console View wird der Compile und Linkerablauf und das Ergebnis ausgegeben.

Wenn es klappt liegt nun das fertige File als LEDBlinken.elf im Ordner "Debug".

Truestudio compilieren.JPG


Configuration zum Flashen und Debuggen

Das File nun mit dem ST-Link über JTAG auf das Board flashen. Dazu muss erstmalig eine Debug Configuration eingerichtet werden. Klicke auf das Icon des "Grünen Käfer" und selektiere "Debug As" --> "Embedded C/C++ Application". Der Wizard für eine neue Debug Configuration wird geöffnet, die Einstellungen für den ST-LINK sich korrekt eingetragen.

Mit Apply und OK wird die neuen Debug Configuration angelegt (elf File in den Controller flashen, debug starten, brakepoint ist erste zeile in main) Diese Debug Config ist nun direkt über das Debug Icon "Grüner Käfer" erreichbar.

Truestudio flash and debug stlink first time.JPG

Truestudio flash and debug wizard.JPG

Truestudio debug session1.JPG


Workspace mit Projekt zum download

Falls es nicht klappt hier der Workspace mit dem Blinking LED Projekt drin.

TrueStudio/STM32 Workspace mit Blinking LED Projekt

Erklärungen zum Code

<c>

 #include "stm32f10x.h"

</c>

Um mit der STM32 Standard Peripheral Library (STM32StdPerLib) zu arbeiten ist in den Code Files jeweils obiger Include einzubinden. Die gesamte Library liegt im Projekt im Ordner "firmware" und wird vom Compiler mitkompiliert.

  • Ordner: firmware/CMSIS
 Coretx-M3 spezifische Codes
  • Ordner: firmware/STM32F10x_StdPeriph_Driver
 STM32 Peripherie Codes

Die Code Files im Ordner "firmware" sollen -wenn möglich- nicht geändert werden. Von der STM32StdPerLib wird ein Configfile (stm32f10x_conf.h) eingebunden welches vom User geändert werden soll, das Headerfile ist nicht unter "firmware" zu finden sondern unter "src" bei den Userfiles.

  • File src/stm32f10x_conf.h
 Bindet die im Projekt verwendeten Peripherie Module ein. Es können alle Module aktiviert bleiben jedoch ist bei einem "Build all" dann die Compilezeit etwas länger. Durch die Optimierung dass unbenutzte Funktionen vom Linker entfernt werden hat es keine Auswirkungen auf die Codesize.

Alternative kann für dieses Beispiel der Include Block im stm32f10x_conf.h wie folgt auf zwei Module reduziert werden.

<c> /* Uncomment the line below to enable peripheral header file inclusion */ // #include "stm32f10x_adc.h" // #include "stm32f10x_bkp.h" // #include "stm32f10x_can.h" // #include "stm32f10x_cec.h" // #include "stm32f10x_crc.h" // #include "stm32f10x_dac.h" // #include "stm32f10x_dbgmcu.h" // #include "stm32f10x_dma.h" // #include "stm32f10x_exti.h" // #include "stm32f10x_flash.h" // #include "stm32f10x_fsmc.h"

  1. include "stm32f10x_gpio.h"

// #include "stm32f10x_i2c.h" // #include "stm32f10x_iwdg.h" // #include "stm32f10x_pwr.h"

  1. include "stm32f10x_rcc.h"

// #include "stm32f10x_rtc.h" // #include "stm32f10x_sdio.h" // #include "stm32f10x_spi.h" // #include "stm32f10x_tim.h" // #include "stm32f10x_usart.h" // #include "stm32f10x_wwdg.h" // #include "misc.h" /* High level functions for NVIC and SysTick (add-on to CMSIS functions) */

</c>

Einen STM32 (ARM Cortex-M3) zu initialisieren ist etwas aufwändiger da er mehrere interne Bussysteme hat und auch mehrere Clocks für die unterschiedlichen Peripheriebausteine erzeugen muss. Desweiteren wird der interne oder externe (Quartz) Takt mittels PLL multipliziert so dass der Core und die Peripherie auf einer höheren Frequenz arbeitet.

Siehe RM0008 Reference manual

 für Connection Linie (CL): Seite 115 (Figure 11. Clock tree)
 für die anderen Linien: Seite 84 (Figure 8. Clock tree)

Diese Initialisierung wird am besten der STM32StdPerLib überlassen. Dazu wird die Funtion SystemInit(); am Anfange der Main aufgerufen.

<c>

 SystemInit();

</c>

Da jedoch die Clocksettings für die verschiedenen Linie voneinander abweichen sind im Compiler Environment zwei Symbole zu definieren.

Truestudio symbole in projektsettings.JPG

  • STM32F10X_CL
 Definiert dass eine Controller aus der Connectin Line (STM32F107 oder STM32F105) verwendet wird.
  • USE_STDPERIPH_DRIVER
 Definiert dass die Module für die STM32 Peripherie aus der STM32StdPerLib verwendet werden können.

Siehe dazu im "stm32f10x.h" auf Zeile 48

Folgende Controller Settings sind möglich

<c>

  1. define STM32F10X_LD STM32F10X_LD: STM32 Low density devices
  2. define STM32F10X_LD_VL STM32F10X_LD_VL: STM32 Low density Value Line devices
  3. define STM32F10X_MD STM32F10X_MD: STM32 Medium density devices
  4. define STM32F10X_MD_VL STM32F10X_MD_VL: STM32 Medium density Value Line devices
  5. define STM32F10X_HD STM32F10X_HD: STM32 High density devices
  6. define STM32F10X_XL STM32F10X_XL: STM32 XL-density devices
  7. define STM32F10X_CL STM32F10X_CL: STM32 Connectivity line devices

</c>



Verwandte Themen