Programmierung anderer Controller

Je nach Version und Ausgabe können Anwendungen für verschiedene Zielplattformen entwickelt werden. Die SiSy-Ausgabe Mikrocontroller++ bietet Ihnen als Target die 8 Bit AVR-Familie von Atmel, die STM32 Cortex M0, M3 und M4 sowie die Möglichkeit, PC-Anwendungen zu programmieren, die mit Ihrem Mikrocontroller kommunizieren können. Dieser Abschnitt des Tutorials beschäftigt sich mit der Programmierung weiterer STM32 Zielplattformen. Es wird die Vorgehensweise für folgende Evaluierungsboards vorgestellt:

Eine Sammlung einfacher Beispiele für den Einstieg in die Programmierung dieser Zielplattformen steht ihnen im SiSy-LibStore als hier als SiSy-Projektarchiv zum Download zur Verfügung.

Verschiedene Controlleranwendungen als kleines Programm

Das Projekt enthält eine Sammlung von Beispielen zur Programmierung ausgewählter Peripheriebausteine der Controllerfamilien STM32F0, F3 und F4.

Beachten Sie, dass jede Zielplattform spezifische Einstellungen erfordert. Vergleichen sie die konkreten Einstellungen (Dialog Definieren, Extras ARM) der verschiedenen Beispielprogramme.

Im Folgenden das Beispiel für ein Grundgerüst (kleines Programm) mit der Zielplattform STM32F0-Discovery. Nach dem Laden der Standardvorlage ist darauf zu achten, dass neben der Einstellung im Definierendialog die korrekte Deklarationsdatei eingebunden wird (#include „stm32fxxx.h“).

//----------------------------------------------------------------------
// Titel     : Grundgerüst einer einfachen ARM C Anwendung in SiSy
//----------------------------------------------------------------------
// Funktion  : ...
// Schaltung : ...
//----------------------------------------------------------------------
// Hardware  : STM32F3 Discovery
// MCU       : STM32F051R8T6
// Takt      : 48 MHz
// Sprache   : ARM C
// Datum     : ...
// Version   : ...
// Autor     : ...
//----------------------------------------------------------------------
#include <stddef.h>
#include <stdlib.h>
#include "stm32f0xx.h"
#include "mySTM32.h"
 
void initApplication()
{
	SysTick_Config(SystemCoreClock/100);
	// weitere Initialisierungen durchführen
}
int main(void)
{
	SystemInit();
	initApplication();
	do{
		// Eingabe
		// Ausgabe
		// Verarbeitung
	} while (true);
	return 0;
}
extern "C" void SysTickFunction(void)
{
	// Application SysTick
}

In den einzelnen Beispielen sind Funktion und Schaltung im Programmkopf beschrieben. Die Struktur und Vorgehensweise bei den verschiedenen Plattformen ist immer gleich. Es unterscheiden sich lediglich die konkreten Pin-Belegungen und Statements aus dem CMSIS und den Devicetreibern der Zielplattform. Der folgende Quellcode zeigt ein STM32F3 Beispiel:

//----------------------------------------------------------------------
// Titel     : Beispiel für eine einfache Tastenabfrage mit dem STM32F3
//----------------------------------------------------------------------
// Funktion  : der blaue UserButton schaltet die rote LED an
// Schaltung : UserButton an PA0, rote LED PE9
//----------------------------------------------------------------------
// Hardware  : STM32F3 Discovery
// MCU       : STM32F303VCT6
// Takt      : 72 MHz
// Sprache   : ARM C
// Datum     : 21.01.2013
// Version   : 1
// Autor     : Alexander Huwaldt
//----------------------------------------------------------------------
#include <stddef.h>
#include <stdlib.h>
#include "stm32f30x.h"
#include "mySTM32.h"
 
#define BUTTON_USER (1<<0)
#define LED_RED (1<<9)
GPIO_InitTypeDef GPIO_InitStructure;
 
void initApplication()
{
	SysTick_Config(SystemCoreClock/100);
	// weitere Initialisierungen durchführen
 
	/* Enable BUTTON Clock */
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
	/* Config BUTTON */
	GPIO_StructInit(&GPIO_InitStructure);	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
	GPIO_InitStructure.GPIO_Pin = BUTTON_USER;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
 
	/* Enable LED Clock */
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOE, ENABLE);
 
	/* Config LED */
	GPIO_StructInit(&GPIO_InitStructure);	
	GPIO_InitStructure.GPIO_Pin = LED_RED;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
	GPIO_Init(GPIOE, &GPIO_InitStructure);	
 
}
int main(void)
{
	SystemInit();
	initApplication();
	do{
 
		if (GPIO_ReadInputDataBit(GPIOA,BUTTON_USER)!=0)
			GPIO_SetBits(GPIOE,LED_RED);
		else
			GPIO_ResetBits(GPIOE,LED_RED);
 
	} while (true);
	return 0;
}
extern "C" void SysTickFunction(void)
{
	// Application SysTick
}

Übersetzen, übertragen und testen

Die Programme sind getestet und können sofort übersetzt (kompilieren, linken) und in den Programmspeicher des Controllers übertragen werden (brennen).

Verschiedene Controlleranwendungen als Klassendiagramm

Das Beispielprojekt enthält für die drei genannten Zielplattformen jeweils ein Klassendiagramm. Die drei Klassenmodelle zeigen eine mögliche Vorgehensweise bei der objektorientierten Programmierung von ARM Controllern ohne ein vorgefertigtes Framework, sondern auf der Basis des CMSIS und der Treiberbibliotheken. Die Klassenstruktur der drei Beispiele ist jeweils identisch und damit portabel.

Die Fachlogik findet sich in der Klasse Application und ist, wie ersichtlich, ebenfalls portabel. In den Klassen Button und LED sind die plattformspezifischen Statements gekapselt. Diese Klassen abstrahieren die physische Peripherie auf fachlicher Ebene.

Application::main()
SysTick_Config(SystemCoreClock/100);
// weitere Initialisierungen durchführen
led.init();
button.init();
this->run();
Application::run()
do {
 
   if (button.isPressed())
      led.on();
   else
      led.off();
 
   } while(true);

Übersetzen, übertragen und testen

Zu beachten sind wiederum die plattformspezifischen Einstellungen für das gesamte Klassendiagramm unter Extras ARM sowie die Einbindung der korrekten Deklarationsdateien stm32Fxxx.h auf den verschienen Optionsseiten. Vergleichen Sie diese zwischen den einzelnen Beispielen.

Die Programme sind getestet und können sofort übersetzt (kompilieren, linken) und in den Programmspeicher des Controllers übertragen werden (brennen).

Videozusammenfassung

Seminarhinweise