Первое приложение на ChibiOS, мигаем светодиодом

Приложение BLINKER, версия ChibiOS 2.x.
Настало время написать первое приложение на ChibiOS под STM.
Для этого создадим файл main.c и начнём.

Подключим заголовочные файлы ОС, периферии и микроконтроллёра:

#include <ch.h>
#include <hal.h>
#include <stm32f10x.h> 

Создадим поток, который будет мигать светодиодом:

static WORKING_AREA(waBlinker,128);
static msg_t blinker(void*arg){
(void) arg;
chRegSetThreadName("blinker");
while(TRUE){
palTogglePad(GPIOB, GPIOB_ARMKA_LED);
chThdSleepMilliseconds(500);
}
return0;
}

Инициализируем операционную систему и периферию:

halInit();
chSysInit();

Запустим поток для мигания светодиодом:

chThdCreateStatic(waBlinker,
sizeof(waBlinker),
NORMALPRIO, /* приоритет */
blinker, /* функция потока */
NULL); /* параметры потока */

А главный поток приложения загоним в паузу:

while(TRUE){
chThdSleepMilliseconds(5000);
}

Вот как это будет выглядеть в итоге:


#include <ch.h>
#include <hal.h>
#include <stm32f10x.h>

static WORKING_AREA(waBlinker,128);//Этот макрос резервирует 128 байт стека для потока
static msg_t blinker(void*arg){
(void) arg;
chRegSetThreadName("blinker");//имя потока
while(TRUE){ //бесконечный цикл
palTogglePad(GPIOB, GPIOB_ARMKA_LED);//инвертируем выход сетодиода
chThdSleepMilliseconds(500);//поток уходит в сон на 0,5сек

}
}
int main(void){
//Инициализируем операционную систему и периферию
halInit();
chSysInit();
/*стартуем поток*/
chThdCreateStatic(waBlinker,sizeof(waBlinker), NORMALPRIO, blinker, NULL);

while(TRUE){//бесконечный цикл
chThdSleepMilliseconds(5000);//поток уходит в сон на 5сек
}
}

В приложении у нас будет два потока:

  • Главный поток, который будет спать по пять секунд;
  • Вспомогательный поток, который будет менять состояние светодиода каждые полсекунды.