Freertos документация на русском

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

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

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

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

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

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

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


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



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

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

Всё готово к копированию файлов ОСРВ в проект. Создадим папку 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.
После всех манипуляций должно получится следующее:


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

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


Теперь осталось изменить несколько строк в файле 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(); }
Теперь можно собрать проект и залить прошивку в микроконтроллер, после перезагрузки наблюдать мигающие светодиоды.

STM32F4Discovery

Очень сильная плата, как по мощности процессора так и по количеству периферийного оборудования. Процессор класса STM32F4 имеет высокую скорость работы, множество периферии вроде контроллеров памяти/дисплеев/камеры и всевозможными USB, CAN и прочими интерфейсами, а также полноценные модули FPU и DSP. Замечательный процессор, на нём сделано довольно много из моих приборов.

  • Отладчик — ST-Link/V2 с расширенным SWD-коннектором
  • Процессор — STM32F407VGT6 (168МГц, 1МБ флеш, 192кБ RAM)
  • 2 кнопки — юзерская и резет
  • 4 светодиода
  • сменный тактовый кварц
  • 100 контактов на гребёнке, из них 80 контактов ввода-вывода
  • перемычка для измерения тока
  • MEMS-акселерометр LIS302DL
  • Цифровой микрофон MP45DT02
  • Аудио-АЦП CS43L22 с усилителем D-класса
  • micro-USB-коннектор

Конечно, стоит дороже — но и возможностей имеет куда больше. Прекрасная плата, удобная и мощная. В основном на ней я проводил эксперименты со звуком, с шинами CAN и USB, и акселерометром. Наличие DSP-ядра даёт возможность производить цифровую обработку аудиосигналов и навигации. Помимо перечисленной периферии, на кристалле присутствуют также модули вычисления CRC (контрольные суммы), HASH (хеш данных), CRYPT (криптография) и RNG (генератор случайных чисел).

Список прилагающихся примеров так же обширен. Из минусов — разве что не очень удобный micro-USB.

Скачать примеры для STM32F4Discovery.

STM32F3Discovery

Столь же хорошая плата, но с ещё более новым процессором серии STM32F3, и явной направленностью на навигационные применения и Sensor Fusion. Похоже, её сделали на росте популярности квадрокоптеров, которым нужен как раз такой набор датчиков положения. Также, видимо, инженеры услышали просьбы разработчиков и сделали USB в виде обычного mini-USB.

  • Отладчик — ST-Link/V2 с расширенным SWD-коннектором
  • Процессор — STM32F303VCT6 (72МГц, 256кБ флеш, 48кБ RAM)
  • 2 кнопки — юзерская и резет
  • 8 светодиодов
  • 100 контактов на гребёнке, из них 86 контактов ввода-вывода
  • перемычка для измерения тока
  • MEMS-акселерометр/магнитометр LSM303DLHC
  • MEMS-гироскоп L3GD20
  • mini-USB-коннектор

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

К возможностям процессора стоит добавить умножение за 1 такт и железное деление, модули вычисления CRC (контрольные суммы), HASH (хеш данных), CRYPT (криптография) и RNG (генератор случайных чисел), а также расширенные аналоговые возможности — 4 ОУ с изменяемым коэффициентом усиления, увеличенное количество (4 штуки) 12-бит АЦП и 7 компараторов. Это делает STM32F3 настоящим DSP, с отличным аналоговым интерфейсом.

На этой плате я также сделал довольно много приборов.

Скачать примеры для STM32F3Discovery.