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.
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:
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:
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.
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.