Guten Tag.Als ich die Programmierung von Stm32-Mikrocontrollern verstand, entschied ich mich für die Installation von RTOS - FreeRTOS (Echtzeitbetriebssystem) und stieß auf eine Reihe von Schwierigkeiten. Es gibt viele Artikel im Internet, aber ich habe keine klaren Anweisungen gefunden, deshalb frage ich alle, die sich für Katzen interessieren.Lassen Sie uns zunächst entscheiden, was Sie haben müssen:- Stm32VLDiscovery Debug Board
- Installierte IDE Keil ARM 5 und höher
- Der Wunsch, das Neue zu klären
Wenn Sie in Keil bereits etwas für die STM32F1x-Familie entwickelt haben, können Sie diesen Absatz überspringen. Zuerst müssen Sie Entwicklungspakete für die STM32F1x-Familie installieren. Dies geschieht wie folgt:- Wir starten Keil.
- Klicken Sie im Bedienfeld auf die Schaltfläche Pack Installer

- Klicken Sie im folgenden Fenster auf die Schaltfläche Nach Updates suchen (wir warten auf die Liste der zu aktualisierenden Pakete).
- Wählen Sie in der Baumstruktur STMicroelectronics-> STM32F1 Series-> STM32F100 aus und installieren Sie alle Pakete
Damit ist die Vorbereitung der Entwicklungsumgebung abgeschlossen.Wir fahren direkt mit der Erstellung des Projekts mit FreeRTOS fort.Als erstes müssen Sie die neueste RTOS-Distribution von der offiziellen Website www.freertos.org herunterladen. Zum Zeitpunkt des Schreibens war die neueste Version FreeRTOSv9.0.0. Wir haben also ein beeindruckendes Archiv, packen es an einen beliebigen Ort aus (ich sage sofort, dass wir nicht 99% davon benötigen, also keine Angst vor der Größe des resultierenden Ordners, ich habe mehr als 200 MB).Jetzt müssen wir ein neues Projekt in Keil erstellen.
Ich habe es FreeRTOSDemo genannt, Sie können jeden geeigneten Namen wählen. Hauptsache, es sollten keine Leerzeichen und russischen Buchstaben im Pfad des Projekts sein.Jetzt müssen wir unseren Chip auswählen. Ich habe ihn auf dem STM32VLDiscovery-Debugboard mit dem STM32F100RB-Chip getestet und ihn ausgewählt.
Nachdem Sie einen Chip ausgewählt haben, müssen Sie die Bibliotheken auswählen, die wir verwenden werden. Wir benötigen die CMSIS-Bibliothek und StdPeriph. Die folgenden Abbildungen zeigen die Mindestauswahl an Komponenten, um den Betrieb des RTOS zu überprüfen und mit Dioden zu blinken (dies gilt für die StdPeriph-Bibliothek, CMSIS ist erforderlich).

Also haben wir das Projekt erstellt, es sieht folgendermaßen aus:
Als Nächstes erstellen wir der Einfachheit halber mehrere Gruppen im Projekt, damit später eine Mischung aus Dateien angezeigt wird.
Alles ist bereit, um die RTOS-Dateien in das Projekt zu kopieren. Erstellen Sie einen FreeRTOS-Ordner im Projektordner.Kopieren Sie aus dem Ordner FreeRTOSv9.0.0 \ FreeRTOS \ Source \ alle * .s-Dateien in den erstellten Ordner FreeRTOS. Dort kopieren wir den Include-Ordner.Kopieren Sie aus dem Ordner FreeRTOSv9.0.0 \ FreeRTOS \ Source \ portable \ RVDS \ ARM_CM3 \ die Dateien * .s und * .h an die entsprechenden Stellen im Ordner FreeRTOS unseres Projekts.Kopieren Sie die Datei heap_2.c aus dem Ordner FreeRTOSv9.0.0 \ FreeRTOS \ Source \ portable \ MemMang \.Kopieren Sie aus dem Ordner FreeRTOSv9.0.0 \ FreeRTOS \ Demo \ CORTEX_STM32F103_Keil \ die Datei FreeRTOSConfig.h.Nach allen Manipulationen sollte Folgendes passieren:
Als Nächstes müssen wir die Dateien zu den entsprechenden Gruppen im Projekt hinzufügen und die Datei main.cc mit dem Haupttext des Programms erstellen.Als Ergebnis sollte die folgende Projektstruktur erhalten werden.
Damit das Projekt in seinen Einstellungen kompiliert werden kann, müssen Sie alle Pfade zu * .h-Dateien angeben und die Direktive USE_STDPERIPH_DRIVER registrieren.
Jetzt müssen noch einige Zeilen in der Datei FreeRTOSConfig.h geändert werden, um einen korrekten Betrieb zu gewährleisten:#define configCPU_CLOCK_HZ ( ( unsigned long ) 72000000 )
#define configCPU_CLOCK_HZ ( ( unsigned long ) 24000000 )
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 17 * 1024 ) )
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 5 * 1024 ) )
Fügen Sie nach #define FREERTOS_CONFIG_H die folgenden Zeilen hinzu#define xPortSysTickHandler SysTick_Handler
#define xPortPendSVHandler PendSV_Handler
#define vPortSVCHandler SVC_Handler
Danach schreiben wir in die Datei main.c das einfachste Programm zum Blinken von LEDs.#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
GPIO_InitTypeDef port;
uint8_t state;
void vFreeRTOSInitAll()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_StructInit(&port);
port.GPIO_Mode = GPIO_Mode_Out_PP;
port.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_8;
port.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &port);
}
void vLedTask (void *pvParameters)
{
while(1)
{
if (state == 0)
{
GPIO_SetBits(GPIOC,GPIO_Pin_9);
GPIO_ResetBits(GPIOC,GPIO_Pin_8);
state = 1;
vTaskDelay(500);
}
else
{
GPIO_ResetBits(GPIOC,GPIO_Pin_9);
GPIO_SetBits(GPIOC,GPIO_Pin_8);
state = 0;
vTaskDelay(500);
}
}
vTaskDelete(NULL);
}
int main(void)
{
vFreeRTOSInitAll();
xTaskCreate(vLedTask,(signed char*)"LedTask", configMINIMAL_STACK_SIZE,
NULL, tskIDLE_PRIORITY + 1, NULL);
vTaskStartScheduler();
}
Jetzt können Sie das Projekt zusammenbauen und die Firmware in den Mikrocontroller einfügen. Beobachten Sie nach dem Neustart die blinkenden LEDs.