Buen diaAl comprender la programación de los microcontroladores Stm32, decidí intentar instalar RTOS (sistema operativo en tiempo real) - FreeRTOS y me encontré con varias dificultades. Hay muchos artículos en Internet, pero no encontré instrucciones claras, por lo que pregunto a todos los interesados en el gato.Entonces, para empezar, decidamos qué necesita tener:- Junta de depuración de Stm32VLDiscovery
- IDE Keil ARM 5 instalado y superior
- El deseo de resolver lo nuevo
Si ya ha desarrollado algo para la familia STM32F1x en Keil, puede omitir este párrafo. Primero necesita instalar paquetes de desarrollo para la familia STM32F1x, esto se hace de la siguiente manera:- Lanzamos Keil.
- Haga clic en el botón Instalador de paquete en el panel

- En la ventana que se abre, haga clic en el botón Buscar actualizaciones (estamos esperando que se actualice la lista de paquetes)
- En el árbol, seleccione STMicroelectronics-> STM32F1 Series-> STM32F100 e instale todos los paquetes
Esto completa la preparación del entorno de desarrollo.Procedemos directamente a la creación del proyecto usando FreeRTOS.Lo primero que debe hacer es descargar la última distribución de RTOS del sitio web oficial www.freertos.org , en el momento de la redacción, la última versión era FreeRTOSv9.0.0. Así que obtuvimos un archivo impresionante, desempaquételo en cualquier lugar (diré de inmediato que no necesitamos el 99% de él, así que no tenga miedo del tamaño de la carpeta resultante, tengo más de 200 MB).Ahora necesitamos crear un nuevo proyecto en Keil.
Lo llamé FreeRTOSDemo, puedes elegir cualquier nombre adecuado, lo principal es que no debe haber espacios ni letras rusas en el camino del proyecto.Ahora tenemos que elegir nuestro chip, lo probé en la placa de depuración STM32VLDiscovery con el chip STM32F100RB, así que lo elegí.
Después de elegir un chip, debe seleccionar las bibliotecas que utilizaremos. Necesitaremos la biblioteca CMSIS y StdPeriph. Las siguientes figuras muestran la selección mínima de componentes para verificar el funcionamiento del RTOS y para parpadear con diodos (esto se aplica a la biblioteca StdPeriph, se requiere CMSIS).

Así que creamos el proyecto, se ve así: a
continuación, por conveniencia, creamos varios grupos en el proyecto, para que luego haya una mezcla de archivos.
Todo está listo para copiar los archivos RTOS al proyecto. Cree una carpeta FreeRTOS en la carpeta del proyecto.Desde la carpeta FreeRTOSv9.0.0 \ FreeRTOS \ Source \, copie todos los archivos * .s a la carpeta FreeRTOS creada. Allí copiamos la carpeta de inclusión.Desde la carpeta FreeRTOSv9.0.0 \ FreeRTOS \ Source \ portable \ RVDS \ ARM_CM3 \, copie los archivos * .s y * .h en los lugares correspondientes en la carpeta FreeRTOS de nuestro proyecto.Desde la carpeta FreeRTOSv9.0.0 \ FreeRTOS \ Source \ portable \ MemMang \, copie el archivo heap_2.c.Desde la carpeta FreeRTOSv9.0.0 \ FreeRTOS \ Demo \ CORTEX_STM32F103_Keil \ copie el archivo FreeRTOSConfig.h.Después de todas las manipulaciones, debe ocurrir lo
siguiente : A continuación, debemos agregar los archivos a los grupos apropiados en el proyecto, y también crear el archivo main.cc con el texto principal del programa.Como resultado, se debe obtener la siguiente estructura del proyecto.
Para que el proyecto se compile en su configuración, debe especificar todas las rutas a los archivos * .h, así como registrar la directiva USE_STDPERIPH_DRIVER.
Ahora queda por cambiar varias líneas en el archivo FreeRTOSConfig.h, para su correcto funcionamiento:#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 ) )
Y agregue las siguientes líneas después de #define FREERTOS_CONFIG_H#define xPortSysTickHandler SysTick_Handler
#define xPortPendSVHandler PendSV_Handler
#define vPortSVCHandler SVC_Handler
Después de eso, en el archivo main.c, escribimos el programa más simple para parpadear los LED.#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();
}
Ahora puede ensamblar el proyecto y llenar el firmware en el microcontrolador, después del reinicio, observe los LED parpadeantes.