Установка FreeRTOS для Stm32vlDiscovery

Доброго времени суток.
Разбираясь с программированием микроконтроллеров Stm32, решил попробовать установить (операционную систему реального времени) ОСРВ — FreeRTOS и столкнулся с рядом трудностей. В интернете есть множество статей, но внятной инструкции я не нашёл, поэтому всех заинтересовавшихся прошу под кат.
Итак для начала определимся что необходимо иметь:

  • Отладочная плата Stm32VLDiscovery
  • Установленную IDE Keil ARM 5 и выше
  • Желание раразбираться в новом


Если вы уже разрабатывали что-либо для семейства STM32F1x в Keil, то можете пропустить этот абзац. Для начала необходимо установить пакеты для разработки для семейства STM32F1x, это делается следующим образом:

  1. Запускаем Keil.
  2. Надимаем на кнопку Pack Installer в панели 6d67a9af00624dc786a107933c5c722b.png
  3. В открывшемся окне нажимаем кнопку Check For Updates (ждём обновления списка пакетов)
  4. Выбираем в дереве STMicroelectronics→STM32F1 Series→STM32F100 и устанавливаем все пакеты


На этом подготовка среды разработки закончена.
Переходим непосредственно к созданию проекта с использованием FreeRTOS.
Первое что необходимо сделать это скачать свежий дистрибутив ОСРВ с официального сайта www.freertos.org, на момент написания статьи последней версией была FreeRTOSv9.0.0. Итак мы получили внушительный архив, распаковываем его в любое место (сразу скажу что 99% из него нам не понадобится, так что не пугайтесь рамера получившейся папки у меня более 200 Мб).

Теперь нам необходимо создать новый проект в Keil.

0b34ac02ebc04408a399973a47ba5600.png

Я назвал его FreeRTOSDemo, вы можете выбрать любое подходящее название, главное чтобы в пути размещения проекта не было пробелов и русских букв.
Теперь нам необходимо выбрать наш чип, я тестировал на отладочной плате STM32VLDiscovery c чипом STM32F100RB соответственно выбирал именно его.

aa73cf60537b41f59fc925c319a5d366.png

39423a40140e4c04a2e436fab7838252.png

После выбора чипа, необходимо выбрать библиотеки которые мы будем использовать. Нам понадобится библиотека CMSIS и StdPeriph. На рисунках далее показан минимальный выбор компонентов, чтобы проверить работу ОСРВ и помигать диодиками (это касается библиотеки StdPeriph, CMSIS нужна обязательно).

15d6b5068bd84793870173363e32b889.png

37e83ebc9c1440909e267b84adbf3a32.png

22aaaa9fa106492983f71f4a07769e03.png

Итак мы создали проект, он выглядит следующим образом:

1c634433f7484467abe7a43253ec00eb.png

Далее для удобства в проекте создаем несколько групп, чтобы в последствии не получилась мешанина из файлов.

41d9cbe30342492eb36800a61b5c5a92.png

Всё готово к копированию файлов ОСРВ в проект. Создадим папку FreeRTOS в папке проекта.
Из папки FreeRTOSv9.0.0\FreeRTOS\Source\ копируем все *.с файлы в созданную папку FreeRTOS. Туда же копируем папку include.
Из папки FreeRTOSv9.0.0\FreeRTOS\Source\portable\RVDS\ARM_CM3\ копируем файлы *.с и *.h в соответвующие им места папки FreeRTOS нашего проекта.
Из папки FreeRTOSv9.0.0\FreeRTOS\Source\portable\MemMang\ копируем файл heap_2.c.
Из папки FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_STM32F103_Keil\ копируем файл FreeRTOSConfig.h.
После всех манипуляций должно получится следующее:

c26ede939e704f75925f0100db70ed29.png

a85aefe614874d07897f357c50bf8b9c.png

Далее нам необходимо добавить файлы в соответствующие группы в проекте, а также создать файл main.c c основным текстом программы.
В итоге должна получится следующая структура проекта.

da08db1981bd499180890344aa68925b.png

Для того чтобы проект компилировался в его настройках необходимо указать все пути к *.h файлам, а также прописать дерективу USE_STDPERIPH_DRIVER.

43646a0ec578405a9f8f55f81981770c.png

Теперь осталось изменить несколько строк в файле FreeRTOSConfig.h, для корректной работы:

#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 ) )


И добавляем следующие строки после #define FREERTOS_CONFIG_H

#define xPortSysTickHandler SysTick_Handler
#define xPortPendSVHandler PendSV_Handler
#define vPortSVCHandler SVC_Handler


После этого в файле main.c пишем простейшую программу для мигания светодиодами.

#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();
}

Теперь можно собрать проект и залить прошивку в микроконтроллер, после перезагрузки наблюдать мигающие светодиоды.

© Geektimes