Instalando o FreeRTOS para Stm32vlDiscovery

Bom dia
Compreendendo 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:
  1. Lançamos Keil.
  2. Clique no botão Instalador de pacotes no painel
  3. Na janela que se abre, clique no botão Verificar atualizações (estamos aguardando a atualização da lista de pacotes)
  4. 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.

Source: https://habr.com/ru/post/pt399907/


All Articles