FreeRTOS na Nucleo F767

FreeRTOS na Nucleo F767

FreeRTOS na Nucleo144-F767ZIT6

Projekt tworzę w STM32CubeIDE za pomocą MX.

1. Konfiguracja

1. Zegary

Zegary ustawiamy na maksymalną częstotliwość.
W zależności od zastowowanego modułu (w Nucleo mamy doprowadzony zewnętrzny sygnał 8MHz z ST-Linka) ustawiamy źródło zegara.
W System Core → SYS → Timebase Source ustawiamy źródło na timer TIM6 lub TIM7 (są to najprostrze timery rzadko uzywane)

2. Peryferia

Dla zadania ustawiam trzy LEDy (w Nucleo144-F767 są trzy diody LED, czerwona, zielona i niebieska) Domyślnie w Nucleo są one już ustawione, dodatkowo jest też skonfigurowany przycisk użytkownika.

3. RTOS

Przechodzimy do zakładki Middleware and Software Pakcs → FREERTOS i tutaj: Interface ustawiamy CMSIS_V2
Task and Quenes: Tutaj dodajemy zadania oraz kolejki danych. Także ustawiamy priorytety zadań ich nazwy, nazwę funkcji startu zadania, stos.
Queues używamy do przekazywania danych pomiędzy zadaniami.

2. Kod

void StartTask1(void *argument);
void StartTask2(void *argument);
void StartTask3(void *argument);
void StartTask4(void *argument);
  /* creation of Task1 */
  Task1Handle = osThreadNew(StartTask1, NULL, &Task1_attributes);

  /* creation of Task2 */
  Task2Handle = osThreadNew(StartTask2, NULL, &Task2_attributes);

  /* creation of Task3 */
  Task3Handle = osThreadNew(StartTask3, NULL, &Task3_attributes);

  /* creation of Task4 */
  Task4Handle = osThreadNew(StartTask4, NULL, &Task4_attributes);
  /* Start scheduler */
  osKernelStart();

Zadania:
Zadanie 1

void StartTask1(void *argument)
{
  /* USER CODE BEGIN 5 */
  /* Infinite loop */
  for(;;)
  {
    printf("Task-1\n");
    HAL_GPIO_TogglePin(LED_RED_GPIO_Port, LED_RED_Pin);
    osDelay(1000);
  }
  /* USER CODE END 5 */
}

Zadanie 2

void StartTask2(void *argument)
{
  /* USER CODE BEGIN StartTask2 */
  /* Infinite loop */
  for(;;)
  {
    printf("Task-2\n");
    HAL_GPIO_TogglePin(LED_BLUE_GPIO_Port, LED_BLUE_Pin);
    osDelay(500);

  }
  /* USER CODE END StartTask2 */
}    

Zadanie 3

void StartTask3(void *argument)
{
  /* USER CODE BEGIN StartTask3 */
  /* Infinite loop */
  for(;;)
  {
    printf("Task-3\n");
    volatile uint32_t wait = 50000000;
    HAL_GPIO_TogglePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin);
    osDelay(200);
    while (wait--);
  }
  /* USER CODE END StartTask3 */
}

Zadanie 4

void StartTask4(void *argument)
{
  /* USER CODE BEGIN StartTask4 */
  /* Infinite loop */
  for(;;)
  {
    printf("Task-4\n");
    osDelay(1000);
    osThreadSuspend(Task3Handle);
    osDelay(5000);
    osThreadResume(Task3Handle);
  }
  /* USER CODE END StartTask4 */
}