Bom diaCompreendendo a programação dos microcontroladores Stm32, decidi tentar instalar (sistema operacional em tempo real) RTOS - FreeRTOS e tive várias dificuldades. Existem muitos artigos na Internet, mas não encontrei instruções claras, então peço a todos os interessados em gatos.Então, para começar, vamos decidir o que você precisa ter:- Placa de depuração Stm32VLDiscovery
- IDE Keil ARM 5 instalado e superior
- O desejo de resolver o novo
Se você já desenvolveu algo para a família STM32F1x no Keil, pode pular este parágrafo. Primeiro, você precisa instalar pacotes de desenvolvimento para a família STM32F1x, da seguinte maneira:- Lançamos Keil.
- Clique no botão Instalador de pacotes no painel  
- Na janela que se abre, clique no botão Verificar atualizações (estamos aguardando a atualização da lista de pacotes)
- Na árvore, selecione STMicroelectronics-> STM32F1 Series-> STM32F100 e instale todos os pacotes
Isso completa a preparação do ambiente de desenvolvimento.Prosseguimos diretamente para a criação do projeto usando o FreeRTOS.A primeira coisa a fazer é baixar a distribuição RTOS mais recente do site oficial www.freertos.org , no momento da redação deste artigo, a versão mais recente era o FreeRTOSv9.0.0. Portanto, temos um arquivo impressionante, descompacte-o em qualquer lugar (direi imediatamente que não precisamos de 99% dele, portanto, não tenha medo do tamanho da pasta resultante, tenho mais de 200 MB).Agora precisamos criar um novo projeto no Keil. Eu o chamei de FreeRTOSDemo, você pode escolher qualquer nome adequado, o principal é que não haja espaços e letras russas no caminho do projeto.Agora, precisamos escolher nosso chip, testei na placa de depuração STM32VLDiscovery com o chip STM32F100RB, por isso escolhi.
Eu o chamei de FreeRTOSDemo, você pode escolher qualquer nome adequado, o principal é que não haja espaços e letras russas no caminho do projeto.Agora, precisamos escolher nosso chip, testei na placa de depuração STM32VLDiscovery com o chip STM32F100RB, por isso escolhi.
 Depois de escolher um chip, você precisa selecionar as bibliotecas que usaremos. Vamos precisar da biblioteca CMSIS e do StdPeriph. As figuras abaixo mostram a seleção mínima de componentes para verificar a operação do RTOS e piscar com diodos (isso se aplica à biblioteca StdPeriph, é necessário o CMSIS).
Depois de escolher um chip, você precisa selecionar as bibliotecas que usaremos. Vamos precisar da biblioteca CMSIS e do StdPeriph. As figuras abaixo mostram a seleção mínima de componentes para verificar a operação do RTOS e piscar com diodos (isso se aplica à biblioteca StdPeriph, é necessário o CMSIS).

 Então, criamos o projeto, é assim:
Então, criamos o projeto, é assim: Em seguida, por conveniência, criamos vários grupos no projeto, para que mais tarde haja uma confusão de arquivos.
Em seguida, por conveniência, criamos vários grupos no projeto, para que mais tarde haja uma confusão de arquivos. Está tudo pronto para copiar os arquivos RTOS para o projeto. Crie uma pasta FreeRTOS na pasta do projeto.Na pasta FreeRTOSv9.0.0 \ FreeRTOS \ Source \, copie todos os arquivos * .s para a pasta FreeRTOS criada. Lá, copiamos a pasta de inclusão.Na pasta FreeRTOSv9.0.0 \ FreeRTOS \ Source \ portable \ RVDS \ ARM_CM3 \, copie os arquivos * .s e * .h para os locais correspondentes na pasta FreeRTOS do nosso projeto.Na pasta FreeRTOSv9.0.0 \ FreeRTOS \ Source \ portable \ MemMang \, copie o arquivo heap_2.c.Na pasta FreeRTOSv9.0.0 \ FreeRTOS \ Demo \ CORTEX_STM32F103_Keil \, copie o arquivo FreeRTOSConfig.h.Após todas as manipulações, o seguinte deve acontecer:
Está tudo pronto para copiar os arquivos RTOS para o projeto. Crie uma pasta FreeRTOS na pasta do projeto.Na pasta FreeRTOSv9.0.0 \ FreeRTOS \ Source \, copie todos os arquivos * .s para a pasta FreeRTOS criada. Lá, copiamos a pasta de inclusão.Na pasta FreeRTOSv9.0.0 \ FreeRTOS \ Source \ portable \ RVDS \ ARM_CM3 \, copie os arquivos * .s e * .h para os locais correspondentes na pasta FreeRTOS do nosso projeto.Na pasta FreeRTOSv9.0.0 \ FreeRTOS \ Source \ portable \ MemMang \, copie o arquivo heap_2.c.Na pasta FreeRTOSv9.0.0 \ FreeRTOS \ Demo \ CORTEX_STM32F103_Keil \, copie o arquivo FreeRTOSConfig.h.Após todas as manipulações, o seguinte deve acontecer:
 Em seguida, precisamos adicionar os arquivos aos grupos apropriados no projeto e também criar o arquivo main.cc com o texto principal do programa.Como resultado, a seguinte estrutura do projeto deve ser obtida.
Em seguida, precisamos adicionar os arquivos aos grupos apropriados no projeto e também criar o arquivo main.cc com o texto principal do programa.Como resultado, a seguinte estrutura do projeto deve ser obtida. Para que o projeto seja compilado em suas configurações, você deve especificar todos os caminhos para os arquivos * .h, além de registrar a diretiva USE_STDPERIPH_DRIVER.
Para que o projeto seja compilado em suas configurações, você deve especificar todos os caminhos para os arquivos * .h, além de registrar a diretiva USE_STDPERIPH_DRIVER. Agora resta alterar várias linhas no arquivo FreeRTOSConfig.h, para a operação correta:
Agora resta alterar várias linhas no arquivo FreeRTOSConfig.h, para a operação correta:#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 ) )
E adicione as seguintes linhas após #define FREERTOS_CONFIG_H#define xPortSysTickHandler SysTick_Handler
#define xPortPendSVHandler PendSV_Handler
#define vPortSVCHandler SVC_Handler
Depois disso, no arquivo main.c, escrevemos o programa mais simples para os LEDs piscando.#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();
}
Agora você pode montar o projeto e preencher o firmware no microcontrolador. Após a reinicialização, observe os LEDs piscando.